* [Qemu-devel] [PATCH v2 0/5] usb: hotplug support for usb-bot and usb-uas
@ 2016-06-15 9:46 Gerd Hoffmann
2016-06-15 9:46 ` [Qemu-devel] [PATCH v2 1/5] usb-storage: qcow2 encryption support is finally gone, zap dead code Gerd Hoffmann
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Gerd Hoffmann @ 2016-06-15 9:46 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
Hi,
Composite device hotplug is a long-standing issue in qemu.
PCI multifunction hotplug has been solved recently in a pci-specific
way, by simply not showing hot-plugged functions to the guest until
function #0 is plugged.
So I figured we maybe should check whenever we can apply a simliar trick
to USB composite devices. As the usb subsystem already can hide usb
devices from the guest (used for example with usb-host, in case the
physical usb device is not plugged in the host machine) this turned out
to be surprisingly simple.
So, here we go. Basic idea is the "attached" state becomes settable via
monitor. Now you can create a usb-bot (or usb-uas) device, then attach
the scsi device(s) you want, and when you are done you flip attached to
true to make the composed device visible to the guest.
v2 changes:
* rebased to latest master.
* add patch #1 (kill dead code for qcow2 encryption).
* reword patch #3 as suggested by Markus.
please review,
Gerd
Gerd Hoffmann (5):
usb-storage: qcow2 encryption support is finally gone, zap dead code
usb: make USBDevice->attached bool
usb: Add QOM property "attached ".
usb-bot: hotplug support
usb-uas: hotplug support
hw/usb/bus.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++----
hw/usb/dev-storage.c | 42 ++++++------------------------------------
hw/usb/dev-uas.c | 5 +++++
include/hw/usb.h | 3 ++-
4 files changed, 59 insertions(+), 41 deletions(-)
--
1.8.3.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH v2 1/5] usb-storage: qcow2 encryption support is finally gone, zap dead code
2016-06-15 9:46 [Qemu-devel] [PATCH v2 0/5] usb: hotplug support for usb-bot and usb-uas Gerd Hoffmann
@ 2016-06-15 9:46 ` Gerd Hoffmann
2016-06-15 9:46 ` [Qemu-devel] [PATCH v2 2/5] usb: make USBDevice->attached bool Gerd Hoffmann
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Gerd Hoffmann @ 2016-06-15 9:46 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
hw/usb/dev-storage.c | 34 ----------------------------------
1 file changed, 34 deletions(-)
diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c
index 248a580..f67c090 100644
--- a/hw/usb/dev-storage.c
+++ b/hw/usb/dev-storage.c
@@ -556,21 +556,6 @@ static void usb_msd_handle_data(USBDevice *dev, USBPacket *p)
}
}
-static void usb_msd_password_cb(void *opaque, int err)
-{
- MSDState *s = opaque;
- Error *local_err = NULL;
-
- if (!err) {
- usb_device_attach(&s->dev, &local_err);
- }
-
- if (local_err) {
- error_report_err(local_err);
- qdev_unplug(&s->dev.qdev, NULL);
- }
-}
-
static void *usb_msd_load_request(QEMUFile *f, SCSIRequest *req)
{
MSDState *s = DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent);
@@ -616,25 +601,6 @@ static void usb_msd_realize_storage(USBDevice *dev, Error **errp)
return;
}
- if (blk_bs(blk)) {
- bdrv_add_key(blk_bs(blk), NULL, &err);
- if (err) {
- if (monitor_cur_is_qmp()) {
- error_propagate(errp, err);
- return;
- }
- error_free(err);
- err = NULL;
- if (cur_mon) {
- monitor_read_bdrv_key_start(cur_mon, blk_bs(blk),
- usb_msd_password_cb, s);
- s->dev.auto_attach = 0;
- } else {
- autostart = 0;
- }
- }
- }
-
blkconf_serial(&s->conf, &dev->serial);
blkconf_blocksizes(&s->conf);
--
1.8.3.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH v2 2/5] usb: make USBDevice->attached bool
2016-06-15 9:46 [Qemu-devel] [PATCH v2 0/5] usb: hotplug support for usb-bot and usb-uas Gerd Hoffmann
2016-06-15 9:46 ` [Qemu-devel] [PATCH v2 1/5] usb-storage: qcow2 encryption support is finally gone, zap dead code Gerd Hoffmann
@ 2016-06-15 9:46 ` Gerd Hoffmann
2016-06-15 9:46 ` [Qemu-devel] [PATCH v2 3/5] usb: Add QOM property "attached " Gerd Hoffmann
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Gerd Hoffmann @ 2016-06-15 9:46 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
---
hw/usb/bus.c | 8 ++++----
include/hw/usb.h | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/hw/usb/bus.c b/hw/usb/bus.c
index 16c3461..afd70ea 100644
--- a/hw/usb/bus.c
+++ b/hw/usb/bus.c
@@ -55,9 +55,9 @@ static int usb_device_post_load(void *opaque, int version_id)
USBDevice *dev = opaque;
if (dev->state == USB_STATE_NOTATTACHED) {
- dev->attached = 0;
+ dev->attached = false;
} else {
- dev->attached = 1;
+ dev->attached = true;
}
if (dev->setup_index < 0 ||
dev->setup_len < 0 ||
@@ -533,7 +533,7 @@ void usb_device_attach(USBDevice *dev, Error **errp)
return;
}
- dev->attached++;
+ dev->attached = true;
usb_attach(port);
}
@@ -547,7 +547,7 @@ int usb_device_detach(USBDevice *dev)
trace_usb_port_detach(bus->busnr, port->path);
usb_detach(port);
- dev->attached--;
+ dev->attached = false;
return 0;
}
diff --git a/include/hw/usb.h b/include/hw/usb.h
index 163fe04..8f39470 100644
--- a/include/hw/usb.h
+++ b/include/hw/usb.h
@@ -235,7 +235,7 @@ struct USBDevice {
uint8_t addr;
char product_desc[32];
int auto_attach;
- int attached;
+ bool attached;
int32_t state;
uint8_t setup_buf[8];
--
1.8.3.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH v2 3/5] usb: Add QOM property "attached ".
2016-06-15 9:46 [Qemu-devel] [PATCH v2 0/5] usb: hotplug support for usb-bot and usb-uas Gerd Hoffmann
2016-06-15 9:46 ` [Qemu-devel] [PATCH v2 1/5] usb-storage: qcow2 encryption support is finally gone, zap dead code Gerd Hoffmann
2016-06-15 9:46 ` [Qemu-devel] [PATCH v2 2/5] usb: make USBDevice->attached bool Gerd Hoffmann
@ 2016-06-15 9:46 ` Gerd Hoffmann
2016-06-15 9:46 ` [Qemu-devel] [PATCH v2 4/5] usb-bot: hotplug support Gerd Hoffmann
2016-06-15 9:46 ` [Qemu-devel] [PATCH v2 5/5] usb-uas: " Gerd Hoffmann
4 siblings, 0 replies; 6+ messages in thread
From: Gerd Hoffmann @ 2016-06-15 9:46 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
USB devices in attached state are visible to the guest. This patch adds
a QOM property for this. Write access is opt-in per device. Some
devices manage attached state automatically (usb-host, usb-serial,
usb-redir), so we can't enable write access universally but have to do
it on a case by case base. So far, no device opts in.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
---
hw/usb/bus.c | 42 ++++++++++++++++++++++++++++++++++++++++++
include/hw/usb.h | 1 +
2 files changed, 43 insertions(+)
diff --git a/hw/usb/bus.c b/hw/usb/bus.c
index afd70ea..93dfe13 100644
--- a/hw/usb/bus.c
+++ b/hw/usb/bus.c
@@ -736,6 +736,47 @@ USBDevice *usbdevice_create(const char *cmdline)
return dev;
}
+static bool usb_get_attached(Object *obj, Error **errp)
+{
+ USBDevice *dev = USB_DEVICE(obj);
+
+ return dev->attached;
+}
+
+static void usb_set_attached(Object *obj, bool value, Error **errp)
+{
+ USBDevice *dev = USB_DEVICE(obj);
+ Error *err = NULL;
+
+ if (dev->attached == value)
+ return;
+
+ if (value) {
+ usb_device_attach(dev, &err);
+ if (err) {
+ error_propagate(errp, err);
+ }
+ } else {
+ usb_device_detach(dev);
+ }
+}
+
+static void usb_device_instance_init(Object *obj)
+{
+ USBDevice *dev = USB_DEVICE(obj);
+ USBDeviceClass *klass = USB_DEVICE_GET_CLASS(dev);
+
+ if (klass->attached_settable) {
+ object_property_add_bool(obj, "attached",
+ usb_get_attached, usb_set_attached,
+ NULL);
+ } else {
+ object_property_add_bool(obj, "attached",
+ usb_get_attached, NULL,
+ NULL);
+ }
+}
+
static void usb_device_class_init(ObjectClass *klass, void *data)
{
DeviceClass *k = DEVICE_CLASS(klass);
@@ -749,6 +790,7 @@ static const TypeInfo usb_device_type_info = {
.name = TYPE_USB_DEVICE,
.parent = TYPE_DEVICE,
.instance_size = sizeof(USBDevice),
+ .instance_init = usb_device_instance_init,
.abstract = true,
.class_size = sizeof(USBDeviceClass),
.class_init = usb_device_class_init,
diff --git a/include/hw/usb.h b/include/hw/usb.h
index 8f39470..847c9de 100644
--- a/include/hw/usb.h
+++ b/include/hw/usb.h
@@ -347,6 +347,7 @@ typedef struct USBDeviceClass {
const char *product_desc;
const USBDesc *usb_desc;
+ bool attached_settable;
} USBDeviceClass;
typedef struct USBPortOps {
--
1.8.3.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH v2 4/5] usb-bot: hotplug support
2016-06-15 9:46 [Qemu-devel] [PATCH v2 0/5] usb: hotplug support for usb-bot and usb-uas Gerd Hoffmann
` (2 preceding siblings ...)
2016-06-15 9:46 ` [Qemu-devel] [PATCH v2 3/5] usb: Add QOM property "attached " Gerd Hoffmann
@ 2016-06-15 9:46 ` Gerd Hoffmann
2016-06-15 9:46 ` [Qemu-devel] [PATCH v2 5/5] usb-uas: " Gerd Hoffmann
4 siblings, 0 replies; 6+ messages in thread
From: Gerd Hoffmann @ 2016-06-15 9:46 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
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>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
---
hw/usb/dev-storage.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c
index f67c090..e7f27d0 100644
--- a/hw/usb/dev-storage.c
+++ b/hw/usb/dev-storage.c
@@ -634,9 +634,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);
@@ -808,10 +813,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 = {
--
1.8.3.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH v2 5/5] usb-uas: hotplug support
2016-06-15 9:46 [Qemu-devel] [PATCH v2 0/5] usb: hotplug support for usb-bot and usb-uas Gerd Hoffmann
` (3 preceding siblings ...)
2016-06-15 9:46 ` [Qemu-devel] [PATCH v2 4/5] usb-bot: hotplug support Gerd Hoffmann
@ 2016-06-15 9:46 ` Gerd Hoffmann
4 siblings, 0 replies; 6+ messages in thread
From: Gerd Hoffmann @ 2016-06-15 9:46 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
Make attached property settable and turns off auto-attach in case the
device was hotplugged. Hotplugging works simliar to usb-bot now.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
---
hw/usb/dev-uas.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/hw/usb/dev-uas.c b/hw/usb/dev-uas.c
index 0678b1b..3a8ff18 100644
--- a/hw/usb/dev-uas.c
+++ b/hw/usb/dev-uas.c
@@ -900,9 +900,13 @@ static void usb_uas_handle_destroy(USBDevice *dev)
static void usb_uas_realize(USBDevice *dev, Error **errp)
{
UASDevice *uas = USB_UAS(dev);
+ DeviceState *d = DEVICE(dev);
usb_desc_create_serial(dev);
usb_desc_init(dev);
+ if (d->hotplugged) {
+ uas->dev.auto_attach = 0;
+ }
QTAILQ_INIT(&uas->results);
QTAILQ_INIT(&uas->requests);
@@ -940,6 +944,7 @@ static void usb_uas_class_initfn(ObjectClass *klass, void *data)
uc->handle_control = usb_uas_handle_control;
uc->handle_data = usb_uas_handle_data;
uc->handle_destroy = usb_uas_handle_destroy;
+ uc->attached_settable = true;
set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
dc->fw_name = "storage";
dc->vmsd = &vmstate_usb_uas;
--
1.8.3.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2016-06-15 9:47 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-06-15 9:46 [Qemu-devel] [PATCH v2 0/5] usb: hotplug support for usb-bot and usb-uas Gerd Hoffmann
2016-06-15 9:46 ` [Qemu-devel] [PATCH v2 1/5] usb-storage: qcow2 encryption support is finally gone, zap dead code Gerd Hoffmann
2016-06-15 9:46 ` [Qemu-devel] [PATCH v2 2/5] usb: make USBDevice->attached bool Gerd Hoffmann
2016-06-15 9:46 ` [Qemu-devel] [PATCH v2 3/5] usb: Add QOM property "attached " Gerd Hoffmann
2016-06-15 9:46 ` [Qemu-devel] [PATCH v2 4/5] usb-bot: hotplug support Gerd Hoffmann
2016-06-15 9:46 ` [Qemu-devel] [PATCH v2 5/5] usb-uas: " Gerd Hoffmann
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).