Skip to content

Commit 86d610e

Browse files
committed
e2e: support "cpus-present" in topology.json
cpus-present enables creating virtual machines with different numbers of possible and enabled CPUs. CPUs that are possible but not enabled can be hot-plugged when the virtual machine is running. q35 machine, irq split and x2apic are required for hot-plugging CPUs with id >= 256. In case of "separated_output_vars", they are now printed in place of former "CPU:" parameter. This moves Qemu "-cpu" parameter management to topology2qemuopts while it used to be hardcoded "-cpu host" in Vagrantfile.in. Finally, new "SMP:" parameter printing is added for "-smp" parameters. Signed-off-by: Antti Kervinen <antti.kervinen@intel.com>
1 parent 00c774b commit 86d610e

File tree

1 file changed

+16
-3
lines changed

1 file changed

+16
-3
lines changed

test/e2e/lib/topology2qemuopts.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
The default is 1.
2525
"packages" number of packages.
2626
The default is 1.
27+
"cpus-present" number of logical CPUs present in the system.
28+
The default value 0 means "all".
2729
2830
NUMA node distances are defined with following keys:
2931
"dist-all": [[from0to0, from0to1, ...], [from1to0, from1to1, ...], ...]
@@ -108,13 +110,15 @@ def validate(numalist):
108110
raise ValueError('expected list containing dicts, got %s' % (type(numalist,).__name__))
109111
valid_keys = set(("mem", "nvmem", "dimm",
110112
"cores", "threads", "nodes", "dies", "packages",
113+
"cpus-present",
111114
"node-dist", "dist-all",
112115
"dist-other-package", "dist-same-package", "dist-same-die"))
113116
int_range_keys = {'cores': ('>= 0', lambda v: v >= 0),
114117
'threads': ('> 0', lambda v: v > 0),
115118
'nodes': ('> 0', lambda v: v > 0),
116119
'dies': ('> 0', lambda v: v > 0),
117-
'packages': ('> 0', lambda v: v > 0)}
120+
'packages': ('> 0', lambda v: v > 0),
121+
'cpus-present': ('>= 0', lambda v: v >=0)}
118122
for numalistindex, numaspec in enumerate(numalist):
119123
for key in numaspec:
120124
if not key in valid_keys:
@@ -210,12 +214,14 @@ def dists(numalist):
210214
return dist_dict
211215

212216
def qemuopts(numalist):
213-
machineparam = "-machine pc"
217+
machineparam = "-machine q35,kernel-irqchip=split"
218+
cpuparam = "-cpu host,x2apic=on"
214219
numaparams = []
215220
objectparams = []
216221
deviceparams = []
217222
lastnode = -1
218223
lastcpu = -1
224+
lastcpupresent = -1
219225
lastdie = -1
220226
lastsocket = -1
221227
lastmem = -1
@@ -249,6 +255,7 @@ def qemuopts(numalist):
249255
cpucount = int(numaspec.get("cores", 0)) * threadcount # logical cpus per numa node (cores * threads)
250256
diecount = int(numaspec.get("dies", 1))
251257
packagecount = int(numaspec.get("packages", 1))
258+
cpuspresentcount = int(numaspec.get("cpus-present", 0))
252259
memsize = numaspec.get("mem", "0")
253260
memdimm = numaspec.get("dimm", "")
254261
if memsize != "0":
@@ -333,6 +340,10 @@ def qemuopts(numalist):
333340
currentnumaparams.append("node,nodeid=%s" % (lastnode,))
334341
currentnumaparams[-1] = currentnumaparams[-1] + (",cpus=%s-%s" % (lastcpu + 1, lastcpu + cpucount))
335342
lastcpu += cpucount
343+
if cpuspresentcount > 0:
344+
lastcpupresent = cpuspresentcount - 1
345+
else:
346+
lastcpupresent += cpucount
336347
numaparams.extend(currentnumaparams)
337348
node_node_dist = dists(numalist)
338349
for sourcenode in sorted(node_node_dist.keys()):
@@ -350,7 +361,7 @@ def qemuopts(numalist):
350361
# Don't give dies parameter unless it is absolutely necessary
351362
# because it requires Qemu >= 5.0.
352363
diesparam = ""
353-
cpuparam = "-smp cpus=%s,threads=%s%s,sockets=%s" % (lastcpu + 1, threadcount, diesparam, lastsocket + 1)
364+
smpparam = "-smp cpus=%s,threads=%s%s,sockets=%s,maxcpus=%s" % (lastcpupresent + 1, threadcount, diesparam, lastsocket + 1, lastcpu + 1)
354365
maxmem = siadd(totalmem, totalnvmem)
355366
startmem = sisub(sisub(maxmem, unpluggedmem), pluggedmem)
356367
memparam = "-m size=%s,slots=%s,maxmem=%s" % (startmem, memslots, maxmem)
@@ -362,6 +373,7 @@ def qemuopts(numalist):
362373
if separated_output_vars == True:
363374
return ("MACHINE:" + machineparam + "|" +
364375
"CPU:" + cpuparam + "|" +
376+
"SMP:" + smpparam + "|" +
365377
"MEM:" + memparam + "|" +
366378
"EXTRA:" +
367379
", ".join(map(lambda x: "\"" + x + "\"", numaparams)) +
@@ -373,6 +385,7 @@ def qemuopts(numalist):
373385
else:
374386
return (machineparam + " " +
375387
cpuparam + " " +
388+
smpparam + " " +
376389
memparam + " " +
377390
" ".join(numaparams) +
378391
" " +

0 commit comments

Comments
 (0)