[libvirt] [PATCH 1/2] conf: add video driver configuration element

Roman Bogorodskiy bogorodskiy at gmail.com
Mon Jun 12 13:33:45 UTC 2017


  John Ferlan wrote:

> 
> 
> On 05/09/2017 07:53 AM, Roman Bogorodskiy wrote:
> > Add support for video driver configuration. In domain xml it looks like
> > this:
> > 
> >   <video>
> >     <model type=''>
> >       <driver .../>
> >     </model>
> >   </video>
> > 
> > At present, the only supported configuration is 'vgaconf' that looks this way:
> > 
> > <driver vgaconf='io|on|off'>
> > 
> > It was added with bhyve gop video in mind to allow users control how the
> > video device is exposed to the guest, specifically, how VGA I/O is
> > handled.
> > 
> > Signed-off-by: Roman Bogorodskiy <bogorodskiy at gmail.com>
> > ---
> >  docs/schemas/domaincommon.rng | 13 +++++++++
> >  src/conf/domain_conf.c        | 63 +++++++++++++++++++++++++++++++++++++++++--
> >  src/conf/domain_conf.h        | 17 ++++++++++++
> >  src/libvirt_private.syms      |  2 ++
> >  4 files changed, 93 insertions(+), 2 deletions(-)
> > 
> 
> Due to languishing on list and given jtomko's changes in a similar
> place, this no longer 'git am -3' applies...  Could you please rebase
> and resend?  You may also need to rethink the <driver> subelement too as
> it seems jtomko's commit f5384fb4 added this as well.

Thanks, I'll rebase the change.

Also, looking at f5384fb4, it looks like I can still reuse the <driver>
subelement because it seems it goes in line with the vga-related
configuration I'm adding.

> The xml2xml test should also be added here w/ various options...
> 
> There's no adjustment to the formatdomain.html.in to describe this -
> would it be strictly related to one specific "<model type='?'.../>"

Yeah, I was planning to update the doc as a separate commit after this
one gets merged because I wasn't sure this schema change will go in as
is, so I don't have to re-roll the doc patches as well (yeah, I'm
lazy...)

> > diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> > index 281309ec0..f45820383 100644
> > --- a/docs/schemas/domaincommon.rng
> > +++ b/docs/schemas/domaincommon.rng
> > @@ -3278,6 +3278,19 @@
> >                </optional>
> >              </element>
> >            </optional>
> > +          <optional>
> > +            <element name="driver">
> > +              <optional>
> > +                <attribute name="vgaconf">
> > +                  <choice>
> > +                    <value>io</value>
> > +                    <value>on</value>
> > +                    <value>off</value>
> > +                  </choice>
> > +                </attribute>
> > +              </optional>
> 
> Seems strange to have an optional <driver> with one optional attribute
> "vgaconf".
> 
> > +            </element>
> > +          </optional>
> >          </element>
> >        </optional>
> >        <optional>
> > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> > index 0ff216e3a..2ab55b52f 100644
> > --- a/src/conf/domain_conf.c
> > +++ b/src/conf/domain_conf.c
> > @@ -553,6 +553,11 @@ VIR_ENUM_IMPL(virDomainVideo, VIR_DOMAIN_VIDEO_TYPE_LAST,
> >                "virtio",
> >                "gop")
> >  
> > +VIR_ENUM_IMPL(virDomainVideoVgaconf, VIR_DOMAIN_VIDEO_VGACONF_LAST,
> > +              "io",
> > +              "on",
> > +              "off")
> > +
> 
> A "nit", but should it be "VGA" and not "Vga"?

Will fix this one.

> >  VIR_ENUM_IMPL(virDomainInput, VIR_DOMAIN_INPUT_TYPE_LAST,
> >                "mouse",
> >                "tablet",
> > @@ -2280,6 +2285,7 @@ void virDomainVideoDefFree(virDomainVideoDefPtr def)
> >      virDomainDeviceInfoClear(&def->info);
> >  
> >      VIR_FREE(def->accel);
> > +    VIR_FREE(def->driver);
> >      VIR_FREE(def);
> >  }
> >  
> > @@ -13368,6 +13374,43 @@ virDomainVideoAccelDefParseXML(xmlNodePtr node)
> >      return def;
> >  }
> >  
> > +static virDomainVideoDriverDefPtr
> > +virDomainVideoDriverDefParseXML(xmlNodePtr node)
> > +{
> > +    xmlNodePtr cur;
> > +    virDomainVideoDriverDefPtr def;
> > +    char *vgaconf = NULL;
> > +    int val;
> > +
> > +    cur = node->children;
> > +    while (cur != NULL) {
> > +        if (cur->type == XML_ELEMENT_NODE) {
> > +            if (!vgaconf &&
> > +                xmlStrEqual(cur->name, BAD_CAST "driver")) {
> > +                vgaconf = virXMLPropString(cur, "vgaconf");
> > +            }
> > +        }
> > +        cur = cur->next;
> > +    }
> > +
> > +    if (!vgaconf)
> > +        return NULL;
> > +
> > +    if (VIR_ALLOC(def) < 0)
> > +        goto cleanup;
> > +
> > +    if ((val = virDomainVideoVgaconfTypeFromString(vgaconf)) <= 0) {
> 
> <= ?

Hm, 0 seems to correspond to the first element in the enum, so "<="
should be valid. I'll double check.

> How does VIR_DOMAIN_VIDEO_VGACONF_IO get set? Perhaps a specific xml2xml
> test...
> 
> > +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> > +                       _("unknown vgaconf value '%s'"), vgaconf);
> > +        goto cleanup;
> > +    }
> > +    def->vgaconf = val;
> > +
> > + cleanup:
> > +    VIR_FREE(vgaconf);
> > +    return def;
> > +}
> > +
> >  static virDomainVideoDefPtr
> >  virDomainVideoDefParseXML(xmlNodePtr node,
> >                            const virDomainDef *dom,
> > @@ -13405,6 +13448,7 @@ virDomainVideoDefParseXML(xmlNodePtr node,
> >                  }
> >  
> >                  def->accel = virDomainVideoAccelDefParseXML(cur);
> > +                def->driver = virDomainVideoDriverDefParseXML(cur);
> >              }
> >          }
> >          cur = cur->next;
> > @@ -22998,6 +23042,18 @@ virDomainVideoAccelDefFormat(virBufferPtr buf,
> >      virBufferAddLit(buf, "/>\n");
> >  }
> >  
> > +static void
> > +virDomainVideoDriverDefFormat(virBufferPtr buf,
> > +                              virDomainVideoDriverDefPtr def)
> > +{
> > +    virBufferAddLit(buf, "<driver");
> > +    if (def->vgaconf) {
> > +        virBufferAsprintf(buf, " vgaconf='%s'",
> > +                          virDomainVideoVgaconfTypeToString(def->vgaconf));
> > +    }
> Without def->driver, the def->vgaconf doesn't exist, true?

Yeah, that'll need to be fixed if it stays relevant after rebase.

> If !vgaconf, then all you're getting is <driver>, which while
> technically legal according to the RNG added here does look a little
> strange.  Are there plans to "enhance" this in the future? Always a bit
> difficult to take that crystal ball out, but wouldn't that type of
> enhancement need some sort of "vgaconf" or would it be possible for
> something else...

There's at least one thing I'd like to make controllable using this
<driver> element: screen resolution (width and height in pixels).

There's one more thing in bhyve that I'd like add support for: it
supports the 'wait' argument for video device so VM will start booting
only after clients connect to it via VNC. I'm not if this one fits the
video <driver> element very well though (probably should be part of
<graphics>?).

> Given what I found w/ jtomko's changes and this, maybe the optional
> subelement just becomes <vgaconf>, unless you see <driver> being
> expanded. Still vgaconf would seem to be related to model type='vga' in
> my mind at least...
> 
> John

Actually, bhyve only supports 'gop', so I'm targeting this one
specifically. Though I guess it could be used for type='vga' as well
because there's nothing bhyve specific in 'vgaconf' as I can see.

> > +    virBufferAddLit(buf, "/>\n");
> > +}
> > +
> >  
> >  static int
> >  virDomainVideoDefFormat(virBufferPtr buf,
> > @@ -23028,10 +23084,13 @@ virDomainVideoDefFormat(virBufferPtr buf,
> >          virBufferAsprintf(buf, " heads='%u'", def->heads);
> >      if (def->primary)
> >          virBufferAddLit(buf, " primary='yes'");
> > -    if (def->accel) {
> > +    if (def->accel || def->driver) {
> >          virBufferAddLit(buf, ">\n");
> >          virBufferAdjustIndent(buf, 2);
> > -        virDomainVideoAccelDefFormat(buf, def->accel);
> > +        if (def->accel)
> > +            virDomainVideoAccelDefFormat(buf, def->accel);
> > +        if (def->driver)
> > +            virDomainVideoDriverDefFormat(buf, def->driver);
> >          virBufferAdjustIndent(buf, -2);
> >          virBufferAddLit(buf, "</model>\n");
> >      } else {
> > diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> > index 09fb7aada..cbf25a67b 100644
> > --- a/src/conf/domain_conf.h
> > +++ b/src/conf/domain_conf.h
> > @@ -1350,6 +1350,16 @@ typedef enum {
> >  } virDomainVideoType;
> >  
> >  
> > +typedef enum {
> > +    VIR_DOMAIN_VIDEO_VGACONF_IO = 0,
> > +    VIR_DOMAIN_VIDEO_VGACONF_ON,
> > +    VIR_DOMAIN_VIDEO_VGACONF_OFF,
> > +
> > +    VIR_DOMAIN_VIDEO_VGACONF_LAST
> > +} virDomainVideoVgaconf;
> > +
> > +VIR_ENUM_DECL(virDomainVideoVgaconf)
> > +
> >  typedef struct _virDomainVideoAccelDef virDomainVideoAccelDef;
> >  typedef virDomainVideoAccelDef *virDomainVideoAccelDefPtr;
> >  struct _virDomainVideoAccelDef {
> > @@ -1358,6 +1368,12 @@ struct _virDomainVideoAccelDef {
> >  };
> >  
> >  
> > +typedef struct _virDomainVideoDriverDef virDomainVideoDriverDef;
> > +typedef virDomainVideoDriverDef *virDomainVideoDriverDefPtr;
> > +struct _virDomainVideoDriverDef {
> > +   virDomainVideoVgaconf vgaconf;
> > +};
> > +
> >  struct _virDomainVideoDef {
> >      int type;
> >      unsigned int ram;  /* kibibytes (multiples of 1024) */
> > @@ -1367,6 +1383,7 @@ struct _virDomainVideoDef {
> >      unsigned int heads;
> >      bool primary;
> >      virDomainVideoAccelDefPtr accel;
> > +    virDomainVideoDriverDefPtr driver;
> >      virDomainDeviceInfo info;
> >  };
> >  
> > diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> > index e6901a8f1..40995533c 100644
> > --- a/src/libvirt_private.syms
> > +++ b/src/libvirt_private.syms
> > @@ -525,6 +525,8 @@ virDomainVideoDefaultType;
> >  virDomainVideoDefFree;
> >  virDomainVideoTypeFromString;
> >  virDomainVideoTypeToString;
> > +virDomainVideoVgaconfTypeFromString;
> > +virDomainVideoVgaconfTypeToString;
> >  virDomainVirtTypeFromString;
> >  virDomainVirtTypeToString;
> >  virDomainWatchdogActionTypeFromString;
> > 

Roman Bogorodskiy
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 455 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20170612/77c4cbf4/attachment-0001.sig>


More information about the libvir-list mailing list