Il 14/11/2012 15:51, Ján Tomko ha scritto: > Allow bootindex to be specified for redirected USB devices and host USB > devices. > > Bug: https://bugzilla.redhat.com/show_bug.cgi?id=805414 > > --- > Bootindex for these devices is supported since QEMU 1.1.0 (or commit 65bb3a5c) > but the actual booting from usb-host devices is broken since a844ed84 > (before 1.2.0). > I haven't tested it with usb-redir yet. > --- > docs/schemas/domaincommon.rng | 3 +++ > src/conf/domain_conf.h | 4 ++-- > src/qemu/qemu_capabilities.c | 10 ++++++++++ > src/qemu/qemu_capabilities.h | 2 ++ > src/qemu/qemu_command.c | 37 ++++++++++++++++++++++++++++++------- > 5 files changed, 47 insertions(+), 9 deletions(-) Documentation missing? (Testcases too). Paolo > diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng > index 2beb035..02ad477 100644 > --- a/docs/schemas/domaincommon.rng > +++ b/docs/schemas/domaincommon.rng > @@ -2779,6 +2779,9 @@ > <optional> > <ref name="address"/> > </optional> > + <optional> > + <ref name="deviceBoot"/> > + </optional> > </element> > </define> > <define name="redirfilter"> > diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h > index 6539281..091879e 100644 > --- a/src/conf/domain_conf.h > +++ b/src/conf/domain_conf.h > @@ -279,8 +279,8 @@ struct _virDomainDeviceInfo { > * devices. */ > int rombar; /* enum virDomainPciRombarMode */ > char *romfile; > - /* bootIndex is only user for disk, network interface, and > - * hostdev devices. */ > + /* bootIndex is only used for disk, network interface, hostdev > + * and redirdev devices */ > int bootIndex; > }; > > diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c > index 5ce93f2..6ce2638 100644 > --- a/src/qemu/qemu_capabilities.c > +++ b/src/qemu/qemu_capabilities.c > @@ -191,6 +191,8 @@ VIR_ENUM_IMPL(qemuCaps, QEMU_CAPS_LAST, > "vnc", > > "drive-mirror", /* 115 */ > + "usb-redir.bootindex", > + "usb-host.bootindex", > ); > > struct _qemuCaps { > @@ -1325,6 +1327,11 @@ static struct qemuCapsStringFlags qemuCapsObjectPropsPixx4PM[] = { > > static struct qemuCapsStringFlags qemuCapsObjectPropsUsbRedir[] = { > { "filter", QEMU_CAPS_USB_REDIR_FILTER }, > + { "bootindex", QEMU_CAPS_USB_REDIR_BOOTINDEX }, > +}; > + > +static struct qemuCapsStringFlags qemuCapsObjectPropsUsbHost[] = { > + { "bootindex", QEMU_CAPS_USB_HOST_BOOTINDEX }, > }; > > struct qemuCapsObjectTypeProps { > @@ -1350,6 +1357,8 @@ static struct qemuCapsObjectTypeProps qemuCapsObjectProps[] = { > ARRAY_CARDINALITY(qemuCapsObjectPropsPixx4PM) }, > { "usb-redir", qemuCapsObjectPropsUsbRedir, > ARRAY_CARDINALITY(qemuCapsObjectPropsUsbRedir) }, > + { "usb-host", qemuCapsObjectPropsUsbHost, > + ARRAY_CARDINALITY(qemuCapsObjectPropsUsbHost) }, > }; > > > @@ -1545,6 +1554,7 @@ qemuCapsExtractDeviceStr(const char *qemu, > "-device", "PIIX4_PM,?", > "-device", "usb-redir,?", > "-device", "ide-drive,?", > + "-device", "usb-host,?", > NULL); > /* qemu -help goes to stdout, but qemu -device ? goes to stderr. */ > virCommandSetErrorBuffer(cmd, &output); > diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h > index fb88aa1..751b3ec 100644 > --- a/src/qemu/qemu_capabilities.h > +++ b/src/qemu/qemu_capabilities.h > @@ -153,6 +153,8 @@ enum qemuCapsFlags { > QEMU_CAPS_BLOCK_COMMIT = 113, /* block-commit */ > QEMU_CAPS_VNC = 114, /* Is -vnc available? */ > QEMU_CAPS_DRIVE_MIRROR = 115, /* drive-mirror monitor command */ > + QEMU_CAPS_USB_REDIR_BOOTINDEX = 116, /* usb-redir.bootindex */ > + QEMU_CAPS_USB_HOST_BOOTINDEX = 117, /* usb-host.bootindex */ > > QEMU_CAPS_LAST, /* this must always be the last item */ > }; > diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c > index 440fd62..93079f3 100644 > --- a/src/qemu/qemu_command.c > +++ b/src/qemu/qemu_command.c > @@ -3504,6 +3504,16 @@ qemuBuildRedirdevDevStr(virDomainDefPtr def, > } > } > > + if (dev->info.bootIndex) { > + if (!qemuCapsGet(caps, QEMU_CAPS_USB_REDIR_BOOTINDEX)) { > + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", > + _("USB redirection booting is not " > + "supported by this version of QEMU")); > + goto error; > + } > + virBufferAsprintf(&buf, ",bootindex=%d", dev->info.bootIndex); > + } > + > if (qemuBuildDeviceAddressStr(&buf, &dev->info, caps) < 0) > goto error; > > @@ -3540,6 +3550,8 @@ qemuBuildUSBHostdevDevStr(virDomainHostdevDefPtr dev, > dev->source.subsys.u.usb.device); > } > virBufferAsprintf(&buf, ",id=%s", dev->info->alias); > + if (dev->info->bootIndex) > + virBufferAsprintf(&buf, ",bootindex=%d", dev->info->bootIndex); > > if (qemuBuildDeviceAddressStr(&buf, dev->info, caps) < 0) > goto error; > @@ -6439,16 +6451,27 @@ qemuBuildCommandLine(virConnectPtr conn, > > if (hostdev->info->bootIndex) { > if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS || > - hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) { > + (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI && > + hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB)) { > virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", > _("booting from assigned devices is only" > - " supported for PCI devices")); > - goto error; > - } else if (!qemuCapsGet(caps, QEMU_CAPS_PCI_BOOTINDEX)) { > - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", > - _("booting from assigned PCI devices is not" > - " supported with this version of qemu")); > + " supported for PCI and USB devices")); > goto error; > + } else { > + if (hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI && > + !qemuCapsGet(caps, QEMU_CAPS_PCI_BOOTINDEX)) { > + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", > + _("booting from assigned PCI devices is not" > + " supported with this version of qemu")); > + goto error; > + } > + if (hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB && > + !qemuCapsGet(caps, QEMU_CAPS_USB_HOST_BOOTINDEX)) { > + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", > + _("booting from assigned USB devices is not" > + " supported with this version of qemu")); > + goto error; > + } > } > } > > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list