[PATCH v2 13/15] qemuBuildThreadContextProps: Prune .node-affinity wrt <emulatorpin/>
Kristina Hanicova
khanicov at redhat.com
Wed Mar 15 11:39:17 UTC 2023
On Tue, Mar 14, 2023 at 5:53 PM Michal Privoznik <mprivozn at redhat.com>
wrote:
> When a thread-context object is specified on the cmd line, then
> QEMU spawns a thread and sets its affinity to the list of NUMA
> nodes specified in .node-affinity attribute. And this works just
> fine, until the main QEMU thread itself is not restricted.
>
> Because of v5.3.0-rc1~18 we restrict the main emulator thread
> even before QEMU is executed and thus then it tries to set
> affinity of a thread-context thread, it inevitably fails with:
>
> Setting CPU affinity failed: Invalid argument
>
> Now, we could lift the pinning temporarily, let QEMU spawn all
> thread-context threads, and enforce pinning again, but that would
> require some form of communication with QEMU (maybe -preconfig?).
> But that would still be wrong, because it would circumvent
> <emulatorpin/>.
>
> Technically speaking, thread-context is an internal
> implementation detail of QEMU, and if it weren't for it, the main
> emulator thread would be doing the allocation. Therefore, we
> should honor the pinning and prune the list of node so that
> inaccessible ones are dropped.
>
> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2154750
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> Reviewed-by: Andrea Bolognani <abologna at redhat.com>
> ---
> src/qemu/qemu_command.c | 26 ++++++++++++++++---
> src/qemu/qemu_command.h | 1 +
> ...emory-hotplug-dimm-addr.x86_64-latest.args | 2 +-
> 3 files changed, 25 insertions(+), 4 deletions(-)
>
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 6de3b549a0..7137edac8f 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -3539,7 +3539,7 @@ qemuBuildMemoryDimmBackendStr(virCommand *cmd,
> def, mem, true, false, &nodemask) < 0)
> return -1;
>
> - if (qemuBuildThreadContextProps(&tcProps, &props, priv, nodemask) < 0)
> + if (qemuBuildThreadContextProps(&tcProps, &props, def, priv,
> nodemask) < 0)
> return -1;
>
> if (tcProps &&
> @@ -3636,10 +3636,13 @@ qemuBuildMemoryDeviceProps(virQEMUDriverConfig
> *cfg,
> int
> qemuBuildThreadContextProps(virJSONValue **tcProps,
> virJSONValue **memProps,
> + const virDomainDef *def,
> qemuDomainObjPrivate *priv,
> virBitmap *nodemask)
> {
> g_autoptr(virJSONValue) props = NULL;
> + virBitmap *emulatorpin = NULL;
> + g_autoptr(virBitmap) emulatorNodes = NULL;
> g_autofree char *tcAlias = NULL;
> const char *memalias = NULL;
> bool prealloc = false;
> @@ -3656,6 +3659,23 @@ qemuBuildThreadContextProps(virJSONValue **tcProps,
> !prealloc)
> return 0;
>
> + emulatorpin = qemuDomainEvaluateCPUMask(def,
> + def->cputune.emulatorpin,
> + priv->autoNodeset);
> +
> + if (emulatorpin &&
> + virNumaIsAvailable()) {
>
Could have been on the same line.
> + if (virNumaCPUSetToNodeset(emulatorpin, &emulatorNodes) < 0)
> + return -1;
> +
> + virBitmapIntersect(emulatorNodes, nodemask);
> +
> + if (virBitmapIsAllClear(emulatorNodes))
> + return 0;
> +
> + nodemask = emulatorNodes;
> + }
> +
> memalias = virJSONValueObjectGetString(*memProps, "id");
> if (!memalias) {
> virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> @@ -7188,7 +7208,7 @@
> qemuBuildMemCommandLineMemoryDefaultBackend(virCommand *cmd,
> def, &mem, false, true, &nodemask) <
> 0)
> return -1;
>
> - if (qemuBuildThreadContextProps(&tcProps, &props, priv, nodemask) < 0)
> + if (qemuBuildThreadContextProps(&tcProps, &props, def, priv,
> nodemask) < 0)
> return -1;
>
> if (tcProps &&
> @@ -7517,7 +7537,7 @@ qemuBuildNumaCommandLine(virQEMUDriverConfig *cfg,
> g_autoptr(virJSONValue) tcProps = NULL;
>
> if (qemuBuildThreadContextProps(&tcProps, &nodeBackends[i],
> - priv, nodemask[i]) < 0)
> + def, priv, nodemask[i]) < 0)
> goto cleanup;
>
> if (tcProps &&
> diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h
> index 17f326d13b..5fdb138030 100644
> --- a/src/qemu/qemu_command.h
> +++ b/src/qemu/qemu_command.h
> @@ -153,6 +153,7 @@ qemuBuildMemoryDeviceProps(virQEMUDriverConfig *cfg,
> int
> qemuBuildThreadContextProps(virJSONValue **tcProps,
> virJSONValue **memProps,
> + const virDomainDef *def,
> qemuDomainObjPrivate *priv,
> virBitmap *nodemask);
>
> diff --git
> a/tests/qemuxml2argvdata/memory-hotplug-dimm-addr.x86_64-latest.args
> b/tests/qemuxml2argvdata/memory-hotplug-dimm-addr.x86_64-latest.args
> index 84360843fb..6ae1fd1b98 100644
> --- a/tests/qemuxml2argvdata/memory-hotplug-dimm-addr.x86_64-latest.args
> +++ b/tests/qemuxml2argvdata/memory-hotplug-dimm-addr.x86_64-latest.args
> @@ -28,7 +28,7 @@
> XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
> -no-shutdown \
> -boot strict=on \
> -device
> '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \
> --object
> '{"qom-type":"thread-context","id":"tc-memdimm0","node-affinity":[1,2,3]}' \
> +-object
> '{"qom-type":"thread-context","id":"tc-memdimm0","node-affinity":[1,2]}' \
> -object
> '{"qom-type":"memory-backend-file","id":"memdimm0","mem-path":"/dev/hugepages2M/libvirt/qemu/-1-QEMUGuest1","prealloc":true,"size":536870912,"host-nodes":[1,2,3],"policy":"bind","prealloc-context":"tc-memdimm0"}'
> \
> -device
> '{"driver":"pc-dimm","node":0,"memdev":"memdimm0","id":"dimm0","slot":0,"addr":4294967296}'
> \
> -object
> '{"qom-type":"memory-backend-ram","id":"memdimm2","size":536870912}' \
> --
> 2.39.2
>
>
Reviewed-by: Kristina Hanicova <khanicov at redhat.com>
Kristina
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20230315/6f60553e/attachment-0001.htm>
More information about the libvir-list
mailing list