From patchwork Wed Nov 17 04:50:22 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Isaku Yamahata X-Patchwork-Id: 71515 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 6F019B7188 for ; Wed, 17 Nov 2010 15:57:28 +1100 (EST) Received: from localhost ([127.0.0.1]:50008 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PIa5F-0007wC-Pu for incoming@patchwork.ozlabs.org; Tue, 16 Nov 2010 23:57:25 -0500 Received: from [140.186.70.92] (port=34665 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PIZye-0004Te-2v for qemu-devel@nongnu.org; Tue, 16 Nov 2010 23:50:39 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PIZyb-0000mU-CH for qemu-devel@nongnu.org; Tue, 16 Nov 2010 23:50:35 -0500 Received: from mail.valinux.co.jp ([210.128.90.3]:55528) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PIZya-0000m3-Sm for qemu-devel@nongnu.org; Tue, 16 Nov 2010 23:50:33 -0500 Received: from ps.local.valinux.co.jp (vagw.valinux.co.jp [210.128.90.14]) by mail.valinux.co.jp (Postfix) with SMTP id 0BA3B27E5F; Wed, 17 Nov 2010 13:50:29 +0900 (JST) Received: (nullmailer pid 25294 invoked by uid 1000); Wed, 17 Nov 2010 04:50:27 -0000 From: Isaku Yamahata To: qemu-devel@nongnu.org Date: Wed, 17 Nov 2010 13:50:22 +0900 Message-Id: <2a985d932722533a972751a2c76d1f53a16840e4.1289969012.git.yamahata@valinux.co.jp> X-Mailer: git-send-email 1.7.1.1 In-Reply-To: References: In-Reply-To: References: X-Virus-Scanned: clamav-milter 0.95.2 at va-mail.local.valinux.co.jp X-Virus-Status: Clean X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) Cc: skandasa@cisco.com, Anthony Liguori , etmartin@cisco.com, wexu2@cisco.com, mst@redhat.com, yamahata@valinux.co.jp Subject: [Qemu-devel] [PATCH 2/7] qdev: reset qdev along with qdev tree X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Anthony Liguori This patch changes the reset handling so that qdev has no knowledge of the global system reset. Instead, a new bus/device level function is introduced that allows all devices/buses on the bus/device to be reset using a depth first transversal. N.B. we have to expose the implicit system bus because we have various hacks that result in an implicit system bus existing. Instead, we ought to have an explicitly created system bus that we can trigger reset from. That's a topic for a future patch though. Signed-off-by: Anthony Liguori Signed-off-by: Isaku Yamahata --- hw/qdev.c | 28 +++++++++++++++++++--------- hw/qdev.h | 4 ++++ vl.c | 1 + 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/hw/qdev.c b/hw/qdev.c index 11d845a..92ccc8d 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -257,13 +257,6 @@ DeviceState *qdev_device_add(QemuOpts *opts) return qdev; } -static void qdev_reset(void *opaque) -{ - DeviceState *dev = opaque; - if (dev->info->reset) - dev->info->reset(dev); -} - /* Initialize a device. Device properties should be set before calling this function. IRQs and MMIO regions should be connected/mapped after calling this function. @@ -279,7 +272,6 @@ int qdev_init(DeviceState *dev) qdev_free(dev); return rc; } - qemu_register_reset(qdev_reset, dev); if (dev->info->vmsd) { vmstate_register_with_alias_id(dev, -1, dev->info->vmsd, dev, dev->instance_id_alias, @@ -308,6 +300,25 @@ int qdev_unplug(DeviceState *dev) return dev->info->unplug(dev); } +static int qdev_reset_one(DeviceState *dev, void *opaque) +{ + if (dev->info->reset) { + dev->info->reset(dev); + } + + return 0; +} + +BusState *sysbus_get_default(void) +{ + return main_system_bus; +} + +void qbus_reset_all(BusState *bus) +{ + qbus_walk_children(bus, qdev_reset_one, NULL, NULL); +} + /* can be used as ->unplug() callback for the simple cases */ int qdev_simple_unplug_cb(DeviceState *dev) { @@ -351,7 +362,6 @@ void qdev_free(DeviceState *dev) if (dev->opts) qemu_opts_del(dev->opts); } - qemu_unregister_reset(qdev_reset, dev); QLIST_REMOVE(dev, sibling); for (prop = dev->info->props; prop && prop->name; prop++) { if (prop->info->free) { diff --git a/hw/qdev.h b/hw/qdev.h index 0cf50b1..2eb1f34 100644 --- a/hw/qdev.h +++ b/hw/qdev.h @@ -185,10 +185,14 @@ int qbus_walk_children(BusState *bus, qdev_walkerfn *devfn, qbus_walkerfn *busfn, void *opaque); int qdev_walk_children(DeviceState *dev, qdev_walkerfn *devfn, qbus_walkerfn *busfn, void *opaque); +void qbus_reset_all(BusState *bus); void qbus_free(BusState *bus); #define FROM_QBUS(type, dev) DO_UPCAST(type, qbus, dev) +/* This should go away once we get rid of the NULL bus hack */ +BusState *sysbus_get_default(void); + /*** monitor commands ***/ void do_info_qtree(Monitor *mon); diff --git a/vl.c b/vl.c index c58583d..135fdeb 100644 --- a/vl.c +++ b/vl.c @@ -2976,6 +2976,7 @@ int main(int argc, char **argv, char **envp) exit(1); } + qemu_register_reset((void *)qbus_reset_all, sysbus_get_default()); qemu_system_reset(); if (loadvm) { if (load_vmstate(loadvm) < 0) {