On Mon, Jul 20, 2026 at 10:12:27AM +0200, Thomas Huth wrote: > > Hi Gerd, > > since you originally wrote commit e058fa2dd599, could you maybe have a look > at this patch?
Not sure what is going on here, I'm confident I had tested this back then. Maybe behavior depends on the kind of usb device or libusb version or host os or a combination of those. If disconnect detection does not work reliable (as written in the gitlab issue) turning autoscan back on should indeed fix it and it should also not cause other problems. Commit message should be a bit more verbose so it is not needed to visit gitlab for additional info. With that: Acked-by: Gerd Hoffmann <[email protected]> take care, Gerd > > Thanks, > Thomas > > > On 12/09/2025 13.14, Timo Teräs wrote: > > This is partial revert of commit e058fa2dd599. > > > > The portion to immediately validate the device is kept, but this > > adds and enables again the autoscan functionality. This is needed > > to detect and relay USB device disconnect event to the guest. > > > > Fixes: e058fa2dd599 ("usb-host: add special case for bus+addr") > > Resolves: https://gitlab.com/qemu-project/qemu/-/issues/3111 > > Signed-off-by: Timo Teräs <[email protected]> > > --- > > hw/usb/host-libusb.c | 14 ++++---------- > > 1 file changed, 4 insertions(+), 10 deletions(-) > > > > diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c > > index > > b74670ae25696b5252f0d034cb9b759e338a050f..f0baf6b2f2d12fbf8feb5b788b46d3187028df58 > > 100644 > > --- a/hw/usb/host-libusb.c > > +++ b/hw/usb/host-libusb.c > > @@ -90,7 +90,6 @@ struct USBHostDevice { > > uint32_t iso_urb_frames; > > uint32_t options; > > uint32_t loglevel; > > - bool needs_autoscan; > > bool allow_one_guest_reset; > > bool allow_all_guest_resets; > > bool suppress_remote_wake; > > @@ -1211,7 +1210,6 @@ static void usb_host_realize(USBDevice *udev, Error > > **errp) > > #if LIBUSB_API_VERSION >= 0x01000107 && !defined(CONFIG_WIN32) > > if (s->hostdevice) { > > int fd; > > - s->needs_autoscan = false; > > fd = qemu_open(s->hostdevice, O_RDWR, errp); > > if (fd < 0) { > > return; > > @@ -1227,7 +1225,6 @@ static void usb_host_realize(USBDevice *udev, Error > > **errp) > > !s->match.vendor_id && > > !s->match.product_id && > > !s->match.port) { > > - s->needs_autoscan = false; > > ldev = usb_host_find_ref(s->match.bus_num, > > s->match.addr); > > if (!ldev) { > > @@ -1242,14 +1239,13 @@ static void usb_host_realize(USBDevice *udev, Error > > **errp) > > s->match.bus_num, s->match.addr); > > return; > > } > > - } else { > > - s->needs_autoscan = true; > > - QTAILQ_INSERT_TAIL(&hostdevs, s, next); > > - usb_host_auto_check(NULL); > > } > > s->exit.notify = usb_host_exit_notifier; > > qemu_add_exit_notifier(&s->exit); > > + > > + QTAILQ_INSERT_TAIL(&hostdevs, s, next); > > + usb_host_auto_check(NULL); > > } > > static void usb_host_instance_init(Object *obj) > > @@ -1267,9 +1263,7 @@ static void usb_host_unrealize(USBDevice *udev) > > USBHostDevice *s = USB_HOST_DEVICE(udev); > > qemu_remove_exit_notifier(&s->exit); > > - if (s->needs_autoscan) { > > - QTAILQ_REMOVE(&hostdevs, s, next); > > - } > > + QTAILQ_REMOVE(&hostdevs, s, next); > > usb_host_close(s); > > } > > > > --- > > base-commit: 190d5d7fd725ff754f94e8e0cbfb69f279c82b5d > > change-id: 20250912-usbhost-disconnect-192ecaa8fc3e > > > > Best regards, > --
