[libvirt] [PATCH v2 07/14] qemu: Introduce label-size for NVDIMMs

Michal Privoznik mprivozn at redhat.com
Thu Mar 9 13:31:22 UTC 2017


On 03/07/2017 05:55 PM, John Ferlan wrote:
> 
> 
> On 02/27/2017 08:19 AM, Michal Privoznik wrote:
>> For NVDIMM devices it is optionally possible to specify the size
>> of internal storage for namespaces. Namespaces are a feature that
>> allows users to partition the NVDIMM for different uses.
>>
>> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>> ---
>>  docs/formatdomain.html.in                          |  9 ++++
>>  docs/schemas/domaincommon.rng                      |  7 +++
>>  src/conf/domain_conf.c                             | 19 +++++++
>>  src/conf/domain_conf.h                             |  1 +
>>  src/qemu/qemu_command.c                            |  3 ++
>>  .../qemuxml2argv-memory-hotplug-nvdimm-label.args  | 26 ++++++++++
>>  .../qemuxml2argv-memory-hotplug-nvdimm-label.xml   | 59 ++++++++++++++++++++++
>>  tests/qemuxml2argvtest.c                           |  2 +
>>  .../qemuxml2xmlout-memory-hotplug-nvdimm-label.xml |  1 +
>>  tests/qemuxml2xmltest.c                            |  1 +
>>  10 files changed, 128 insertions(+)
>>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-nvdimm-label.args
>>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-nvdimm-label.xml
>>  create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-memory-hotplug-nvdimm-label.xml
>>
>> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
>> index 00c0df2ce..4a078b577 100644
>> --- a/docs/formatdomain.html.in
>> +++ b/docs/formatdomain.html.in
>> @@ -7038,6 +7038,9 @@ qemu-kvm -net nic,model=? /dev/null
>>      <target>
>>        <size unit='KiB'>524288</size>
>>        <node>1</node>
>> +      <label>
>> +        <size unit='KiB'>128</size>
>> +      </label>
>>      </target>
>>    </memory>
>>  </devices>
>> @@ -7117,6 +7120,12 @@ qemu-kvm -net nic,model=? /dev/null
>>            attach the memory to. The element shall be used only if the guest has
>>            NUMA nodes configured.
>>          </p>
>> +        <p>
>> +          For NVDIMM type devices one can optionally use
>> +          <code>label</code> and its subelement <code>size</code>
>> +          to configure the size of namespaces label storage
>> +          within the NVDIMM module.
> 
> and the "unit=" is also required, right?

No. By default the unit is KiB. If users want to use different one, they
have to specify it in @unit attribute. This is just like domain memory.
That's why we can use the same parsing function.

> 
>> +        </p>
>>        </dd>
>>      </dl>
>>  
>> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
>> index 78195aae9..aafc731f5 100644
>> --- a/docs/schemas/domaincommon.rng
>> +++ b/docs/schemas/domaincommon.rng
>> @@ -4800,6 +4800,13 @@
>>              <ref name="unsignedInt"/>
>>            </element>
>>          </optional>
>> +        <optional>
>> +          <element name="label">
>> +            <element name="size">
>> +              <ref name="scaledInteger"/>
>> +            </element>
>> +          </element>
>> +        </optional>
>>        </interleave>
>>      </element>
>>    </define>
>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>> index a31114cc7..7840f8e02 100644
>> --- a/src/conf/domain_conf.c
>> +++ b/src/conf/domain_conf.c
>> @@ -13824,6 +13824,18 @@ virDomainMemoryTargetDefParseXML(xmlNodePtr node,
>>                               &def->size, true, false) < 0)
>>          goto cleanup;
>>  
>> +    if (def->model == VIR_DOMAIN_MEMORY_MODEL_NVDIMM) {
>> +        if (virDomainParseMemory("./label/size", "./label/size/@unit", ctxt,
>> +                                 &def->labelsize, false, false) < 0)
> 
> So one could provide a fairly large size for this?

Yeah, if they have enough (disk/actual nvdimm) space. Now that I'm
thinking about this, maybe we can at least check if the label-size is
not greater than the size of nvdimm itself.

> 
> Why is '@required' false?

Because it is not required to specify label size.

> 
>> +            goto cleanup;
>> +
>> +        if (def->labelsize && def->labelsize < 128) {
> 
> This makes it seem labelsize is optional, but it's not clear (to me at
> least) from the description above whether must provide the size as well
> as the label.
> 
> Of course as I read on - labelsize is expected.... Let's face it, if
> label is provided and labelsize is 0, then well not much is going to be
> allowed is it?

I think you can still use it as a data storage inside the guest. Labels
were not introduced in qemu at the same time as NVDIMM, so clearly you
can use NVDIMMs even without labels.

> 
> 
>> +            virReportError(VIR_ERR_XML_ERROR, "%s",
>> +                           _("nvdimm label must be at least 128KiB"));
>> +            goto cleanup;
>> +        }
>> +    }
>> +
>>      ret = 0;
>>  
>>   cleanup:
>> @@ -22663,6 +22675,13 @@ virDomainMemoryTargetDefFormat(virBufferPtr buf,
>>      virBufferAsprintf(buf, "<size unit='KiB'>%llu</size>\n", def->size);
>>      if (def->targetNode >= 0)
>>          virBufferAsprintf(buf, "<node>%d</node>\n", def->targetNode);
>> +    if (def->labelsize) {
>> +        virBufferAddLit(buf, "<label>\n");
>> +        virBufferAdjustIndent(buf, 2);
>> +        virBufferAsprintf(buf, "<size unit='KiB'>%llu</size>\n", def->labelsize);
> 
> There's no check here if labelsize wasn't provided.

Yes, there is.

> 
>> +        virBufferAdjustIndent(buf, -2);
>> +        virBufferAddLit(buf, "</label>\n");
>> +    }
>>  
>>      virBufferAdjustIndent(buf, -2);
>>      virBufferAddLit(buf, "</target>\n");
> 
> Similar comments from before about ABI...

This might actually require ABI check as the label-size is visible
inside the guest. Will update it.

> 
> Additionally if NVDIMM's are included in the total memory allocation's
> (from my comments in patch2), wouldn't the size of this label need to
> also be included?
> 

No. This is not some additional memory. Label size specifies the size of
a portion of NVDIMM that is used to store labels. For instance, if I
have 512MiB NVDIMM and set label-size to 2MiB, there's only 510MiB
available for data. If the label-size is 128MiB then there's only 128MiB
left for data.

>> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
>> index 87516ca69..0e68f5770 100644
>> --- a/src/conf/domain_conf.h
>> +++ b/src/conf/domain_conf.h
>> @@ -2013,6 +2013,7 @@ struct _virDomainMemoryDef {
>>      int model; /* virDomainMemoryModel */
>>      int targetNode;
>>      unsigned long long size; /* kibibytes */
>> +    unsigned long long labelsize; /* kibibytes; valid only for NVDIMM */
>>  
>>      virDomainDeviceInfo info;
>>  };
>> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
>> index 287387055..91ace8e38 100644
>> --- a/src/qemu/qemu_command.c
>> +++ b/src/qemu/qemu_command.c
>> @@ -3440,6 +3440,9 @@ qemuBuildMemoryDeviceStr(virDomainMemoryDefPtr mem)
>>          if (mem->targetNode >= 0)
>>              virBufferAsprintf(&buf, "node=%d,", mem->targetNode);
>>  
>> +        if (mem->labelsize)
>> +            virBufferAsprintf(&buf, "label-size=%llu,", mem->labelsize * 1024);
>> +
> 
> And this code checks for labelsize using the "assumption" (I suppose
> that if label, then we have a labelsize too.

No. If mem->labelsize then mem->labelsize. Or maybe I'm misunderstanding
something?

Michal




More information about the libvir-list mailing list