From patchwork Tue Sep 11 07:51:44 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: pingfan liu X-Patchwork-Id: 183042 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 5CE3B2C0089 for ; Tue, 11 Sep 2012 17:55:46 +1000 (EST) Received: from localhost ([::1]:57274 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TBLHN-00089y-1l for incoming@patchwork.ozlabs.org; Tue, 11 Sep 2012 03:53:05 -0400 Received: from eggs.gnu.org ([208.118.235.92]:40416) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TBLGr-0006uc-Hg for qemu-devel@nongnu.org; Tue, 11 Sep 2012 03:52:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TBLGj-0007J2-Jz for qemu-devel@nongnu.org; Tue, 11 Sep 2012 03:52:33 -0400 Received: from mail-ob0-f173.google.com ([209.85.214.173]:38954) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TBLGj-0007Gb-Eh for qemu-devel@nongnu.org; Tue, 11 Sep 2012 03:52:25 -0400 Received: by mail-ob0-f173.google.com with SMTP id ta14so286204obb.4 for ; Tue, 11 Sep 2012 00:52:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; bh=JpJHc/CzmtlWIBRgat15CV8gj0if2KEeugCvTeYNSGg=; b=Omlw8AYIyDHHruxKhqMoXXpNE4LMCLPB13Hoi9Ja0sGZZnUhq4wmja06uUrfv84gdY fnp5bqyC7hp4Q8tF/PlDp4pkRR1NtZPuGFBkL6DRaMhqoJptKL0Qf8BvnKsBx0TU/usM AoP3/iBZznz9rlO2GWweUEu081jxXa/D+YISZ0+A2pa4jmTNsKJTnNXLhzhATNwF/zSe IIsL8JYQ84MSq0q8ztbNEpGKUiqkrwokDvdYGXuH9JReKmAh7Jf5sxGLpTNkD71Ko+qM P304MPyE4hLxNVO1XURqq2fPQOXJWaW/Y3Z+az0knYEiK/n5Xz2w9khKRwxKE3GUpIZr +ZoA== Received: by 10.60.13.232 with SMTP id k8mr16607010oec.81.1347349945022; Tue, 11 Sep 2012 00:52:25 -0700 (PDT) Received: from localhost ([202.108.130.138]) by mx.google.com with ESMTPS id q3sm12298117oef.0.2012.09.11.00.52.21 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 11 Sep 2012 00:52:24 -0700 (PDT) From: Liu Ping Fan To: qemu-devel@nongnu.org Date: Tue, 11 Sep 2012 15:51:44 +0800 Message-Id: <1347349912-15611-4-git-send-email-qemulist@gmail.com> X-Mailer: git-send-email 1.7.4.4 In-Reply-To: <1347349912-15611-1-git-send-email-qemulist@gmail.com> References: <1347349912-15611-1-git-send-email-qemulist@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.85.214.173 Cc: Jan Kiszka , Marcelo Tosatti , Avi Kivity , Anthony Liguori , Paolo Bonzini Subject: [Qemu-devel] [PATCH V3 03/11] hotplug: introduce qdev_unplug_complete() to remove device from views 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 From: Liu Ping Fan 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 b5a52ac..73df046 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -104,6 +104,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. */ @@ -193,6 +201,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 d699194..aeae29e 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; @@ -161,6 +161,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);