diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 929584d2b5..3554a92bee 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -3490,8 +3490,27 @@ void virDomainMemoryDefFree(virDomainMemoryDef *def)
if (!def)
return;
- g_free(def->nvdimmPath);
- virBitmapFree(def->sourceNodes);
+ switch (def->model) {
+ case VIR_DOMAIN_MEMORY_MODEL_DIMM:
+ virBitmapFree(def->source.dimm.sourceNodes);
+ break;
+ case VIR_DOMAIN_MEMORY_MODEL_NVDIMM:
+ g_free(def->source.nvdimm.nvdimmPath);
+ break;
+ case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
+ g_free(def->source.virtio_pmem.nvdimmPath);
+ break;
+ case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM:
+ virBitmapFree(def->source.virtio_mem.sourceNodes);
+ break;
+ case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC:
+ virBitmapFree(def->source.sgx_epc.sourceNodes);
+ break;
+ case VIR_DOMAIN_MEMORY_MODEL_NONE:
+ case VIR_DOMAIN_MEMORY_MODEL_LAST:
+ break;
+ }
+
g_free(def->uuid);
virDomainDeviceInfoClear(&def->info);
g_free(def);
@@ -13266,22 +13285,33 @@ virDomainMemorySourceDefParseXML(xmlNodePtr node,
{
VIR_XPATH_NODE_AUTORESTORE(ctxt)
g_autofree char *nodemask = NULL;
+ unsigned long long *pagesize;
+ virBitmap **sourceNodes = NULL;
ctxt->node = node;
switch (def->model) {
case VIR_DOMAIN_MEMORY_MODEL_DIMM:
case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM:
+
+ if (def->model == VIR_DOMAIN_MEMORY_MODEL_DIMM) {
+ pagesize = &def->source.dimm.pagesize;
+ sourceNodes = &def->source.dimm.sourceNodes;
+ } else {
+ pagesize = &def->source.virtio_mem.pagesize;
+ sourceNodes = &def->source.virtio_mem.sourceNodes;
+ }
+
if (virDomainParseMemory("./pagesize", "./pagesize/@unit", ctxt,
- &def->pagesize, false, false) < 0)
+ pagesize, false, false) < 0)
return -1;
if ((nodemask = virXPathString("string(./nodemask)", ctxt))) {
- if (virBitmapParse(nodemask, &def->sourceNodes,
+ if (virBitmapParse(nodemask, sourceNodes,
VIR_DOMAIN_CPUMASK_LEN) < 0)
return -1;
- if (virBitmapIsAllClear(def->sourceNodes)) {
+ if (virBitmapIsAllClear(*sourceNodes)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Invalid value of 'nodemask': %1$s"), nodemask);
return -1;
@@ -13290,28 +13320,28 @@ virDomainMemorySourceDefParseXML(xmlNodePtr node,
break;
case VIR_DOMAIN_MEMORY_MODEL_NVDIMM:
- def->nvdimmPath = virXPathString("string(./path)", ctxt);
+ def->source.nvdimm.nvdimmPath = virXPathString("string(./path)", ctxt);
if (virDomainParseMemory("./alignsize", "./alignsize/@unit", ctxt,
- &def->alignsize, false, false) < 0)
+ &def->source.nvdimm.alignsize, false, false) < 0)
return -1;
if (virXPathBoolean("boolean(./pmem)", ctxt))
- def->nvdimmPmem = true;
+ def->source.nvdimm.nvdimmPmem = true;
break;
case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
- def->nvdimmPath = virXPathString("string(./path)", ctxt);
+ def->source.virtio_pmem.nvdimmPath = virXPathString("string(./path)", ctxt);
break;
case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC:
if ((nodemask = virXPathString("string(./nodemask)", ctxt))) {
- if (virBitmapParse(nodemask, &def->sourceNodes,
+ if (virBitmapParse(nodemask, &def->source.sgx_epc.sourceNodes,
VIR_DOMAIN_CPUMASK_LEN) < 0)
return -1;
- if (virBitmapIsAllClear(def->sourceNodes)) {
+ if (virBitmapIsAllClear(def->source.sgx_epc.sourceNodes)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Invalid value of 'nodemask': %1$s"), nodemask);
return -1;
@@ -15259,27 +15289,36 @@ virDomainMemoryFindByDefInternal(virDomainDef *def,
switch (mem->model) {
case VIR_DOMAIN_MEMORY_MODEL_DIMM:
- case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM:
- /* source stuff -> match with device */
- if (tmp->pagesize != mem->pagesize)
+ if (tmp->source.dimm.pagesize != mem->source.dimm.pagesize)
continue;
- if (!virBitmapEqual(tmp->sourceNodes, mem->sourceNodes))
+ if (!virBitmapEqual(tmp->source.dimm.sourceNodes,
+ mem->source.dimm.sourceNodes))
+ continue;
+ break;
+ case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM:
+ if (tmp->source.virtio_mem.pagesize != mem->source.virtio_mem.pagesize)
+ continue;
+
+ if (!virBitmapEqual(tmp->source.virtio_mem.sourceNodes,
+ mem->source.virtio_mem.sourceNodes))
continue;
break;
case VIR_DOMAIN_MEMORY_MODEL_NVDIMM:
- if (STRNEQ(tmp->nvdimmPath, mem->nvdimmPath))
+ if (STRNEQ(tmp->source.nvdimm.nvdimmPath, mem->source.nvdimm.nvdimmPath))
continue;
break;
case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
- if (STRNEQ(tmp->nvdimmPath, mem->nvdimmPath))
+ if (STRNEQ(tmp->source.virtio_pmem.nvdimmPath,
+ mem->source.virtio_pmem.nvdimmPath))
continue;
break;
case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC:
- if (!virBitmapEqual(tmp->sourceNodes, mem->sourceNodes))
+ if (!virBitmapEqual(tmp->source.sgx_epc.sourceNodes,
+ mem->source.sgx_epc.sourceNodes))
continue;
break;
@@ -21007,7 +21046,8 @@ virDomainMemoryDefCheckABIStability(virDomainMemoryDef *src,
return false;
}
- if (src->model == VIR_DOMAIN_MEMORY_MODEL_NVDIMM) {
+ switch (src->model) {
+ case VIR_DOMAIN_MEMORY_MODEL_NVDIMM:
if (src->labelsize != dst->labelsize) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Target NVDIMM label size '%1$llu' doesn't match source NVDIMM label size '%2$llu'"),
@@ -21015,14 +21055,15 @@ virDomainMemoryDefCheckABIStability(virDomainMemoryDef *src,
return false;
}
- if (src->alignsize != dst->alignsize) {
+ if (src->source.nvdimm.alignsize != dst->source.nvdimm.alignsize) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Target NVDIMM alignment '%1$llu' doesn't match source NVDIMM alignment '%2$llu'"),
- src->alignsize, dst->alignsize);
+ src->source.nvdimm.alignsize,
+ dst->source.nvdimm.alignsize);
return false;
}
- if (src->nvdimmPmem != dst->nvdimmPmem) {
+ if (src->source.nvdimm.nvdimmPmem != dst->source.nvdimm.nvdimmPmem) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("Target NVDIMM pmem flag doesn't match "
"source NVDIMM pmem flag"));
@@ -21043,6 +21084,15 @@ virDomainMemoryDefCheckABIStability(virDomainMemoryDef *src,
_("Target NVDIMM UUID doesn't match source NVDIMM"));
return false;
}
+ break;
+
+ case VIR_DOMAIN_MEMORY_MODEL_DIMM:
+ case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
+ case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM:
+ case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC:
+ case VIR_DOMAIN_MEMORY_MODEL_NONE:
+ case VIR_DOMAIN_MEMORY_MODEL_LAST:
+ break;
}
return virDomainDeviceInfoCheckABIStability(&src->info, &dst->info);
@@ -25100,37 +25150,48 @@ virDomainMemorySourceDefFormat(virBuffer *buf,
switch (def->model) {
case VIR_DOMAIN_MEMORY_MODEL_DIMM:
- case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM:
- if (def->sourceNodes) {
- if (!(bitmap = virBitmapFormat(def->sourceNodes)))
+ if (def->source.dimm.sourceNodes) {
+ if (!(bitmap = virBitmapFormat(def->source.dimm.sourceNodes)))
return -1;
virBufferAsprintf(&childBuf, "%s\n", bitmap);
}
- if (def->pagesize)
+ if (def->source.dimm.pagesize)
virBufferAsprintf(&childBuf, "%llu\n",
- def->pagesize);
+ def->source.dimm.pagesize);
+ break;
+ case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM:
+ if (def->source.virtio_mem.sourceNodes) {
+ if (!(bitmap = virBitmapFormat(def->source.virtio_mem.sourceNodes)))
+ return -1;
+
+ virBufferAsprintf(&childBuf, "%s\n", bitmap);
+ }
+
+ if (def->source.virtio_mem.pagesize)
+ virBufferAsprintf(&childBuf, "%llu\n",
+ def->source.virtio_mem.pagesize);
break;
case VIR_DOMAIN_MEMORY_MODEL_NVDIMM:
- virBufferEscapeString(&childBuf, "%s\n", def->nvdimmPath);
+ virBufferEscapeString(&childBuf, "%s\n", def->source.nvdimm.nvdimmPath);
- if (def->alignsize)
+ if (def->source.nvdimm.alignsize)
virBufferAsprintf(&childBuf, "%llu\n",
- def->alignsize);
+ def->source.nvdimm.alignsize);
- if (def->nvdimmPmem)
+ if (def->source.nvdimm.nvdimmPmem)
virBufferAddLit(&childBuf, "\n");
break;
case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
- virBufferEscapeString(&childBuf, "%s\n", def->nvdimmPath);
+ virBufferEscapeString(&childBuf, "%s\n", def->source.virtio_pmem.nvdimmPath);
break;
case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC:
- if (def->sourceNodes) {
- if (!(bitmap = virBitmapFormat(def->sourceNodes)))
+ if (def->source.sgx_epc.sourceNodes) {
+ if (!(bitmap = virBitmapFormat(def->source.sgx_epc.sourceNodes)))
return -1;
virBufferAsprintf(&childBuf, "%s\n", bitmap);
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index c857ba556f..8770547590 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2634,18 +2634,33 @@ typedef enum {
} virDomainMemoryModel;
struct _virDomainMemoryDef {
+ virDomainMemoryModel model;
virDomainMemoryAccess access;
virTristateBool discard;
- /* source */
- virBitmap *sourceNodes;
- unsigned long long pagesize; /* kibibytes */
- char *nvdimmPath; /* valid for NVDIMM an VIRTIO_PMEM */
- unsigned long long alignsize; /* kibibytes; valid only for NVDIMM */
- bool nvdimmPmem; /* valid only for NVDIMM */
+ union {
+ struct {
+ unsigned long long pagesize; /* kibibytes */
+ virBitmap *sourceNodes;
+ } dimm;
+ struct {
+ char *nvdimmPath;
+ bool nvdimmPmem;
+ unsigned long long alignsize; /* kibibytes */
+ } nvdimm;
+ struct {
+ char *nvdimmPath;
+ } virtio_pmem;
+ struct {
+ unsigned long long pagesize; /* kibibytes */
+ virBitmap *sourceNodes;
+ } virtio_mem;
+ struct {
+ virBitmap *sourceNodes;
+ } sgx_epc;
+ } source;
/* target */
- virDomainMemoryModel model;
int targetNode;
unsigned long long size; /* kibibytes */
unsigned long long labelsize; /* kibibytes; valid only for NVDIMM */
diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c
index ad383b604e..2832fd010e 100644
--- a/src/conf/domain_validate.c
+++ b/src/conf/domain_validate.c
@@ -2260,7 +2260,7 @@ virDomainMemoryDefValidate(const virDomainMemoryDef *mem,
switch (mem->model) {
case VIR_DOMAIN_MEMORY_MODEL_NVDIMM:
- if (!mem->nvdimmPath) {
+ if (!mem->source.nvdimm.nvdimmPath) {
virReportError(VIR_ERR_XML_DETAIL, "%s",
_("path is required for model 'nvdimm'"));
return -1;
@@ -2286,7 +2286,7 @@ virDomainMemoryDefValidate(const virDomainMemoryDef *mem,
break;
case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
- if (!mem->nvdimmPath) {
+ if (!mem->source.virtio_pmem.nvdimmPath) {
virReportError(VIR_ERR_XML_DETAIL,
_("path is required for model '%1$s'"),
virDomainMemoryModelTypeToString(mem->model));
diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
index fe78a0251a..b9d893fd86 100644
--- a/src/qemu/qemu_cgroup.c
+++ b/src/qemu/qemu_cgroup.c
@@ -553,8 +553,12 @@ qemuSetupMemoryDevicesCgroup(virDomainObj *vm,
switch (mem->model) {
case VIR_DOMAIN_MEMORY_MODEL_NVDIMM:
+ if (qemuCgroupAllowDevicePath(vm, mem->source.nvdimm.nvdimmPath,
+ VIR_CGROUP_DEVICE_RW, false) < 0)
+ return -1;
+ break;
case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
- if (qemuCgroupAllowDevicePath(vm, mem->nvdimmPath,
+ if (qemuCgroupAllowDevicePath(vm, mem->source.virtio_pmem.nvdimmPath,
VIR_CGROUP_DEVICE_RW, false) < 0)
return -1;
break;
@@ -587,8 +591,12 @@ qemuTeardownMemoryDevicesCgroup(virDomainObj *vm,
switch (mem->model) {
case VIR_DOMAIN_MEMORY_MODEL_NVDIMM:
+ if (qemuCgroupDenyDevicePath(vm, mem->source.nvdimm.nvdimmPath,
+ VIR_CGROUP_DEVICE_RWM, false) < 0)
+ return -1;
+ break;
case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
- if (qemuCgroupDenyDevicePath(vm, mem->nvdimmPath,
+ if (qemuCgroupDenyDevicePath(vm, mem->source.virtio_pmem.nvdimmPath,
VIR_CGROUP_DEVICE_RWM, false) < 0)
return -1;
break;
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 9a6840e870..67a1d4e331 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -3146,11 +3146,34 @@ qemuBuildMemoryGetPagesize(virQEMUDriverConfig *cfg,
bool *preallocRet)
{
const long system_page_size = virGetSystemPageSizeKB();
- unsigned long long pagesize = mem->pagesize;
- bool needHugepage = !!pagesize;
- bool useHugepage = !!pagesize;
+ unsigned long long pagesize = 0;
+ const char *nvdimmPath = NULL;
+ bool needHugepage = false;
+ bool useHugepage = false;
bool prealloc = false;
+ switch (mem->model) {
+ case VIR_DOMAIN_MEMORY_MODEL_DIMM:
+ pagesize = mem->source.dimm.pagesize;
+ break;
+ case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM:
+ pagesize = mem->source.virtio_mem.pagesize;
+ break;
+ case VIR_DOMAIN_MEMORY_MODEL_NVDIMM:
+ nvdimmPath = mem->source.nvdimm.nvdimmPath;
+ break;
+ case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
+ nvdimmPath = mem->source.virtio_pmem.nvdimmPath;
+ break;
+ case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC:
+ case VIR_DOMAIN_MEMORY_MODEL_NONE:
+ case VIR_DOMAIN_MEMORY_MODEL_LAST:
+ break;
+ }
+
+ needHugepage = !!pagesize;
+ useHugepage = !!pagesize;
+
if (pagesize == 0) {
virDomainHugePage *master_hugepage = NULL;
virDomainHugePage *hugepage = NULL;
@@ -3216,10 +3239,11 @@ qemuBuildMemoryGetPagesize(virQEMUDriverConfig *cfg,
/* If the NVDIMM is a real device then there's nothing to prealloc.
* If anything, we would be only wearing off the device.
* Similarly, virtio-pmem-pci doesn't need prealloc either. */
- if (mem->nvdimmPath) {
- if (!mem->nvdimmPmem &&
- mem->model != VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM)
+ if (nvdimmPath) {
+ if (mem->model == VIR_DOMAIN_MEMORY_MODEL_NVDIMM &&
+ !mem->source.nvdimm.nvdimmPmem) {
prealloc = true;
+ }
} else if (useHugepage) {
prealloc = true;
}
@@ -3286,6 +3310,8 @@ qemuBuildMemoryBackendProps(virJSONValue **backendProps,
unsigned long long pagesize = 0;
bool needHugepage = false;
bool useHugepage = false;
+ bool hasSourceNodes = false;
+ const char *nvdimmPath = NULL;
int discard = mem->discard;
bool disableCanonicalPath = false;
@@ -3324,12 +3350,36 @@ qemuBuildMemoryBackendProps(virJSONValue **backendProps,
props = virJSONValueNewObject();
+ switch (mem->model) {
+ case VIR_DOMAIN_MEMORY_MODEL_DIMM:
+ nodemask = mem->source.dimm.sourceNodes;
+ break;
+ case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM:
+ nodemask = mem->source.virtio_mem.sourceNodes;
+ break;
+ case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC:
+ nodemask = mem->source.sgx_epc.sourceNodes;
+ break;
+ case VIR_DOMAIN_MEMORY_MODEL_NVDIMM:
+ nvdimmPath = mem->source.nvdimm.nvdimmPath;
+ break;
+ case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
+ nvdimmPath = mem->source.virtio_pmem.nvdimmPath;
+ break;
+ case VIR_DOMAIN_MEMORY_MODEL_NONE:
+ case VIR_DOMAIN_MEMORY_MODEL_LAST:
+ break;
+ }
+
+ hasSourceNodes = !!nodemask;
+
if (mem->model == VIR_DOMAIN_MEMORY_MODEL_SGX_EPC) {
backendType = "memory-backend-epc";
if (!priv->memPrealloc)
prealloc = true;
- } else if (!mem->nvdimmPath &&
- def->mem.source == VIR_DOMAIN_MEMORY_SOURCE_MEMFD) {
+
+ } else if (!nvdimmPath &&
+ def->mem.source == VIR_DOMAIN_MEMORY_SOURCE_MEMFD) {
backendType = "memory-backend-memfd";
if (useHugepage &&
@@ -3343,11 +3393,11 @@ qemuBuildMemoryBackendProps(virJSONValue **backendProps,
if (systemMemory)
disableCanonicalPath = true;
- } else if (useHugepage || mem->nvdimmPath || memAccess ||
- def->mem.source == VIR_DOMAIN_MEMORY_SOURCE_FILE) {
+ } else if (useHugepage || nvdimmPath || memAccess ||
+ def->mem.source == VIR_DOMAIN_MEMORY_SOURCE_FILE) {
- if (mem->nvdimmPath) {
- memPath = g_strdup(mem->nvdimmPath);
+ if (nvdimmPath) {
+ memPath = g_strdup(nvdimmPath);
} else if (useHugepage) {
if (qemuGetDomainHupageMemPath(priv->driver, def, pagesize, &memPath) < 0)
return -1;
@@ -3363,7 +3413,7 @@ qemuBuildMemoryBackendProps(virJSONValue **backendProps,
NULL) < 0)
return -1;
- if (!mem->nvdimmPath &&
+ if (!nvdimmPath &&
virJSONValueObjectAdd(&props,
"T:discard-data", discard,
NULL) < 0) {
@@ -3423,10 +3473,13 @@ qemuBuildMemoryBackendProps(virJSONValue **backendProps,
if (virJSONValueObjectAdd(&props, "U:size", mem->size * 1024, NULL) < 0)
return -1;
- if (virJSONValueObjectAdd(&props, "P:align", mem->alignsize * 1024, NULL) < 0)
+ if (mem->model == VIR_DOMAIN_MEMORY_MODEL_NVDIMM &&
+ virJSONValueObjectAdd(&props, "P:align",
+ mem->source.nvdimm.alignsize * 1024, NULL) < 0)
return -1;
- if (mem->nvdimmPmem) {
+ if (mem->model == VIR_DOMAIN_MEMORY_MODEL_NVDIMM &&
+ mem->source.nvdimm.nvdimmPmem) {
if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_OBJECT_MEMORY_FILE_PMEM)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("nvdimm pmem property is not available "
@@ -3437,12 +3490,10 @@ qemuBuildMemoryBackendProps(virJSONValue **backendProps,
return -1;
}
- if (mem->sourceNodes) {
- nodemask = mem->sourceNodes;
- } else {
- if (virDomainNumatuneMaybeGetNodeset(def->numa, priv->autoNodeset,
- &nodemask, mem->targetNode) < 0)
- return -1;
+ if (!hasSourceNodes &&
+ virDomainNumatuneMaybeGetNodeset(def->numa, priv->autoNodeset,
+ &nodemask, mem->targetNode) < 0) {
+ return -1;
}
if (nodemask) {
@@ -3466,8 +3517,8 @@ qemuBuildMemoryBackendProps(virJSONValue **backendProps,
}
/* If none of the following is requested... */
- if (!needHugepage && !mem->sourceNodes && !nodeSpecified &&
- !mem->nvdimmPath &&
+ if (!needHugepage && !hasSourceNodes && !nodeSpecified &&
+ !nvdimmPath &&
memAccess == VIR_DOMAIN_MEMORY_ACCESS_DEFAULT &&
def->mem.source != VIR_DOMAIN_MEMORY_SOURCE_FILE &&
def->mem.source != VIR_DOMAIN_MEMORY_SOURCE_MEMFD &&
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 075a547b16..9de37e6414 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -7010,18 +7010,18 @@ qemuDomainChangeMemoryLiveValidateChange(const virDomainMemoryDef *oldDef,
return false;
}
- if (!virBitmapEqual(oldDef->sourceNodes,
- newDef->sourceNodes)) {
+ if (!virBitmapEqual(oldDef->source.virtio_mem.sourceNodes,
+ newDef->source.virtio_mem.sourceNodes)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("cannot modify memory source nodes"));
return false;
}
- if (oldDef->pagesize != newDef->pagesize) {
+ if (oldDef->source.virtio_mem.pagesize != newDef->source.virtio_mem.pagesize) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("cannot modify memory pagesize from '%1$llu' to '%2$llu'"),
- oldDef->pagesize,
- newDef->pagesize);
+ oldDef->source.virtio_mem.pagesize,
+ newDef->source.virtio_mem.pagesize);
return false;
}
diff --git a/src/qemu/qemu_namespace.c b/src/qemu/qemu_namespace.c
index 7fa43253b1..206bbd7375 100644
--- a/src/qemu/qemu_namespace.c
+++ b/src/qemu/qemu_namespace.c
@@ -372,8 +372,10 @@ qemuDomainSetupMemory(virDomainMemoryDef *mem,
{
switch (mem->model) {
case VIR_DOMAIN_MEMORY_MODEL_NVDIMM:
+ *paths = g_slist_prepend(*paths, g_strdup(mem->source.nvdimm.nvdimmPath));
+ break;
case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
- *paths = g_slist_prepend(*paths, g_strdup(mem->nvdimmPath));
+ *paths = g_slist_prepend(*paths, g_strdup(mem->source.virtio_pmem.nvdimmPath));
break;
case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC:
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 54ab21cabb..d7a4e52e7e 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3927,11 +3927,15 @@ static bool
qemuProcessDomainMemoryDefNeedHugepagesPath(const virDomainMemoryDef *mem,
const long system_pagesize)
{
+ unsigned long long pagesize = 0;
+
switch (mem->model) {
case VIR_DOMAIN_MEMORY_MODEL_DIMM:
+ pagesize = mem->source.dimm.pagesize;
+ break;
case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM:
- return mem->pagesize && mem->pagesize != system_pagesize;
-
+ pagesize = mem->source.virtio_mem.pagesize;
+ break;
case VIR_DOMAIN_MEMORY_MODEL_NONE:
case VIR_DOMAIN_MEMORY_MODEL_NVDIMM:
case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
@@ -3941,7 +3945,7 @@ qemuProcessDomainMemoryDefNeedHugepagesPath(const virDomainMemoryDef *mem,
return false;
}
- return false;
+ return pagesize != 0 && pagesize != system_pagesize;
}
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index 28e4a4cc99..4377874310 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -5066,8 +5066,8 @@ qemuValidateDomainDeviceDefMemory(virDomainMemoryDef *mem,
return -1;
}
- if (mem->sourceNodes) {
- while ((node = virBitmapNextSetBit(mem->sourceNodes, node)) >= 0) {
+ if (mem->source.sgx_epc.sourceNodes) {
+ while ((node = virBitmapNextSetBit(mem->source.sgx_epc.sourceNodes, node)) >= 0) {
if (mem->size > sgxCaps->sgxSections[node].size) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("sgx epc size %1$lld on host node %2$zd is less than requested size %3$lld"),
diff --git a/src/security/security_apparmor.c b/src/security/security_apparmor.c
index 5752cd422d..4b904500ff 100644
--- a/src/security/security_apparmor.c
+++ b/src/security/security_apparmor.c
@@ -638,16 +638,15 @@ AppArmorSetMemoryLabel(virSecurityManager *mgr,
virDomainDef *def,
virDomainMemoryDef *mem)
{
+ const char *path = NULL;
+
switch (mem->model) {
case VIR_DOMAIN_MEMORY_MODEL_NVDIMM:
+ path = mem->source.nvdimm.nvdimmPath;
+ break;
case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
- if (!virFileExists(mem->nvdimmPath)) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("%1$s: \'%2$s\' does not exist"),
- __func__, mem->nvdimmPath);
- return -1;
- }
- return reload_profile(mgr, def, mem->nvdimmPath, true);
+ path = mem->source.virtio_pmem.nvdimmPath;
+ break;
case VIR_DOMAIN_MEMORY_MODEL_NONE:
case VIR_DOMAIN_MEMORY_MODEL_DIMM:
case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM:
@@ -656,7 +655,16 @@ AppArmorSetMemoryLabel(virSecurityManager *mgr,
break;
}
- return 0;
+ if (!path)
+ return 0;
+
+ if (!virFileExists(path)) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("%1$s: \'%2$s\' does not exist"),
+ __func__, path);
+ return -1;
+ }
+ return reload_profile(mgr, def, path, true);
}
diff --git a/src/security/security_dac.c b/src/security/security_dac.c
index c7dc145621..a615c6b09e 100644
--- a/src/security/security_dac.c
+++ b/src/security/security_dac.c
@@ -1857,8 +1857,9 @@ virSecurityDACRestoreMemoryLabel(virSecurityManager *mgr,
{
switch (mem->model) {
case VIR_DOMAIN_MEMORY_MODEL_NVDIMM:
+ return virSecurityDACRestoreFileLabel(mgr, mem->source.nvdimm.nvdimmPath);
case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
- return virSecurityDACRestoreFileLabel(mgr, mem->nvdimmPath);
+ return virSecurityDACRestoreFileLabel(mgr, mem->source.virtio_pmem.nvdimmPath);
case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC:
/* We set label on SGX /dev nodes iff running with namespaces, so we
@@ -2044,9 +2045,13 @@ virSecurityDACSetMemoryLabel(virSecurityManager *mgr,
switch (mem->model) {
case VIR_DOMAIN_MEMORY_MODEL_NVDIMM:
+ return virSecurityDACSetOwnership(mgr, NULL,
+ mem->source.nvdimm.nvdimmPath,
+ user, group, true);
+
case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
return virSecurityDACSetOwnership(mgr, NULL,
- mem->nvdimmPath,
+ mem->source.virtio_pmem.nvdimmPath,
user, group, true);
case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC:
diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c
index e3e6a6115f..fdbfd5495f 100644
--- a/src/security/security_selinux.c
+++ b/src/security/security_selinux.c
@@ -1610,24 +1610,20 @@ virSecuritySELinuxSetMemoryLabel(virSecurityManager *mgr,
virDomainMemoryDef *mem)
{
virSecurityLabelDef *seclabel;
+ const char *path = NULL;
+
+ seclabel = virDomainDefGetSecurityLabelDef(def, SECURITY_SELINUX_NAME);
+ if (!seclabel || !seclabel->relabel)
+ return 0;
switch (mem->model) {
case VIR_DOMAIN_MEMORY_MODEL_NVDIMM:
- case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
- seclabel = virDomainDefGetSecurityLabelDef(def, SECURITY_SELINUX_NAME);
- if (!seclabel || !seclabel->relabel)
- return 0;
-
- if (virSecuritySELinuxSetFilecon(mgr, mem->nvdimmPath,
- seclabel->imagelabel, true) < 0)
- return -1;
+ path = mem->source.nvdimm.nvdimmPath;
+ break;
+ case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
+ path = mem->source.virtio_pmem.nvdimmPath;
break;
-
case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC:
- seclabel = virDomainDefGetSecurityLabelDef(def, SECURITY_SELINUX_NAME);
- if (!seclabel || !seclabel->relabel)
- return 0;
-
if (virSecuritySELinuxSetFilecon(mgr, DEV_SGX_VEPC,
seclabel->imagelabel, true) < 0 ||
virSecuritySELinuxSetFilecon(mgr, DEV_SGX_PROVISION,
@@ -1642,6 +1638,12 @@ virSecuritySELinuxSetMemoryLabel(virSecurityManager *mgr,
break;
}
+ if (!path)
+ return 0;
+
+ if (virSecuritySELinuxSetFilecon(mgr, path,
+ seclabel->imagelabel, true) < 0)
+ return -1;
return 0;
}
@@ -1653,36 +1655,36 @@ virSecuritySELinuxRestoreMemoryLabel(virSecurityManager *mgr,
{
int ret = -1;
virSecurityLabelDef *seclabel;
+ const char *path = NULL;
+
+ seclabel = virDomainDefGetSecurityLabelDef(def, SECURITY_SELINUX_NAME);
+ if (!seclabel || !seclabel->relabel)
+ return 0;
switch (mem->model) {
case VIR_DOMAIN_MEMORY_MODEL_NVDIMM:
- case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
- seclabel = virDomainDefGetSecurityLabelDef(def, SECURITY_SELINUX_NAME);
- if (!seclabel || !seclabel->relabel)
- return 0;
-
- ret = virSecuritySELinuxRestoreFileLabel(mgr, mem->nvdimmPath, true);
+ path = mem->source.nvdimm.nvdimmPath;
+ break;
+ case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
+ path = mem->source.virtio_pmem.nvdimmPath;
break;
-
case VIR_DOMAIN_MEMORY_MODEL_SGX_EPC:
- seclabel = virDomainDefGetSecurityLabelDef(def, SECURITY_SELINUX_NAME);
- if (!seclabel || !seclabel->relabel)
- return 0;
-
ret = virSecuritySELinuxRestoreFileLabel(mgr, DEV_SGX_VEPC, true);
if (virSecuritySELinuxRestoreFileLabel(mgr, DEV_SGX_PROVISION, true) < 0)
ret = -1;
- break;
+ return ret;
case VIR_DOMAIN_MEMORY_MODEL_DIMM:
case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM:
case VIR_DOMAIN_MEMORY_MODEL_NONE:
case VIR_DOMAIN_MEMORY_MODEL_LAST:
- ret = 0;
break;
}
- return ret;
+ if (!path)
+ return 0;
+
+ return virSecuritySELinuxRestoreFileLabel(mgr, path, true);
}
diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c
index 23e3dba7f5..bf368cac47 100644
--- a/src/security/virt-aa-helper.c
+++ b/src/security/virt-aa-helper.c
@@ -1151,8 +1151,11 @@ get_files(vahControl * ctl)
switch (mem->model) {
case VIR_DOMAIN_MEMORY_MODEL_NVDIMM:
+ if (vah_add_file(&buf, mem->source.nvdimm.nvdimmPath, "rw") != 0)
+ goto cleanup;
+ break;
case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
- if (vah_add_file(&buf, mem->nvdimmPath, "rw") != 0)
+ if (vah_add_file(&buf, mem->source.virtio_pmem.nvdimmPath, "rw") != 0)
goto cleanup;
break;
case VIR_DOMAIN_MEMORY_MODEL_DIMM: