Message ID | 1453804885-15544-4-git-send-email-kraxel@redhat.com |
---|---|
State | New |
Headers | show |
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>
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>
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 --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 = {
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(-)