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
2830NUMA 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
212216def 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