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);
{
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;
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;
switch (mem->model) {
case VIR_DOMAIN_MEMORY_MODEL_DIMM:
+ if (tmp->source.dimm.pagesize != mem->source.dimm.pagesize)
+ continue;
+
+ if (!virBitmapEqual(tmp->source.dimm.sourceNodes,
+ mem->source.dimm.sourceNodes))
+ continue;
+ break;
case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM:
- /* source stuff -> match with device */
- if (tmp->pagesize != mem->pagesize)
+ if (tmp->source.virtio_mem.pagesize != mem->source.virtio_mem.pagesize)
continue;
- if (!virBitmapEqual(tmp->sourceNodes, mem->sourceNodes))
+ 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;
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'"),
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"));
_("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);
switch (def->model) {
case VIR_DOMAIN_MEMORY_MODEL_DIMM:
+ if (def->source.dimm.sourceNodes) {
+ if (!(bitmap = virBitmapFormat(def->source.dimm.sourceNodes)))
+ return -1;
+
+ virBufferAsprintf(&childBuf, "<nodemask>%s</nodemask>\n", bitmap);
+ }
+
+ if (def->source.dimm.pagesize)
+ virBufferAsprintf(&childBuf, "<pagesize unit='KiB'>%llu</pagesize>\n",
+ def->source.dimm.pagesize);
+ break;
case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_MEM:
- if (def->sourceNodes) {
- if (!(bitmap = virBitmapFormat(def->sourceNodes)))
+ if (def->source.virtio_mem.sourceNodes) {
+ if (!(bitmap = virBitmapFormat(def->source.virtio_mem.sourceNodes)))
return -1;
virBufferAsprintf(&childBuf, "<nodemask>%s</nodemask>\n", bitmap);
}
- if (def->pagesize)
+ if (def->source.virtio_mem.pagesize)
virBufferAsprintf(&childBuf, "<pagesize unit='KiB'>%llu</pagesize>\n",
- def->pagesize);
+ def->source.virtio_mem.pagesize);
break;
case VIR_DOMAIN_MEMORY_MODEL_NVDIMM:
- virBufferEscapeString(&childBuf, "<path>%s</path>\n", def->nvdimmPath);
+ virBufferEscapeString(&childBuf, "<path>%s</path>\n", def->source.nvdimm.nvdimmPath);
- if (def->alignsize)
+ if (def->source.nvdimm.alignsize)
virBufferAsprintf(&childBuf, "<alignsize unit='KiB'>%llu</alignsize>\n",
- def->alignsize);
+ def->source.nvdimm.alignsize);
- if (def->nvdimmPmem)
+ if (def->source.nvdimm.nvdimmPmem)
virBufferAddLit(&childBuf, "<pmem/>\n");
break;
case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
- virBufferEscapeString(&childBuf, "<path>%s</path>\n", def->nvdimmPath);
+ virBufferEscapeString(&childBuf, "<path>%s</path>\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, "<nodemask>%s</nodemask>\n", bitmap);
} 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 */
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;
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));
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;
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;
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;
/* 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;
}
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;
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 &&
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;
NULL) < 0)
return -1;
- if (!mem->nvdimmPath &&
+ if (!nvdimmPath &&
virJSONValueObjectAdd(&props,
"T:discard-data", discard,
NULL) < 0) {
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 "
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) {
}
/* 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 &&
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;
}
{
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:
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:
return false;
}
- return false;
+ return pagesize != 0 && pagesize != system_pagesize;
}
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"),
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:
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);
}
{
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
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:
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:
+ path = mem->source.nvdimm.nvdimmPath;
+ break;
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.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,
break;
}
+ if (!path)
+ return 0;
+
+ if (virSecuritySELinuxSetFilecon(mgr, path,
+ seclabel->imagelabel, true) < 0)
+ return -1;
return 0;
}
{
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:
+ path = mem->source.nvdimm.nvdimmPath;
+ break;
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.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);
}
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: