From patchwork Mon Nov 5 05:38:39 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: pingfan liu X-Patchwork-Id: 197150 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 7581B2C0093 for ; Mon, 5 Nov 2012 17:10:22 +1100 (EST) Received: from localhost ([::1]:37778 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TVFPU-0008TI-Tp for incoming@patchwork.ozlabs.org; Mon, 05 Nov 2012 00:39:44 -0500 Received: from eggs.gnu.org ([208.118.235.92]:46261) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TVFP2-0007cQ-2r for qemu-devel@nongnu.org; Mon, 05 Nov 2012 00:39:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TVFP1-0005fB-2j for qemu-devel@nongnu.org; Mon, 05 Nov 2012 00:39:15 -0500 Received: from mail-ob0-f173.google.com ([209.85.214.173]:37662) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TVFP0-0005Ov-U1 for qemu-devel@nongnu.org; Mon, 05 Nov 2012 00:39:15 -0500 Received: by mail-ob0-f173.google.com with SMTP id wc18so4916290obb.4 for ; Sun, 04 Nov 2012 21:39:14 -0800 (PST) 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=ZQShdVoNZSyzmyQM8LA/KHlFq3BTbR7c7ynZnQhDX7k=; b=kkjhMmQs0P1qLW1aCbkJfoxxDtZfXaD9DeWOi+YGGYSBGxyErOEJpNSKpTIJPW5b+Z zTJszmm5eHqxG/IPa75vdFTv0s19zyx8zwgZNdMCrU8IE6lVf0dUEMytsKtMeMu3sswz nJMBIH7EZZi4JaTB7ANpdpRhfSviNxdDcdbJ2hO8eDiMVlY+BRI7au2Sl0F2UvjVc3OR XfidKg7YcID4cGQf66O6dx39qzyM9WR3TO4TYCnlleVB0xyj5szt0yX9QGO/N21Hd+PU a/CyOpGzIbRgQ7TJ3217K7I9HHxgZvmuIbGRBjZNQK56kgYA06te7POO962UScnwiMPR xfzg== Received: by 10.60.21.137 with SMTP id v9mr6853670oee.98.1352093954652; Sun, 04 Nov 2012 21:39:14 -0800 (PST) Received: from localhost ([202.108.130.138]) by mx.google.com with ESMTPS id 9sm16865908obi.22.2012.11.04.21.39.12 (version=TLSv1/SSLv3 cipher=OTHER); Sun, 04 Nov 2012 21:39:13 -0800 (PST) From: Liu Ping Fan To: qemu-devel@nongnu.org Date: Mon, 5 Nov 2012 13:38:39 +0800 Message-Id: <1352093924-17598-4-git-send-email-qemulist@gmail.com> X-Mailer: git-send-email 1.7.4.4 In-Reply-To: <1352093924-17598-1-git-send-email-qemulist@gmail.com> References: <1352093924-17598-1-git-send-email-qemulist@gmail.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 209.85.214.173 Cc: Peter Maydell , Jan Kiszka , Marcelo Tosatti , Avi Kivity , Anthony Liguori , Stefan Hajnoczi , Paolo Bonzini Subject: [Qemu-devel] [PATCH v6 3/8] 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 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);