cli: Support --cpu cellX.id (and cpus, and memory)

This allows configuring <cpu><numa><cell> bits via the command line.
This uses the optional numbering scheme described in the previous
commit.
This commit is contained in:
Cole Robinson 2016-06-14 18:19:09 -04:00
parent b785f3f594
commit 19b4cf026e
10 changed files with 76 additions and 10 deletions

View File

@ -63,6 +63,10 @@
<feature policy="disable" name="distest"/>
<feature policy="forbid" name="foo"/>
<feature policy="forbid" name="bar"/>
<numa>
<cell id="0" cpus="1,2,3" memory="1024"/>
<cell id="1" cpus="5-8" memory="256"/>
</numa>
</cpu>
<clock offset="utc">
<timer name="rtc" tickpolicy="merge"/>
@ -185,6 +189,10 @@
<feature policy="disable" name="distest"/>
<feature policy="forbid" name="foo"/>
<feature policy="forbid" name="bar"/>
<numa>
<cell id="0" cpus="1,2,3" memory="1024"/>
<cell id="1" cpus="5-8" memory="256"/>
</numa>
</cpu>
<clock offset="utc">
<timer name="rtc" tickpolicy="merge"/>

View File

@ -1,4 +1,4 @@
<feature policy="require" name="acpi"/>
</numa>
</cpu>
<clock offset="utc">
- <timer name="rtc" tickpolicy="catchup"/>

View File

@ -17,6 +17,12 @@
- <feature policy="require" name="ds_cpl"/>
- <feature policy="require" name="xtpr"/>
- <feature policy="require" name="acpi"/>
- <numa>
- <cell id="0" cpus="0" memory="1048576" unit="KiB"/>
- <cell id="1" cpus="1" memory="1048576" unit="KiB"/>
- <cell id="2" cpus="2" memory="1048576" unit="KiB"/>
- <cell id="3" cpus="3" memory="1048576" unit="KiB"/>
- </numa>
+ <cpu mode="host-passthrough">
</cpu>
<clock offset="utc">

View File

@ -1,5 +1,5 @@
<feature policy="require" name="xtpr"/>
<feature policy="require" name="acpi"/>
<cell id="3" cpus="3" memory="1048576" unit="KiB"/>
</numa>
</cpu>
- <clock offset="utc">
- <timer name="rtc" tickpolicy="catchup"/>

View File

@ -10,9 +10,9 @@
<feature policy="require" name="est"/>
<feature policy="require" name="ss"/>
@@
<feature policy="require" name="ds_cpl"/>
<feature policy="require" name="xtpr"/>
<feature policy="require" name="acpi"/>
<cell id="2" cpus="2" memory="1048576" unit="KiB"/>
<cell id="3" cpus="3" memory="1048576" unit="KiB"/>
</numa>
+ <feature policy="force" name="x2apic"/>
</cpu>
<clock offset="utc">

View File

@ -7,9 +7,9 @@
<memory mode="interleave" placement="auto"/>
</numatune>
@@
<feature policy="require" name="ds_cpl"/>
<feature policy="require" name="xtpr"/>
<feature policy="require" name="acpi"/>
<cell id="2" cpus="2" memory="1048576" unit="KiB"/>
<cell id="3" cpus="3" memory="1048576" unit="KiB"/>
</numa>
+ <topology sockets="4" cores="5" threads="1"/>
</cpu>
<clock offset="utc">

View File

@ -416,7 +416,7 @@ c.add_compare(""" \
c.add_compare("""--pxe \
--memory 512,maxmemory=1024 \
--vcpus 4,cores=2,threads=2,sockets=2 \
--cpu foobar,+x2apic,+x2apicagain,-distest,forbid=foo,forbid=bar,disable=distest2,optional=opttest,require=reqtest,match=strict,vendor=meee \
--cpu foobar,+x2apic,+x2apicagain,-distest,forbid=foo,forbid=bar,disable=distest2,optional=opttest,require=reqtest,match=strict,vendor=meee,cell.id=0,cell.cpus=1,2,3,cell.memory=1024,cell1.id=1,cell1.memory=256,cell1.cpus=5-8 \
--metadata title=my-title,description=my-description,uuid=00000000-1111-2222-3333-444444444444 \
--boot cdrom,fd,hd,network,menu=off,loader=/foo/bar \
--idmap uid_start=0,uid_target=1000,uid_count=10,gid_start=0,gid_target=1000,gid_count=10 \

View File

@ -117,6 +117,12 @@
<feature policy="require" name="ds_cpl"/>
<feature policy="require" name="xtpr"/>
<feature policy="require" name="acpi"/>
<numa>
<cell id='0' cpus='0' memory='1048576' unit='KiB'/>
<cell id='1' cpus='1' memory='1048576' unit='KiB'/>
<cell id='2' cpus='2' memory='1048576' unit='KiB'/>
<cell id='3' cpus='3' memory='1048576' unit='KiB'/>
</numa>
</cpu>
<pm>

View File

@ -1380,6 +1380,22 @@ class ParserCPU(VirtCLIParser):
objclass = CPU
remove_first = "model"
def cell_find_inst_cb(self, inst, val, virtarg, can_edit):
cpu = inst
num = 0
if re.search("\d+", virtarg.key):
num = int(re.search("\d+", virtarg.key).group())
if can_edit:
while len(cpu.cells) < (num + 1):
cpu.add_cell()
try:
return cpu.cells[num]
except IndexError:
if not can_edit:
return None
raise
def set_model_cb(self, inst, val, virtarg):
if val == "host":
val = inst.SPECIAL_MODE_HOST_MODEL
@ -1439,6 +1455,14 @@ ParserCPU.add_arg(None, "optional", is_list=True, cb=ParserCPU.set_feature_cb)
ParserCPU.add_arg(None, "disable", is_list=True, cb=ParserCPU.set_feature_cb)
ParserCPU.add_arg(None, "forbid", is_list=True, cb=ParserCPU.set_feature_cb)
# Options for CPU.cells config
ParserCPU.add_arg("id", "cell[0-9]*.id",
find_inst_cb=ParserCPU.cell_find_inst_cb)
ParserCPU.add_arg("cpus", "cell[0-9]*.cpus", can_comma=True,
find_inst_cb=ParserCPU.cell_find_inst_cb)
ParserCPU.add_arg("memory", "cell[0-9]*.memory",
find_inst_cb=ParserCPU.cell_find_inst_cb)
###################
# --vcpus parsing #

View File

@ -17,9 +17,25 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA.
from .domainnumatune import DomainNumatune
from .xmlbuilder import XMLBuilder, XMLProperty, XMLChildProperty
class _CPUCell(XMLBuilder):
"""
Class for generating <cpu><numa> child <cell> XML
"""
_XML_ROOT_NAME = "cell"
_XML_PROP_ORDER = ["id", "cpus", "memory"]
def _validate_cpuset(self, val):
DomainNumatune.validate_cpuset(self.conn, val)
id = XMLProperty("./@id", is_int=True)
cpus = XMLProperty("./@cpus", validate_cb=_validate_cpuset)
memory = XMLProperty("./@memory", is_int=True)
class CPUFeature(XMLBuilder):
"""
Class for generating <cpu> child <feature> XML
@ -88,6 +104,12 @@ class CPU(XMLBuilder):
self.remove_child(feature)
features = XMLChildProperty(CPUFeature)
cells = XMLChildProperty(_CPUCell, relative_xpath="./numa")
def add_cell(self):
obj = _CPUCell(self.conn)
self.add_child(obj)
return obj
def copy_host_cpu(self):
"""
Enact the equivalent of qemu -cpu host, pulling all info