[libvirt] [PATCH 4/5] qemu: Support setting NUMA distances

Michal Privoznik mprivozn at redhat.com
Tue Nov 14 15:27:36 UTC 2017


On 11/14/2017 04:13 PM, Peter Krempa wrote:
> On Tue, Nov 14, 2017 at 15:47:39 +0100, Michal Privoznik wrote:
>> Since we already have such support for libxl all we need is qemu
>> driver adjustment. And a test case.
>>
>> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>> ---
>>  src/qemu/qemu_command.c                            | 36 +++++++++++-
>>  .../qemuxml2argv-numatune-distances.args           | 63 +++++++++++++++++++++
>>  .../qemuxml2argv-numatune-distances.xml            | 65 ++++++++++++++++++++++
>>  tests/qemuxml2argvtest.c                           |  2 +
>>  4 files changed, 165 insertions(+), 1 deletion(-)
>>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-numatune-distances.args
>>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-numatune-distances.xml
>>
>> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
>> index eb72db33b..8b9daaea3 100644
>> --- a/src/qemu/qemu_command.c
>> +++ b/src/qemu/qemu_command.c
>> @@ -7675,7 +7675,7 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg,
>>                      virCommandPtr cmd,
>>                      qemuDomainObjPrivatePtr priv)
>>  {
>> -    size_t i;
>> +    size_t i, j;
>>      virQEMUCapsPtr qemuCaps = priv->qemuCaps;
>>      virBuffer buf = VIR_BUFFER_INITIALIZER;
>>      char *cpumask = NULL, *tmpmask = NULL, *next = NULL;
>> @@ -7685,6 +7685,7 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg,
>>      int ret = -1;
>>      size_t ncells = virDomainNumaGetNodeCount(def->numa);
>>      const long system_page_size = virGetSystemPageSizeKB();
>> +    bool numa_distances = false;
>>  
>>      if (virDomainNumatuneHasPerNodeBinding(def->numa) &&
>>          !(virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_RAM) ||
>> @@ -7793,6 +7794,39 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg,
>>  
>>          virCommandAddArgBuffer(cmd, &buf);
>>      }
>> +
>> +    /* If NUMA node distance is specified for at least one pair
>> +     * of nodes, we have to specify all the distances. Even
>> +     * though they might be the default ones. */
>> +    for (i = 0; i < ncells; i++) {
>> +        for (j = 0; j < ncells; j++) {
>> +            if (!virDomainNumaNodeDistanceSpecified(def->numa, i, j))
>> +                continue;
>> +
>> +            numa_distances = true;
>> +
>> +            if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_NUMA_DIST)) {
>> +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>> +                               _("setting NUMA distances is not "
>> +                                 "supported with this qemu"));
>> +                goto cleanup;
> 
> This capability does not need to be checked in the loop. Also the loop
> does not make sense to be finished once you deduct that 'numa_distances'
> is true.

Ah. Correct. Consider this squashed in then:

diff --git i/src/qemu/qemu_command.c w/src/qemu/qemu_command.c
index 8b9daaea3..bceafb084 100644
--- i/src/qemu/qemu_command.c
+++ w/src/qemu/qemu_command.c
@@ -7804,17 +7804,18 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg,
                 continue;

             numa_distances = true;
-
-            if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_NUMA_DIST)) {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                               _("setting NUMA distances is not "
-                                 "supported with this qemu"));
-                goto cleanup;
-            }
+            break;
         }
     }

     if (numa_distances) {
+        if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_NUMA_DIST)) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("setting NUMA distances is not "
+                             "supported with this qemu"));
+            goto cleanup;
+        }
+
         for (i = 0; i < ncells; i++) {
             for (j = 0; j < ncells; j++) {
                 size_t distance =
virDomainNumaGetNodeDistance(def->numa, i, j);

Michal




More information about the libvir-list mailing list