diff mbox

[3/4] usb-bot: hotplug support

Message ID 1453804885-15544-4-git-send-email-kraxel@redhat.com
State New
Headers show

Commit Message

Gerd Hoffmann Jan. 26, 2016, 10:41 a.m. UTC
This patch marks usb-bot as hot-pluggable device, makes attached
property settable and turns off auto-attach in case the device
was hotplugged.

Hot-plugging a usb-bot device with one or more scsi devices can be
done this way now:

  (1) device-add usb-bot,id=foo
  (2) device-add scsi-{hd,cd},bus=foo.0,lun=0
  (2b) optionally add more devices (luns 0 ... 15).
  (3) qom-set foo.attached = true

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/usb/dev-storage.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

Comments

Markus Armbruster Feb. 2, 2016, 1:36 p.m. UTC | #1
Gerd Hoffmann <kraxel@redhat.com> writes:

> This patch marks usb-bot as hot-pluggable device, makes attached
> property settable and turns off auto-attach in case the device
> was hotplugged.
>
> Hot-plugging a usb-bot device with one or more scsi devices can be
> done this way now:
>
>   (1) device-add usb-bot,id=foo
>   (2) device-add scsi-{hd,cd},bus=foo.0,lun=0
>   (2b) optionally add more devices (luns 0 ... 15).
>   (3) qom-set foo.attached = true

This isn't exactly pretty, but it beats no hot plug.

A general solution for hot plugging composite devices could perhaps be
prettier, but I'm not aware of any recent work in the area.  Andreas,
Paolo?

> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>

Assuming we want this because we can't have a general solution now:

Reviewed-by: Markus Armbruster <armbru@redhat.com>
Andreas Färber Feb. 2, 2016, 6:16 p.m. UTC | #2
Am 02.02.2016 um 14:36 schrieb Markus Armbruster:
> Gerd Hoffmann <kraxel@redhat.com> writes:
> 
>> This patch marks usb-bot as hot-pluggable device, makes attached
>> property settable and turns off auto-attach in case the device
>> was hotplugged.
>>
>> Hot-plugging a usb-bot device with one or more scsi devices can be
>> done this way now:
>>
>>   (1) device-add usb-bot,id=foo
>>   (2) device-add scsi-{hd,cd},bus=foo.0,lun=0
>>   (2b) optionally add more devices (luns 0 ... 15).
>>   (3) qom-set foo.attached = true
> 
> This isn't exactly pretty, but it beats no hot plug.
> 
> A general solution for hot plugging composite devices could perhaps be
> prettier, but I'm not aware of any recent work in the area.  Andreas,
> Paolo?

Not aware, no. Essentially we'd need a DeviceClass::dont_realize flag,
right? Then foo.attached=true could become foo.realized=true. Question
is then whether the bus would be attachable prior to realization - to be
tested.

Haven't read the full series yet, so puzzled what kind of bot this is
supposed to be. ;)

Cheers,
Andreas

>> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> 
> Assuming we want this because we can't have a general solution now:
> 
> Reviewed-by: Markus Armbruster <armbru@redhat.com>
Gerd Hoffmann Feb. 3, 2016, 7:58 a.m. UTC | #3
On Di, 2016-02-02 at 19:16 +0100, Andreas Färber wrote:
> Am 02.02.2016 um 14:36 schrieb Markus Armbruster:
> > Gerd Hoffmann <kraxel@redhat.com> writes:
> > 
> >> This patch marks usb-bot as hot-pluggable device, makes attached
> >> property settable and turns off auto-attach in case the device
> >> was hotplugged.
> >>
> >> Hot-plugging a usb-bot device with one or more scsi devices can be
> >> done this way now:
> >>
> >>   (1) device-add usb-bot,id=foo
> >>   (2) device-add scsi-{hd,cd},bus=foo.0,lun=0
> >>   (2b) optionally add more devices (luns 0 ... 15).
> >>   (3) qom-set foo.attached = true
> > 
> > This isn't exactly pretty, but it beats no hot plug.
> > 
> > A general solution for hot plugging composite devices could perhaps be
> > prettier, but I'm not aware of any recent work in the area.  Andreas,
> > Paolo?
> 
> Not aware, no. Essentially we'd need a DeviceClass::dont_realize flag,
> right?

Naa, not that simple I think.  We would need some way to create a group
of devices, then plug them all at once.

Case one is multi-function pci.

Case two are usb storage devices (bot + uas aka bulk-only-transport and
usb-attached-scsi).

I'm not aware of other cases.

Multifunction pci has been handled recently with a pci-specific hack:
pci functions are not visible to the guest until function 0 is plugged.
So you just have to plug them in the correct order (function 0 last) to
get things going.  Works because the common pci slot implicitly groups
devices.

So this is handles the usb storage devices with a usb specific hack:
usb devices can exist without being visible to the guest
(attached=false).  We can use that to create the device group (usb
storage adapter and the scsi device(s) connected to it) without the
guest seeing a half-composed device, when done we go flip the
visibility.

cheers,
  Gerd
diff mbox

Patch

diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c
index 597d8fd..275e0ed 100644
--- a/hw/usb/dev-storage.c
+++ b/hw/usb/dev-storage.c
@@ -665,9 +665,14 @@  static void usb_msd_realize_storage(USBDevice *dev, Error **errp)
 static void usb_msd_realize_bot(USBDevice *dev, Error **errp)
 {
     MSDState *s = USB_STORAGE_DEV(dev);
+    DeviceState *d = DEVICE(dev);
 
     usb_desc_create_serial(dev);
     usb_desc_init(dev);
+    if (d->hotplugged) {
+        s->dev.auto_attach = 0;
+    }
+
     scsi_bus_new(&s->bus, sizeof(s->bus), DEVICE(dev),
                  &usb_msd_scsi_info_bot, NULL);
     usb_msd_handle_reset(dev);
@@ -839,10 +844,9 @@  static void usb_msd_instance_init(Object *obj)
 static void usb_msd_class_initfn_bot(ObjectClass *klass, void *data)
 {
     USBDeviceClass *uc = USB_DEVICE_CLASS(klass);
-    DeviceClass *dc = DEVICE_CLASS(klass);
 
     uc->realize = usb_msd_realize_bot;
-    dc->hotpluggable = false;
+    uc->attached_settable = true;
 }
 
 static const TypeInfo msd_info = {