[libvirt] [PATCHv2] qemu: add ability to set PCI device "rombar" on or off

Eric Blake eblake at redhat.com
Fri Sep 23 16:35:19 UTC 2011


On 09/22/2011 10:05 AM, Laine Stump wrote:
> (This addresses Eric's comments in his review of V1. BTW, I'm a bit
> surprised nobody has commented about the choice of name/placement of
> the new attribute - speak now or forever hold your peace :-))

I was okay with the xml naming - but I agree that if anyone else has a 
better suggestion, now is the time to speak up :)

>
> This patch was made in response to:
>
>    https://bugzilla.redhat.com/show_bug.cgi?id=738095
>
> In short, qemu's default for the rombar setting (which makes the
> firmware ROM of a PCI device visible/not on the guest) was previously
> 0 (not visible), but they recently changed the default to 1
> (visible). Unfortunately, there are some PCI devices that fail in the
> guest when rombar is 1, so the setting must be exposed in libvirt to
> prevent a regression in behavior (it will still require explicitly
> setting<rom bar='off'/>  in the guest XML).
>
> rombar is forced on/off by adding:
>
>    <rom bar='on|off'/>
>
> inside a<hostdev>  element that defines a PCI device. It is currently
> ignored for all other types of devices.
>

> +++ b/docs/formatdomain.html.in
> @@ -1371,6 +1371,7 @@
>           <address bus='0x06' slot='0x02' function='0x0'/>
>         </source>
>         <boot order='1'/>
> +<rom bar='0'/>

s/0/off/

>       </hostdev>
>     </devices>
>     ...</pre>
> @@ -1402,6 +1403,18 @@
>         used together with general boot elements in
>         <a href="#elementsOSBIOS">BIOS bootloader</a>  section.
>         <span class="since">Since 0.8.8</span></dd>
> +<dt><code>rom</code></dt>
> +<dd>The<code>rom</code>  element is used to change how a PCI
> +        device's ROM is presented to the guest. The<code>bar</code>
> +        attribute can be set to "on" or "off", and determines whether
> +        or not the device's ROM will be visible in the guest's memory
> +        map. (In PCI documentation, the "rombar" setting controls the
> +        presence of the Base Address Register for the ROM). If no rom
> +        bar is specified, the qemu default will be used (older
> +        versions of qemu used a default of "off", while newer qemus
> +        have a default of "on").<span class="since">Since
> +        0.9.6</span>

looks much nicer, now that my v1 comments are incorporated, but still 
one nit:

s/0.9.6/0.9.7/

> @@ -10387,6 +10407,18 @@ virDomainHostdevDefFormat(virBufferPtr buf,
>       if (virDomainDeviceInfoFormat(buf,&def->info, flags)<  0)
>           return -1;
>
> +    if (def->rombar) {
> +        const char *rombar
> +            = virDomainPciRombarModeTypeToString(def->rombar);
> +        if (!rombar) {
> +            virDomainReportError(VIR_ERR_INTERNAL_ERROR,
> +                                 _("unexpected rom bar value %d"),
> +                                 def->rombar);
> +            return -1;
> +        }
> +        virBufferAsprintf(buf, "<rom bar='%s'/>\n", rombar);

Aargh - Thunderbird strikes me again.  When will they EVER fix their 
horrible whitespace munging bug?

This will conflict with my <snapshotdomain> reindentation patch series - 
so whoever applies first gets the easier side of the bargain :)

> +    }
> +
>       virBufferAddLit(buf, "</hostdev>\n");
>
>       return 0;
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 371f270..262c970 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -936,6 +936,14 @@ enum virDomainHostdevSubsysType {
>       VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST
>   };
>
> +enum virDomainPciRombarMode {
> +    VIR_DOMAIN_PCI_ROMBAR_DEFAULT = 0,
> +    VIR_DOMAIN_PCI_ROMBAR_ON,
> +    VIR_DOMAIN_PCI_ROMBAR_OFF,
> +
> +    VIR_DOMAIN_PCI_ROMBAR_LAST
> +};
> +
>   typedef struct _virDomainHostdevDef virDomainHostdevDef;
>   typedef virDomainHostdevDef *virDomainHostdevDefPtr;
>   struct _virDomainHostdevDef {
> @@ -964,6 +972,7 @@ struct _virDomainHostdevDef {
>       } source;
>       int bootIndex;
>       virDomainDeviceInfo info; /* Guest address */
> +    int rombar;               /* rombar on/off/unspecified */

Your comment could go out of date if the enum grows. Lately, I've been 
listing fields like this as:

int rombar; /* enum virDomainPciRombarMode */

which stays correct even if we later add new values to the enum.

> +++ b/src/qemu/qemu_capabilities.h
> @@ -110,6 +110,7 @@ enum qemuCapsFlags {
>       QEMU_CAPS_PCI_OHCI          = 71, /* -device pci-ohci */
>       QEMU_CAPS_USB_REDIR         = 72, /* -device usb-redir */
>       QEMU_CAPS_USB_HUB           = 73, /* -device usb-hub */
> +    QEMU_CAPS_PCI_ROMBAR        = 74, /* -device rombar=0|1 */

Needs an obvious rebase for NO_SHUTDOWN and DRIVE_CACHE_UNSAFE.

ACK to the idea.  I think my findings are small enough that I'm okay if 
you push with nits fixed rather than posting a v3 patch, although you 
may still want to wait for any other comments on the proposed xml spelling.

-- 
Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org




More information about the libvir-list mailing list