[libvirt] [PATCH v4 1/2] conf: Add 'x' and 'y' resolution into video XML definition

Cole Robinson crobinso at redhat.com
Thu Oct 17 20:34:03 UTC 2019


My apologies Jonathan, I saw your responses after I reviewed and pushed
Julio's patches. I need to remember to check my list mailbox for things
that are sitting in my inbox

On 10/17/19 3:12 PM, Jonathon Jongsma wrote:
> So, you're adding the support for parsing and formatting the new
> resolution parameters in this patch, but you're not actually testing
> them as part of this patch. The new tests that you add here have no
> mention of these resolution parameters. So I think you should include
> the changes to tests/qemuxml2argvdata/video-qxl-resolution.xml and
> tests/qemuxml2xmloutdata/video-qxl-resolution.xml from the next patch
> into this patch so you're testing it in the same commit that you
> introduce it. 
> 

I agree with this part. I noticed it too but considering we were at v4
of the patch series I let it slide. But yes, putting the new XML in the
test suite in the first patch will demonstrate that XML parsing and
formatting is working correctly. Then when qemu_command.c changes are
added in patch #2, we see it reflected in the .args output. I prefer
this layout as well

> However, that leaves a very small patch (basically only generating the
> parameters for the qemu command line and testing that) in the second
> patch. So in my mind the two patches could simply be combined. But I'll
> defer to other opinions on that.
> 
> More comments below.
> 
> 
> On Thu, 2019-10-17 at 01:30 -0300, jcfaracco at gmail.com wrote:
>> From: Julio Faracco <jcfaracco at gmail.com>
>>
>> This commit adds resolution element with parameters 'x' and 'y' into
>> video
>> XML domain group definition. Both, properties were added into an
>> element
>> called 'resolution' and it was added inside 'model' element. They are
>> set
>> as optional. This element does not follow QEMU properties 'xres' and
>> 'yres' format. Both HTML documentation and schema were changed too.
>> This
>> commit includes a simple test case to cover resolution for QEMU video
>> models. The new XML format for resolution looks like:
>>
>>     <model ...>
>>       <resolution x='800' y='600'/>
>>     </model>
>>
>> Signed-off-by: Julio Faracco <jcfaracco at gmail.com>
>> ---
>>  docs/formatdomain.html.in                     |  5 +-
>>  docs/schemas/domaincommon.rng                 | 10 +++
>>  src/conf/domain_conf.c                        | 63
>> ++++++++++++++++++-
>>  src/conf/domain_conf.h                        |  5 ++
>>  src/conf/virconftypes.h                       |  3 +
>>  .../video-qxl-resolution.args                 | 32 ++++++++++
>>  .../qemuxml2argvdata/video-qxl-resolution.xml | 40 ++++++++++++
>>  tests/qemuxml2argvtest.c                      |  4 ++
>>  .../video-qxl-resolution.xml                  | 40 ++++++++++++
>>  tests/qemuxml2xmltest.c                       |  1 +
>>  10 files changed, 201 insertions(+), 2 deletions(-)
>>  create mode 100644 tests/qemuxml2argvdata/video-qxl-resolution.args
>>  create mode 100644 tests/qemuxml2argvdata/video-qxl-resolution.xml
>>  create mode 100644 tests/qemuxml2xmloutdata/video-qxl-resolution.xml
>>
>> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
>> index 500f114f41..962766b792 100644
>> --- a/docs/formatdomain.html.in
>> +++ b/docs/formatdomain.html.in
>> @@ -7077,7 +7077,10 @@ qemu-kvm -net nic,model=? /dev/null
>>            <code>vgamem</code> (<span class="since">since
>> 1.2.11</span>) to set
>>            the size of VGA framebuffer for fallback mode of QXL
>> device.
>>            Attribute <code>vram64</code> (<span class="since">since
>> 1.3.3</span>)
>> -          extends secondary bar and makes it addressable as 64bit
>> memory.
>> +          extends secondary bar and makes it addressable as 64bit
>> memory. For
>> +          resolution settings, there are <code>x</code> and
>> <code>y</code>
>> +          (<span class="since">since 5.9.0</span>) optional
>> attributes to set
>> +          minimum resolution for model.
> 
> I'd personally prefer the wording "optional x and y attributes" instead
> of "x and y optional attributes"
> 

Yes I agree that sounds more natural.

> 
>>          </p>
>>        </dd>
>>  
>> diff --git a/docs/schemas/domaincommon.rng
>> b/docs/schemas/domaincommon.rng
>> index ead5a25068..e06f892da3 100644
>> --- a/docs/schemas/domaincommon.rng
>> +++ b/docs/schemas/domaincommon.rng
>> @@ -3656,6 +3656,16 @@
>>                </optional>
>>              </element>
>>            </optional>
>> +          <optional>
>> +            <element name="resolution">
>> +              <attribute name="x">
>> +                <ref name="unsignedInt"/>
>> +              </attribute>
>> +              <attribute name="y">
>> +                <ref name="unsignedInt"/>
>> +              </attribute>
>> +            </element>
>> +          </optional>
>>          </element>
>>        </optional>
>>        <optional>
>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>> index 2e6a113de3..88e93f6fb8 100644
>> --- a/src/conf/domain_conf.c
>> +++ b/src/conf/domain_conf.c
>> @@ -15345,6 +15345,52 @@ virDomainVideoAccelDefParseXML(xmlNodePtr
>> node)
>>      return def;
>>  }
>>  
>> +static virDomainVideoResolutionDefPtr
>> +virDomainVideoResolutionDefParseXML(xmlNodePtr node)
>> +{
>> +    xmlNodePtr cur;
>> +    virDomainVideoResolutionDefPtr def;
>> +    g_autofree char *x = NULL;
>> +    g_autofree char *y = NULL;
>> +
>> +    cur = node->children;
>> +    while (cur != NULL) {
>> +        if (cur->type == XML_ELEMENT_NODE) {
>> +            if (!x && !y &&
>> +                virXMLNodeNameEqual(cur, "resolution")) {
>> +                x = virXMLPropString(cur, "x");
>> +                y = virXMLPropString(cur, "y");
>> +            }
>> +        }
>> +        cur = cur->next;
>> +    }
>> +
>> +    if (!x || !y)
>> +        return NULL;
>> +
>> +    if (VIR_ALLOC(def) < 0)
> 
> Consider using the glib allocation APIs (e.g. g_new0()) in new code.
> This is now the preferred API for memory allocation, and you don't need
> to handle failed allocation anymore since glib aborts on failure.
> 
>> +        goto cleanup;
>> +
>> +    if (x) {
>> +        if (virStrToLong_uip(x, NULL, 10, &def->x) < 0) {
>> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>> +                           _("cannot parse video x-resolution
>> '%s'"), x);
>> +            goto cleanup;
> 
> Here, you jump to cleanup on error which just returns the incomplete
> 'def' variable. I think you want to actually free 'def' and return NULL
> in the case of error. If you mark 'def' as an autofree variable, you
> can just return NULL here and drop the goto.
> 
>> +        }
>> +    }
>> +
>> +    if (y) {
>> +        if (virStrToLong_uip(y, NULL, 10, &def->y) < 0) {
>> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>> +                           _("cannot parse video y-resolution
>> '%s'"), y);
>> +            goto cleanup;
> 
> same here.
> 
>> +        }
>> +    }
>> +
> 
> Validation question: this code accepts 0 as a valid resolution value,
> but the virDomainVideoResolutionDefFormat() function below treats 0 as
> invalid. If x and y are both zero, the format function results in an
> empty "<resolution/>" element being printed. These functions should
> probably agree on valid values.
> 
>> + cleanup:
>> +    return def;
>> +}
>> +
>>  static virDomainVideoDriverDefPtr
>>  virDomainVideoDriverDefParseXML(xmlNodePtr node)
>>  {
>> @@ -15424,6 +15470,7 @@
>> virDomainVideoDefParseXML(virDomainXMLOptionPtr xmlopt,
>>                  }
>>  
>>                  def->accel = virDomainVideoAccelDefParseXML(cur);
>> +                def->res = virDomainVideoResolutionDefParseXML(cur);
> 
> It appears that def->res leaks. It should be freed in
> virDomainVideoDefClear()
>

Indeed, good catch on all the above.  Who volunteers for the follow up
patch? :)

Thanks,
Cole




More information about the libvir-list mailing list