[libvirt] [PATCHv3] conf: Add the cpu duplicate use check for vm numa settings

https://bugzilla.redhat.com/show_bug.cgi?id=1176020 We had a check for the vcpu count total number in <numa> before, however this check is not good enough. There are some examples: 1. one of cpu id is out of maxvcpus, can set success(cpu count = 5 < 10): <vcpu placement='static'>10</vcpu> <cell id='0' cpus='0-3,100' memory='512000' unit='KiB'/> 2. use the same cpu in 2 cell, can set success(cpu count = 8 < 10): <vcpu placement='static'>10</vcpu> <cell id='0' cpus='0-3' memory='512000' unit='KiB'/> <cell id='1' cpus='0-3' memory='512000' unit='KiB'/> 3. use the same cpu in 2 cell, cannot set success(cpu count = 11 > 10): <vcpu placement='static'>10</vcpu> <cell id='0' cpus='0-6' memory='512000' unit='KiB'/> <cell id='1' cpus='0-3' memory='512000' unit='KiB'/> Add a check for numa cpus, check if duplicate use one cpu in more than one cell. Signed-off-by: Luyao Huang <lhuang@redhat.com> --- v3: remove the max vcpu check, just add a check when parse the numa settings, and change the subject. src/conf/numa_conf.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/conf/numa_conf.c b/src/conf/numa_conf.c index 7ad3f66..e25d7a8 100644 --- a/src/conf/numa_conf.c +++ b/src/conf/numa_conf.c @@ -738,6 +738,15 @@ virDomainNumaDefCPUParseXML(virDomainNumaPtr def, } VIR_FREE(tmp); + for (j = 0; j < i; j++) { + if (virBitmapOverlaps(def->mem_nodes[j].cpumask, + def->mem_nodes[i].cpumask)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("NUMA cells %zu and %zu have overlapping vCPU ids"), i, j); + goto cleanup; + } + } + ctxt->node = nodes[i]; if (virDomainParseMemory("./@memory", "./@unit", ctxt, &def->mem_nodes[cur_cell].mem, true, false) < 0) -- 1.8.3.1

On 05.05.2015 12:13, Luyao Huang wrote:
https://bugzilla.redhat.com/show_bug.cgi?id=1176020
We had a check for the vcpu count total number in <numa> before, however this check is not good enough. There are some examples:
1. one of cpu id is out of maxvcpus, can set success(cpu count = 5 < 10):
<vcpu placement='static'>10</vcpu> <cell id='0' cpus='0-3,100' memory='512000' unit='KiB'/>
2. use the same cpu in 2 cell, can set success(cpu count = 8 < 10): <vcpu placement='static'>10</vcpu> <cell id='0' cpus='0-3' memory='512000' unit='KiB'/> <cell id='1' cpus='0-3' memory='512000' unit='KiB'/>
3. use the same cpu in 2 cell, cannot set success(cpu count = 11 > 10): <vcpu placement='static'>10</vcpu> <cell id='0' cpus='0-6' memory='512000' unit='KiB'/> <cell id='1' cpus='0-3' memory='512000' unit='KiB'/>
Add a check for numa cpus, check if duplicate use one cpu in more than one cell.
Signed-off-by: Luyao Huang <lhuang@redhat.com> --- v3: remove the max vcpu check, just add a check when parse the numa settings, and change the subject.
src/conf/numa_conf.c | 9 +++++++++ 1 file changed, 9 insertions(+)
diff --git a/src/conf/numa_conf.c b/src/conf/numa_conf.c index 7ad3f66..e25d7a8 100644 --- a/src/conf/numa_conf.c +++ b/src/conf/numa_conf.c @@ -738,6 +738,15 @@ virDomainNumaDefCPUParseXML(virDomainNumaPtr def, } VIR_FREE(tmp);
+ for (j = 0; j < i; j++) { + if (virBitmapOverlaps(def->mem_nodes[j].cpumask, + def->mem_nodes[i].cpumask)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("NUMA cells %zu and %zu have overlapping vCPU ids"), i, j); + goto cleanup; + } + } + ctxt->node = nodes[i]; if (virDomainParseMemory("./@memory", "./@unit", ctxt, &def->mem_nodes[cur_cell].mem, true, false) < 0)
Even though this does not compile, I'm squashing in the obvious fix, ACKing and pushing. Michal

On 05/05/2015 07:35 PM, Michal Privoznik wrote:
On 05.05.2015 12:13, Luyao Huang wrote:
https://bugzilla.redhat.com/show_bug.cgi?id=1176020
We had a check for the vcpu count total number in <numa> before, however this check is not good enough. There are some examples:
1. one of cpu id is out of maxvcpus, can set success(cpu count = 5 < 10):
<vcpu placement='static'>10</vcpu> <cell id='0' cpus='0-3,100' memory='512000' unit='KiB'/>
2. use the same cpu in 2 cell, can set success(cpu count = 8 < 10): <vcpu placement='static'>10</vcpu> <cell id='0' cpus='0-3' memory='512000' unit='KiB'/> <cell id='1' cpus='0-3' memory='512000' unit='KiB'/>
3. use the same cpu in 2 cell, cannot set success(cpu count = 11 > 10): <vcpu placement='static'>10</vcpu> <cell id='0' cpus='0-6' memory='512000' unit='KiB'/> <cell id='1' cpus='0-3' memory='512000' unit='KiB'/>
Add a check for numa cpus, check if duplicate use one cpu in more than one cell.
Signed-off-by: Luyao Huang <lhuang@redhat.com> --- v3: remove the max vcpu check, just add a check when parse the numa settings, and change the subject.
src/conf/numa_conf.c | 9 +++++++++ 1 file changed, 9 insertions(+)
diff --git a/src/conf/numa_conf.c b/src/conf/numa_conf.c index 7ad3f66..e25d7a8 100644 --- a/src/conf/numa_conf.c +++ b/src/conf/numa_conf.c @@ -738,6 +738,15 @@ virDomainNumaDefCPUParseXML(virDomainNumaPtr def, } VIR_FREE(tmp);
+ for (j = 0; j < i; j++) { + if (virBitmapOverlaps(def->mem_nodes[j].cpumask, + def->mem_nodes[i].cpumask)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("NUMA cells %zu and %zu have overlapping vCPU ids"), i, j); + goto cleanup; + } + } + ctxt->node = nodes[i]; if (virDomainParseMemory("./@memory", "./@unit", ctxt, &def->mem_nodes[cur_cell].mem, true, false) < 0)
Even though this does not compile, I'm squashing in the obvious fix, ACKing and pushing.
Thanks for your quick review !
Michal
Luyao
participants (2)
-
Luyao Huang
-
Michal Privoznik