From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:52621) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TkdV8-0008Eg-Gh for qemu-devel@nongnu.org; Mon, 17 Dec 2012 11:25:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TkdV3-00088g-Ja for qemu-devel@nongnu.org; Mon, 17 Dec 2012 11:25:10 -0500 Received: from mail-ia0-f173.google.com ([209.85.210.173]:47348) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TkdV3-00087U-Bl for qemu-devel@nongnu.org; Mon, 17 Dec 2012 11:25:05 -0500 Received: by mail-ia0-f173.google.com with SMTP id w21so5709484iac.4 for ; Mon, 17 Dec 2012 08:25:04 -0800 (PST) Sender: Paolo Bonzini From: Paolo Bonzini Date: Mon, 17 Dec 2012 17:24:36 +0100 Message-Id: <1355761490-10073-2-git-send-email-pbonzini@redhat.com> In-Reply-To: <1355761490-10073-1-git-send-email-pbonzini@redhat.com> References: <1355761490-10073-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 01/15] qdev: do not reset a device until the parent has been initialized List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: aliguori@us.ibm.com, mst@redhat.com When a device creates a bus and more devices as part of its init callback, the child device could be reset while the parent is still only partly initialized. In this case, the right thing to do is to delay resetting the child. Do not do it at all in qdev_init, instead use qdev_reset_all to reset already-created devices when the state goes from CREATED to INITIALIZED. This happens when hotplugging a usb-storage device. Without this patch, initialization of a hotplugged usb-storage device would run in pre-order. Initialization of a coldplugged usb-storage device would run according to qdev_reset_all semantics (pre-order right now, post-order later in the series). This patch makes things consistent. Signed-off-by: Paolo Bonzini --- hw/qdev.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/hw/qdev.c b/hw/qdev.c index 599382c..2fdf4ac 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -176,8 +176,9 @@ int qdev_init(DeviceState *dev) dev->alias_required_for_version); } dev->state = DEV_STATE_INITIALIZED; - if (dev->hotplugged) { - device_reset(dev); + if (dev->hotplugged && + dev->parent_bus->parent->state == DEV_STATE_INITIALIZED) { + qdev_reset_all(dev); } return 0; } -- 1.8.0.2