From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:52834) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TScbV-00065L-R3 for qemu-devel@nongnu.org; Sun, 28 Oct 2012 19:49:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TScbU-0003wM-IP for qemu-devel@nongnu.org; Sun, 28 Oct 2012 19:49:17 -0400 Received: from e28smtp03.in.ibm.com ([122.248.162.3]:52351) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TScbT-0003ir-He for qemu-devel@nongnu.org; Sun, 28 Oct 2012 19:49:16 -0400 Received: from /spool/local by e28smtp03.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 29 Oct 2012 05:18:58 +0530 Received: from d28av01.in.ibm.com (d28av01.in.ibm.com [9.184.220.63]) by d28relay01.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q9SNmuab24969294 for ; Mon, 29 Oct 2012 05:18:56 +0530 Received: from d28av01.in.ibm.com (loopback [127.0.0.1]) by d28av01.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q9T5ImYk008361 for ; Mon, 29 Oct 2012 05:18:48 GMT From: Liu Ping Fan Date: Mon, 29 Oct 2012 07:48:42 +0800 Message-Id: <1351468127-15025-4-git-send-email-pingfank@linux.vnet.ibm.com> In-Reply-To: <1351468127-15025-1-git-send-email-pingfank@linux.vnet.ibm.com> References: <1351468127-15025-1-git-send-email-pingfank@linux.vnet.ibm.com> Subject: [Qemu-devel] [patch v5 3/8] hotplug: introduce qdev_unplug_complete() to remove device from views List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Peter Maydell , Stefan Hajnoczi , Marcelo Tosatti , Avi Kivity , Anthony Liguori , Jan Kiszka , Paolo Bonzini When device unplug has been ack by guest, we first remove it from memory to prevent incoming access from dispatcher. Then we isolate it from device composition tree Signed-off-by: Liu Ping Fan --- hw/qdev.c | 26 ++++++++++++++++++++++++++ hw/qdev.h | 3 ++- 2 files changed, 28 insertions(+), 1 deletions(-) diff --git a/hw/qdev.c b/hw/qdev.c index 9b9aba3..681e133 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -98,6 +98,14 @@ void qdev_set_parent_bus(DeviceState *dev, BusState *bus) bus_add_child(bus, dev); } +static void qdev_unset_parent(DeviceState *dev) +{ + BusState *b = dev->parent_bus; + + object_unparent(OBJECT(dev)); + bus_remove_child(b, dev); +} + /* Create a new device. This only initializes the device state structure and allows properties to be set. qdev_init should be called to initialize the actual device emulation. */ @@ -187,6 +195,24 @@ void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id, dev->alias_required_for_version = required_for_version; } +static int qdev_unmap(DeviceState *dev) +{ + DeviceClass *dc = DEVICE_GET_CLASS(dev); + if (dc->unmap) { + dc->unmap(dev); + } + return 0; +} + +void qdev_unplug_complete(DeviceState *dev, Error **errp) +{ + /* isolate from mem view */ + qdev_unmap(dev); + /* isolate from device tree */ + qdev_unset_parent(dev); + object_unref(OBJECT(dev)); +} + void qdev_unplug(DeviceState *dev, Error **errp) { DeviceClass *dc = DEVICE_GET_CLASS(dev); diff --git a/hw/qdev.h b/hw/qdev.h index c6ac636..71eb9ca 100644 --- a/hw/qdev.h +++ b/hw/qdev.h @@ -47,7 +47,7 @@ typedef struct DeviceClass { /* callbacks */ void (*reset)(DeviceState *dev); - + void (*unmap)(DeviceState *dev); /* device state */ const VMStateDescription *vmsd; @@ -160,6 +160,7 @@ 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); +void qdev_unplug_complete(DeviceState *dev, Error **errp); void qdev_free(DeviceState *dev); int qdev_simple_unplug_cb(DeviceState *dev); void qdev_machine_creation_done(void); -- 1.7.4.4