From patchwork Tue May 15 15:26:37 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anthony PERARD X-Patchwork-Id: 159366 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id D7763B6FC3 for ; Wed, 16 May 2012 01:31:32 +1000 (EST) Received: from localhost ([::1]:57834 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SUJik-00077x-Mp for incoming@patchwork.ozlabs.org; Tue, 15 May 2012 11:31:30 -0400 Received: from eggs.gnu.org ([208.118.235.92]:56723) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SUJi6-0006pY-DS for qemu-devel@nongnu.org; Tue, 15 May 2012 11:31:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SUJhQ-0006PF-CE for qemu-devel@nongnu.org; Tue, 15 May 2012 11:30:49 -0400 Received: from smtp02.citrix.com ([66.165.176.63]:52999) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SUJhP-0006Ha-Mq for qemu-devel@nongnu.org; Tue, 15 May 2012 11:30:08 -0400 X-IronPort-AV: E=Sophos;i="4.75,595,1330923600"; d="scan'208";a="194910355" Received: from ftlpmailmx01.citrite.net ([10.13.107.65]) by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5; 15 May 2012 11:27:12 -0400 Received: from ukmail1.uk.xensource.com (10.80.16.128) by smtprelay.citrix.com (10.13.107.65) with Microsoft SMTP Server id 8.3.213.0; Tue, 15 May 2012 11:27:11 -0400 Received: from [10.80.3.61] (helo=perard.uk.xensource.com) by ukmail1.uk.xensource.com with esmtp (Exim 4.69) (envelope-from ) id 1SUJeZ-00026H-Es; Tue, 15 May 2012 16:27:11 +0100 From: Anthony PERARD To: QEMU-devel Date: Tue, 15 May 2012 16:26:37 +0100 Message-ID: <1337095599-28836-3-git-send-email-anthony.perard@citrix.com> X-Mailer: git-send-email 1.7.2.5 In-Reply-To: <1337095599-28836-1-git-send-email-anthony.perard@citrix.com> References: <1337095599-28836-1-git-send-email-anthony.perard@citrix.com> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 66.165.176.63 Cc: Anthony PERARD , Stefano Stabellini , "Michael S. Tsirkin" , Anthony Liguori , Xen Devel Subject: [Qemu-devel] [PATCH 2/4] qdev: Introduce qdev_force_unplug. X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org This function will be use to force a device to be ejected without the guest cooperation. Signed-off-by: Anthony PERARD --- hw/qdev.c | 23 ++++++++++++++++++++--- hw/qdev.h | 3 +++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/hw/qdev.c b/hw/qdev.c index 6a8f6bd..c95d4c2 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -184,24 +184,41 @@ void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id, dev->alias_required_for_version = required_for_version; } -void qdev_unplug(DeviceState *dev, Error **errp) +static void qdev_unplug_common(DeviceState *dev, Error **errp, bool force) { DeviceClass *dc = DEVICE_GET_CLASS(dev); + qdev_event unplug; if (!dev->parent_bus->allow_hotplug) { error_set(errp, QERR_BUS_NO_HOTPLUG, dev->parent_bus->name); return; } - assert(dc->unplug != NULL); + + if (force) { + unplug = dc->force_unplug; + } else { + unplug = dc->unplug; + } + assert(unplug != NULL); qdev_hot_removed = true; - if (dc->unplug(dev) < 0) { + if (unplug(dev) < 0) { error_set(errp, QERR_UNDEFINED_ERROR); return; } } +void qdev_force_unplug(DeviceState *dev, Error **errp) +{ + qdev_unplug_common(dev, errp, true); +} + +void qdev_unplug(DeviceState *dev, Error **errp) +{ + qdev_unplug_common(dev, errp, false); +} + static int qdev_reset_one(DeviceState *dev, void *opaque) { device_reset(dev); diff --git a/hw/qdev.h b/hw/qdev.h index 4e90119..404c560 100644 --- a/hw/qdev.h +++ b/hw/qdev.h @@ -54,6 +54,7 @@ typedef struct DeviceClass { /* Private to qdev / bus. */ qdev_initfn init; qdev_event unplug; + qdev_event force_unplug; qdev_event exit; BusInfo *bus_info; } DeviceClass; @@ -150,6 +151,8 @@ void qdev_init_nofail(DeviceState *dev); void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id, int required_for_version); void qdev_unplug(DeviceState *dev, Error **errp); +/* Unplug a device without the guest cooperation. */ +void qdev_force_unplug(DeviceState *dev, Error **errp); void qdev_free(DeviceState *dev); int qdev_simple_unplug_cb(DeviceState *dev); void qdev_machine_creation_done(void);