[libvirt] [PATCH 2/2] qemuDomainAttachMemory: Crate hugepage dir if needed
John Ferlan
jferlan at redhat.com
Tue Jun 13 12:03:59 UTC 2017
On 06/07/2017 11:50 AM, Michal Privoznik wrote:
> https://bugzilla.redhat.com/show_bug.cgi?id=1455819
>
> It may happen that a domain is started without any huge pages.
> However, user might try to attach a DIMM module later. DIMM
> backed by huge pages (why would somebody want to mix regular and
> huge pages is beyond me). Therefore we have to create the dir if
> we haven't done so far.
>
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
> src/qemu/qemu_hotplug.c | 3 +++
> src/qemu/qemu_process.c | 20 ++++++++++++++++----
> src/qemu/qemu_process.h | 5 +++++
> 3 files changed, 24 insertions(+), 4 deletions(-)
>
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index 4a7d99725..62472aef8 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -2254,6 +2254,9 @@ qemuDomainAttachMemory(virQEMUDriverPtr driver,
> priv->qemuCaps, vm->def, mem, NULL, true) < 0)
> goto cleanup;
>
> + if (qemuProcessBuildDestroyHugepagesPath(driver, vm, mem, true) < 0)
> + goto cleanup;
> +
If this call was done after virDomainMemoryInsert, then the new check
[1] and parameter in qemuProcessBuildDestroyHugepagesPath wouldn't be
necessary, but the goto here would need to be removedef, true?
> if (qemuDomainNamespaceSetupMemory(driver, vm, mem) < 0)
> goto cleanup;
> teardowndevice = true;
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index a219a8080..823a1385f 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -3283,9 +3283,10 @@ qemuProcessReconnectCheckMemAliasOrderMismatch(virDomainObjPtr vm)
> }
>
>
> -static int
> +int
> qemuProcessBuildDestroyHugepagesPath(virQEMUDriverPtr driver,
> virDomainObjPtr vm,
> + virDomainMemoryDefPtr mem,
> bool build)
> {
> virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
> @@ -3314,6 +3315,12 @@ qemuProcessBuildDestroyHugepagesPath(virQEMUDriverPtr driver,
> }
> }
>
> + if (mem &&
> + mem->model == VIR_DOMAIN_MEMORY_MODEL_DIMM &&
> + mem->pagesize &&
> + mem->pagesize != system_pagesize)
> + shouldBuild = true;
> +
[1]
> if (!build ||
> (build && shouldBuild)) {
> for (i = 0; i < cfg->nhugetlbfs; i++) {
> @@ -3324,6 +3331,11 @@ qemuProcessBuildDestroyHugepagesPath(virQEMUDriverPtr driver,
> goto cleanup;
>
> if (build) {
> + if (virFileExists(hugepagePath)) {
> + ret = 0;
> + goto cleanup;
I was initially wondering why this wasn't an "if (build &&
virFileExists()) continue;", then it dawned on me that this code will
create the path and label it for all hugetlbfs sizes if any one of those
sizes exists, so there's no need...
> + }
> +
> if (virFileMakePathWithMode(hugepagePath, 0700) < 0) {
> virReportSystemError(errno,
> _("Unable to create %s"),
> @@ -3497,7 +3509,7 @@ qemuProcessReconnect(void *opaque)
> goto cleanup;
> }
>
> - if (qemuProcessBuildDestroyHugepagesPath(driver, obj, true) < 0)
> + if (qemuProcessBuildDestroyHugepagesPath(driver, obj, NULL, true) < 0)
> goto error;
>
> if ((qemuDomainAssignAddresses(obj->def, priv->qemuCaps,
> @@ -5541,7 +5553,7 @@ qemuProcessPrepareHost(virQEMUDriverPtr driver,
> NULL) < 0)
> goto cleanup;
>
> - if (qemuProcessBuildDestroyHugepagesPath(driver, vm, true) < 0)
> + if (qemuProcessBuildDestroyHugepagesPath(driver, vm, NULL, true) < 0)
> goto cleanup;
>
> /* Ensure no historical cgroup for this VM is lying around bogus
> @@ -6225,7 +6237,7 @@ void qemuProcessStop(virQEMUDriverPtr driver,
> goto endjob;
> }
>
> - qemuProcessBuildDestroyHugepagesPath(driver, vm, false);
> + qemuProcessBuildDestroyHugepagesPath(driver, vm, NULL, false);
>
> vm->def->id = -1;
>
> diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h
> index 830d8cef8..b63784152 100644
> --- a/src/qemu/qemu_process.h
> +++ b/src/qemu/qemu_process.h
> @@ -192,4 +192,9 @@ int qemuProcessRefreshDisks(virQEMUDriverPtr driver,
> virDomainObjPtr vm,
> qemuDomainAsyncJob asyncJob);
>
> +int qemuProcessBuildDestroyHugepagesPath(virQEMUDriverPtr driver,
> + virDomainObjPtr vm,
> + virDomainMemoryDefPtr mem,
> + bool build);
> +
Perhaps a personal pet peeve of mine, but order wise in qemu_process.c
the API is between qemuProcessStopCPUs and qemuProcessIncomingDefNew, so
why not list it thusly in the .h file...
John
> #endif /* __QEMU_PROCESS_H__ */
>
More information about the libvir-list
mailing list