qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Gerd Hoffmann <kraxel@redhat.com>
To: "Daniel P. Berrange" <berrange@redhat.com>
Cc: Hans de Goede <hdegoede@redhat.com>,
	qemu-devel@nongnu.org, Juan Quintela <quintela@redhat.com>
Subject: Re: [Qemu-devel] VMState assertion for USB devices on multiple buses
Date: Mon, 22 Aug 2011 09:21:03 +0200	[thread overview]
Message-ID: <4E52035F.1060803@redhat.com> (raw)
In-Reply-To: <20110818180441.GB2973@redhat.com>

[-- Attachment #1: Type: text/plain, Size: 1226 bytes --]

On 08/18/11 20:04, Daniel P. Berrange wrote:
> I've been experimenting with multiple USB2 buses, and device physical port
> addressing. It seems if you have 2 devices of the same type on the same
> port, but in different buses, you get a bogus VMState assertion failure

>      qemu-system-x86_64: savevm.c:1260: vmstate_register_with_alias_id: Assertion `!se->compat || se->instance_id == 0' failed.
>      Aborted

> AFAICT, the problem is that the 'se->idstr' field in the SaveStateEntry
> struct is not getting a unique enough value.
>
> Both the USB devices get idstr named   "1/usb-ccid", which IIUC is a
> combination of the device type and the port number.

Indeed.

> IMHO, it needs to have the USB bus name in there too eg. in this
> example it should have been
>
>      ehci0.0/1/usb-ccid
>      ehci1.0/1/usb-ccid

I assumed the savevm code walks up the device path and creates a unique 
name by prefixing the string with the parents pci address, but it 
doesn't :-(

We can do that outself though, see attached patch.
That gives us IDs like this:

   0000:00:01.2/uhci              (hcd, unchanged)
   0000:00:01.2/1/usb-ptr         (usb devs, now with hcd pci addr)

Juan?  Does that look sane?

cheers,
   Gerd

[-- Attachment #2: fix --]
[-- Type: text/plain, Size: 874 bytes --]

diff --git a/hw/usb-bus.c b/hw/usb-bus.c
index c0bbc7c..477d57f 100644
--- a/hw/usb-bus.c
+++ b/hw/usb-bus.c
@@ -342,7 +342,20 @@ static void usb_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent)
 static char *usb_get_dev_path(DeviceState *qdev)
 {
     USBDevice *dev = DO_UPCAST(USBDevice, qdev, qdev);
-    return g_strdup(dev->port->path);
+    DeviceState *hcd = qdev->parent_bus->parent;
+    char *id = NULL;
+
+    if (hcd && hcd->parent_bus && hcd->parent_bus->info->get_dev_path) {
+        id = hcd->parent_bus->info->get_dev_path(hcd);
+    }
+    if (id) {
+        int len = strlen(id)+strlen(dev->port->path)+2;
+        char *ret = g_malloc(len);
+        snprintf(ret, len, "%s/%s", id, dev->port->path);
+        return ret;
+    } else {
+        return g_strdup(dev->port->path);
+    }
 }
 
 static char *usb_get_fw_dev_path(DeviceState *qdev)

      reply	other threads:[~2011-08-22  7:21 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-08-18 18:04 [Qemu-devel] VMState assertion for USB devices on multiple buses Daniel P. Berrange
2011-08-22  7:21 ` Gerd Hoffmann [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4E52035F.1060803@redhat.com \
    --to=kraxel@redhat.com \
    --cc=berrange@redhat.com \
    --cc=hdegoede@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).