qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] qdev: Reset hotplugged devices


From: Anthony Liguori
Subject: Re: [Qemu-devel] [PATCH] qdev: Reset hotplugged devices
Date: Fri, 20 Aug 2010 10:56:57 -0500
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.11) Gecko/20100713 Lightning/1.0b1 Thunderbird/3.0.6

On 08/20/2010 10:47 AM, Markus Armbruster wrote:
Alex Williamson<address@hidden>  writes:

On Fri, 2010-08-20 at 11:00 +0200, Markus Armbruster wrote:
Alex Williamson<address@hidden>  writes:

Several devices rely on their reset() function being called to
initialize device state, e1000 and rtl8139 in particular.  When
the device is hot added, the reset doesn't occur, often leaving
the device in an unusable state.  Adding a call to reset() after
init() for hotplugged devices puts the device in the expected
state for the guest.

Signed-off-by: Alex Williamson<address@hidden>
---

  0.13 candidate?

  hw/qdev.c |    3 +++
  1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/hw/qdev.c b/hw/qdev.c
index e99c73f..b156272 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -278,6 +278,9 @@ int qdev_init(DeviceState *dev)
          qdev_free(dev);
          return rc;
      }
+    if (dev->hotplugged) {
+        qdev_reset(dev);
+    }
      qemu_register_reset(qdev_reset, dev);
      if (dev->info->vmsd) {
          vmstate_register_with_alias_id(dev, -1, dev->info->vmsd, dev,
qdev_reset() isn't necessary when !dev->hotplugged, because then
qemu_system_reset() will run shortly, which will call qdev_reset().
Correct?
Yes, exactly.
Hmm.  "qdev_init() automatically calls qdev_reset() if hotplug" feels
needlessly complicated.  I'd prefer qdev_init() to call it always or
never.

If "always", we reset twice for cold-plug.  Is that bad?

If "never", we need to reset somewhere else for hot-plug.  What about
do_device_add()?

The real problem is how we do reset. We shouldn't register a reset handler for every qdev device but rather register a single reset handler that walks the device tree and calls reset on every reachable device.

Then we can always call reset in init() and there's no need to have a dev->hotplugged check. The qdev device tree reset handler should not be registered until *after* we call qemu_system_reset() after creating the device model which will ensure that we don't do a double reset.

Regards,

Anthony Liguori





reply via email to

[Prev in Thread] Current Thread [Next in Thread]