On 02/27/2017 08:19 AM, Michal Privoznik wrote: > Now that NVDIMM has found its way into libvirt, users might want > to fine tune some settings for each module separately. One such > setting is 'share=on|off' for the memory-backend-file object. > This setting - just like its name suggest already - enables > sharing the nvdimm module with other applications. Under the hood > it controls whether qemu mmaps() the file as MAP_PRIVATE or > MAP_SHARED. > > Yet again, we have such config knob in domain XML, but it's just > an attribute to numa <cell/>. This does not give fine enough > tuning on per-memdevice basis so we need to have the attribute > for each device too. > > Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx> > --- > docs/formatdomain.html.in | 15 +++++- > docs/schemas/domaincommon.rng | 8 ++++ > src/conf/domain_conf.c | 15 +++++- > src/conf/domain_conf.h | 2 + > .../qemuxml2argv-memory-hotplug-nvdimm-access.xml | 56 ++++++++++++++++++++++ > ...qemuxml2xmlout-memory-hotplug-nvdimm-access.xml | 1 + > tests/qemuxml2xmltest.c | 1 + > 7 files changed, 95 insertions(+), 3 deletions(-) > create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-nvdimm-access.xml > create mode 120000 tests/qemuxml2xmloutdata/qemuxml2xmlout-memory-hotplug-nvdimm-access.xml > > diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in > index b76905cdc..00c0df2ce 100644 > --- a/docs/formatdomain.html.in > +++ b/docs/formatdomain.html.in > @@ -1406,7 +1406,7 @@ > <span class='since'>Since 1.2.9</span> the optional attribute > <code>memAccess</code> can control whether the memory is to be > mapped as "shared" or "private". This is valid only for > - hugepages-backed memory. > + hugepages-backed memory and nvdimm modules. > </p> > > <p> > @@ -7015,7 +7015,7 @@ qemu-kvm -net nic,model=? /dev/null > <pre> > ... > <devices> > - <memory model='dimm'> > + <memory model='dimm' access='private'> Hmmm... this type of change almost makes it seem as though access will be required or written out always now. > <target> > <size unit='KiB'>524287</size> > <node>0</node> > @@ -7054,6 +7054,17 @@ qemu-kvm -net nic,model=? /dev/null > </p> > </dd> > > + <dt><code>access</code></dt> > + <dd> > + <p> > + Then there is optional attribute <code>access</code> s/Then there is optional/An optional > + (<span class="since">Since 3.1.0</span>) that allows It'll be "since 3.2.0" at the earliest (don't capitalize Since in the middle of a sentence) > + uses to fine tune mapping of the memory on per module s/allows uses to/provides the capability to/ > + basis. Values are the same as for numa <cell/>: > + <code>shared</code> and <code>private</code>. It's perhaps a nit, but I guess I just read the docs literally rather than interpretively... The "access mode='shared|private'" shows up in the "Memory Backing" section even though there's a NUMA Node Tuning section later. So, I would change "for numa <cell>" to include "Memory Backing" and a link to that, e.g. <a href="#elementsMemoryBacking">Memory Backing</a> within the text > + </p> > + </dd> > + > <dt><code>source</code></dt> > <dd> > <p> > diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng > index fafd3e982..78195aae9 100644 > --- a/docs/schemas/domaincommon.rng > +++ b/docs/schemas/domaincommon.rng > @@ -4740,6 +4740,14 @@ > <value>nvdimm</value> > </choice> > </attribute> > + <optional> > + <attribute name="access"> > + <choice> > + <value>shared</value> > + <value>private</value> > + </choice> > + </attribute> > + </optional> > <interleave> > <optional> > <ref name="memorydev-source"/> > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c > index 4ffca7dc8..a31114cc7 100644 > --- a/src/conf/domain_conf.c > +++ b/src/conf/domain_conf.c > @@ -13860,6 +13860,15 @@ virDomainMemoryDefParseXML(xmlNodePtr memdevNode, > } > VIR_FREE(tmp); > > + tmp = virXMLPropString(memdevNode, "access"); > + if (tmp && > + (def->access = virDomainMemoryAccessTypeFromString(tmp)) <= 0) { > + virReportError(VIR_ERR_XML_ERROR, > + _("invalid access mode '%s'"), tmp); > + goto error; > + } > + VIR_FREE(tmp); > + > /* source */ > if ((node = virXPathNode("./source", ctxt)) && > virDomainMemorySourceDefParseXML(node, ctxt, def) < 0) > @@ -22666,7 +22675,11 @@ virDomainMemoryDefFormat(virBufferPtr buf, > { > const char *model = virDomainMemoryModelTypeToString(def->model); > > - virBufferAsprintf(buf, "<memory model='%s'>\n", model); > + virBufferAsprintf(buf, "<memory model='%s'", model); > + if (def->access) > + virBufferAsprintf(buf, " access='%s'", > + virDomainMemoryAccessTypeToString(def->access)); > + virBufferAddLit(buf, ">\n"); > virBufferAdjustIndent(buf, 2); > > if (virDomainMemorySourceDefFormat(buf, def) < 0) Me thinks this too would need some amount of ABI checks wouldn't it? That is virDomainMemoryDefCheckABIStability for each mem? With that it would seem this is ACK-able John > diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h > index dc949d3c9..87516ca69 100644 > --- a/src/conf/domain_conf.h > +++ b/src/conf/domain_conf.h > @@ -2002,6 +2002,8 @@ typedef enum { > } virDomainMemoryModel; > > struct _virDomainMemoryDef { > + virDomainMemoryAccess access; > + > /* source */ > virBitmapPtr sourceNodes; > unsigned long long pagesize; /* kibibytes */ > diff --git a/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-nvdimm-access.xml b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-nvdimm-access.xml > new file mode 100644 > index 000000000..700e961a6 > --- /dev/null > +++ b/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-nvdimm-access.xml > @@ -0,0 +1,56 @@ > +<domain type='qemu'> > + <name>QEMUGuest1</name> > + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> > + <maxMemory slots='16' unit='KiB'>1099511627776</maxMemory> > + <memory unit='KiB'>1267710</memory> > + <currentMemory unit='KiB'>1267710</currentMemory> > + <vcpu placement='static' cpuset='0-1'>2</vcpu> > + <os> > + <type arch='i686' machine='pc'>hvm</type> > + <boot dev='hd'/> > + </os> > + <idmap> > + <uid start='0' target='1000' count='10'/> > + <gid start='0' target='1000' count='10'/> > + </idmap> > + <cpu> > + <topology sockets='2' cores='1' threads='1'/> > + <numa> > + <cell id='0' cpus='0-1' memory='219136' unit='KiB'/> > + </numa> > + </cpu> > + <clock offset='utc'/> > + <on_poweroff>destroy</on_poweroff> > + <on_reboot>restart</on_reboot> > + <on_crash>destroy</on_crash> > + <devices> > + <emulator>/usr/bin/qemu</emulator> > + <disk type='block' device='disk'> > + <source dev='/dev/HostVG/QEMUGuest1'/> > + <target dev='hda' bus='ide'/> > + <address type='drive' controller='0' bus='0' target='0' unit='0'/> > + </disk> > + <controller type='ide' index='0'> > + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> > + </controller> > + <controller type='usb' index='0'> > + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> > + </controller> > + <controller type='pci' index='0' model='pci-root'/> > + <input type='mouse' bus='ps2'/> > + <input type='keyboard' bus='ps2'/> > + <memballoon model='virtio'> > + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> > + </memballoon> > + <memory model='nvdimm' access='private'> > + <source> > + <path>/tmp/nvdimm</path> > + </source> > + <target> > + <size unit='KiB'>523264</size> > + <node>0</node> > + </target> > + <address type='dimm' slot='0'/> > + </memory> > + </devices> > +</domain> > diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-memory-hotplug-nvdimm-access.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-memory-hotplug-nvdimm-access.xml > new file mode 120000 > index 000000000..4b0496ad5 > --- /dev/null > +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-memory-hotplug-nvdimm-access.xml > @@ -0,0 +1 @@ > +/home/zippy/work/libvirt/libvirt.git/tests/qemuxml2argvdata/qemuxml2argv-memory-hotplug-nvdimm-access.xml > \ No newline at end of file > diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c > index e1c341dd5..ef49a79ca 100644 > --- a/tests/qemuxml2xmltest.c > +++ b/tests/qemuxml2xmltest.c > @@ -1079,6 +1079,7 @@ mymain(void) > DO_TEST("memory-hotplug-nonuma", NONE); > DO_TEST("memory-hotplug-dimm", NONE); > DO_TEST("memory-hotplug-nvdimm", NONE); > + DO_TEST("memory-hotplug-nvdimm-access", NONE); > DO_TEST("net-udp", NONE); > > DO_TEST("video-virtio-gpu-device", NONE); > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list