Ryan Harper
2005-Nov-30 17:45 UTC
[Xen-devel] [PATCH][2nd try][RESEND] xend: add cpus config option
Updated to latest tip, commented out cpus entry in xmexample2 as per
Ian''s request. Previous description of patch and discussion [1]here.
Please apply.
1. http://lists.xensource.com/archives/html/xen-devel/2005-11/msg00763.html
--
Ryan Harper
Software Engineer; Linux Technology Center
IBM Corp., Austin, Tx
(512) 838-9253 T/L: 678-9253
ryanh@us.ibm.com
diffstat output:
docs/man/xmdomain.cfg.pod.5 | 10 ++++++
tools/examples/xmexample.vmx | 6 ++-
tools/examples/xmexample.vti | 6 ++-
tools/examples/xmexample1 | 6 ++-
tools/examples/xmexample2 | 8 +++-
tools/examples/xmexample3 | 8 +++-
tools/python/xen/xend/XendDomainInfo.py | 53 +++++++++++++++++++++++++++++---
tools/python/xen/xm/create.py | 8 ++++
tools/python/xen/xm/main.py | 4 +-
9 files changed, 91 insertions(+), 18 deletions(-)
Signed-off-by: Ryan Harper <ryanh@us.ibm.com>
---
diff -r 690b9e98b6c3 docs/man/xmdomain.cfg.pod.5
--- a/docs/man/xmdomain.cfg.pod.5 Wed Nov 30 16:12:41 2005
+++ b/docs/man/xmdomain.cfg.pod.5 Wed Nov 30 10:21:08 2005
@@ -156,6 +156,16 @@
the first cpu, 1 the second, and so on. This defaults to -1, which
means Xen is free to pick which CPU to start on.
+=item B<cpus>
+
+Specifies a list of CPUs on which the domains'' VCPUs are allowed to
+execute upon. The syntax supports ranges (0-3), and negation, ^1.
+For instance:
+
+ cpus = "0-3,5,^1"
+
+Will result in CPUs 0, 2, 3, 5 being available for use by the domain.
+
=item B<extra>
Extra information to append to the end of the kernel parameter line.
diff -r 690b9e98b6c3 tools/examples/xmexample.vmx
--- a/tools/examples/xmexample.vmx Wed Nov 30 16:12:41 2005
+++ b/tools/examples/xmexample.vmx Wed Nov 30 10:21:08 2005
@@ -30,8 +30,10 @@
# the number of cpus guest platform has, default=1
vcpus=1
-# Which CPU to start domain on?
-#cpu = -1 # leave to Xen to pick
+# List of which CPUS this domain is allowed to use, default Xen picks
+#cpus = "" # leave to Xen to pick
+#cpus = "0" # all vcpus run on CPU0
+#cpus = "0-3,5,^1" # run on cpus 0,2,3,5
# Optionally define mac and/or bridge for the network interfaces.
# Random MACs are assigned if not given.
diff -r 690b9e98b6c3 tools/examples/xmexample.vti
--- a/tools/examples/xmexample.vti Wed Nov 30 16:12:41 2005
+++ b/tools/examples/xmexample.vti Wed Nov 30 10:21:08 2005
@@ -23,8 +23,10 @@
# A name for your domain. All domains must have different names.
name = "ExampleVMXDomain"
-# Which CPU to start domain on?
-#cpu = -1 # leave to Xen to pick
+# List of which CPUS this domain is allowed to use, default Xen picks
+#cpus = "" # leave to Xen to pick
+#cpus = "0" # all vcpus run on CPU0
+#cpus = "0-3,5,^1" # run on cpus 0,2,3,5
# Disable vif for now
nics=0
diff -r 690b9e98b6c3 tools/examples/xmexample1
--- a/tools/examples/xmexample1 Wed Nov 30 16:12:41 2005
+++ b/tools/examples/xmexample1 Wed Nov 30 10:21:08 2005
@@ -22,8 +22,10 @@
# A name for your domain. All domains must have different names.
name = "ExampleDomain"
-# Which CPU to start domain on?
-#cpu = -1 # leave to Xen to pick
+# List of which CPUS this domain is allowed to use, default Xen picks
+#cpus = "" # leave to Xen to pick
+#cpus = "0" # all vcpus run on CPU0
+#cpus = "0-3,5,^1" # run on cpus 0,2,3,5
# Number of Virtual CPUS to use, default is 1
#vcpus = 1
diff -r 690b9e98b6c3 tools/examples/xmexample2
--- a/tools/examples/xmexample2 Wed Nov 30 16:12:41 2005
+++ b/tools/examples/xmexample2 Wed Nov 30 10:21:08 2005
@@ -51,9 +51,11 @@
# so we use the vmid to create a name.
name = "VM%d" % vmid
-# Which CPU to start domain on?
-#cpu = -1 # leave to Xen to pick
-cpu = vmid # set based on vmid (mod number of CPUs)
+# List of which CPUS this domain is allowed to use, default Xen picks
+#cpus = "" # leave to Xen to pick
+#cpus = "0" # all vcpus run on CPU0
+#cpus = "0-3,5,^1" # run on cpus 0,2,3,5
+#cpus = "%s" % vmid # set based on vmid (mod number of CPUs)
# Number of Virtual CPUS to use, default is 1
#vcpus = 1
diff -r 690b9e98b6c3 tools/examples/xmexample3
--- a/tools/examples/xmexample3 Wed Nov 30 16:12:41 2005
+++ b/tools/examples/xmexample3 Wed Nov 30 10:21:08 2005
@@ -51,9 +51,11 @@
# so we use the vmid to create a name.
name = "VM%d" % vmid
-# Which CPU to start domain on?
-#cpu = -1 # leave to Xen to pick
-cpu = vmid # set based on vmid (mod number of CPUs)
+# List of which CPUS this domain is allowed to use, default Xen picks
+#cpus = "" # leave to Xen to pick
+#cpus = "0" # all vcpus run on CPU0
+#cpus = "0-3,5,^1" # run on cpus 0,2,3,5
+cpus = "%s" % vmid # set based on vmid (mod number of CPUs)
#----------------------------------------------------------------------------
# Define network interfaces.
diff -r 690b9e98b6c3 tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py Wed Nov 30 16:12:41 2005
+++ b/tools/python/xen/xend/XendDomainInfo.py Wed Nov 30 10:21:08 2005
@@ -287,6 +287,7 @@
result[e[0]] = get_cfg(e[0], e[1])
result[''cpu''] = get_cfg(''cpu'',
int)
+ result[''cpus''] = get_cfg(''cpus'',
str)
result[''image''] = get_cfg(''image'')
try:
@@ -299,6 +300,43 @@
raise VmError(
''Invalid configuration setting: vcpus = %s: %s'' %
(sxp.child_value(result[''image''],
''vcpus'', 1), str(exn)))
+
+ try:
+ # support legacy config files with ''cpu'' parameter
+ # NB: prepending to list to support previous behavior
+ # where ''cpu'' parameter pinned VCPU0.
+ if result[''cpu'']:
+ if result[''cpus'']:
+ result[''cpus''] = "%s,%s" %
(str(result[''cpu'']), result[''cpus''])
+ else:
+ result[''cpus''] =
str(result[''cpu''])
+
+ # convert ''cpus'' string to list of ints
+ # ''cpus'' supports a list of ranges (0-3), seperated
by
+ # commas, and negation, (^1).
+ # Precedence is settled by order of the string:
+ # "0-3,^1" -> [0,2,3]
+ # "0-3,^1,1" -> [0,1,2,3]
+ if result[''cpus'']:
+ cpus = []
+ for c in
result[''cpus''].split('',''):
+ if c.find(''-'') != -1:
+ (x,y) = c.split(''-'')
+ for i in range(int(x),int(y)+1):
+ cpus.append(int(i))
+ else:
+ # remove this element from the list
+ if c[0] == ''^'':
+ cpus = [x for x in cpus if x != int(c[1])]
+ else:
+ cpus.append(int(c))
+
+ result[''cpus''] = cpus
+
+ except ValueError, exn:
+ raise VmError(
+ ''Invalid configuration setting: cpus = %s: %s'' %
+ (result[''cpus''], exn))
result[''backend''] = []
for c in sxp.children(config, ''backend''):
@@ -480,6 +518,7 @@
defaultInfo(''on_reboot'', lambda:
"restart")
defaultInfo(''on_crash'', lambda:
"restart")
defaultInfo(''cpu'', lambda: None)
+ defaultInfo(''cpus'', lambda: [])
defaultInfo(''cpu_weight'', lambda: 1.0)
# some domains don''t have a config file (e.g. dom0 )
@@ -1105,13 +1144,19 @@
xc.domain_setcpuweight(self.domid,
self.info[''cpu_weight''])
+ # repin domain vcpus if a restricted cpus list is provided
+ # this is done prior to memory allocation to aide in memory
+ # distribution for NUMA systems.
+ cpus = self.info[''cpus'']
+ if cpus is not None and len(cpus) > 0:
+ for v in range(0,
self.info[''max_vcpu_id'']+1):
+ # pincpu takes a list of ints
+ cpu = [ int( cpus[v % len(cpus)] ) ]
+ xc.domain_pincpu(self.domid, v, cpu)
+
m =
self.image.getDomainMemory(self.info[''memory''] * 1024)
xc.domain_setmaxmem(self.domid, m)
xc.domain_memory_increase_reservation(self.domid, m, 0, 0)
-
- cpu = self.info[''cpu'']
- if cpu is not None and cpu != -1:
- xc.domain_pincpu(self.domid, 0, 1 << cpu)
self.createChannels()
diff -r 690b9e98b6c3 tools/python/xen/xm/create.py
--- a/tools/python/xen/xm/create.py Wed Nov 30 16:12:41 2005
+++ b/tools/python/xen/xm/create.py Wed Nov 30 10:21:08 2005
@@ -154,7 +154,11 @@
gopts.var(''cpu'', val=''CPU'',
fn=set_int, default=None,
- use="CPU to run the domain on.")
+ use="CPU to run the VCPU0 on.")
+
+gopts.var(''cpus'', val=''CPUS'',
+ fn=set_int, default=None,
+ use="CPUS to run the domain on.")
gopts.var(''lapic'', val=''LAPIC'',
fn=set_int, default=0,
@@ -572,6 +576,8 @@
if vals.cpu is not None:
config.append([''cpu'', vals.cpu])
+ if vals.cpus is not None:
+ config.append([''cpus'', vals.cpus])
if vals.cpu_weight is not None:
config.append([''cpu_weight'', vals.cpu_weight])
if vals.blkif:
diff -r 690b9e98b6c3 tools/python/xen/xm/main.py
--- a/tools/python/xen/xm/main.py Wed Nov 30 16:12:41 2005
+++ b/tools/python/xen/xm/main.py Wed Nov 30 10:21:08 2005
@@ -436,7 +436,9 @@
for x in server.xend_node()[1:]:
if len(x) > 1 and x[0] == ''nr_cpus'':
nr_cpus = int(x[1])
- cpumap = filter(lambda x: x < nr_cpus, cpumap)
+ # normalize cpumap by modulus nr_cpus, and drop duplicates
+ cpumap = dict.fromkeys(
+ map(lambda x: x % nr_cpus, cpumap)).keys()
if len(cpumap) == nr_cpus:
return "any cpu"
break
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Ewan Mellor
2005-Dec-02 15:54 UTC
Re: [Xen-devel] [PATCH][2nd try][RESEND] xend: add cpus config option
On Wed, Nov 30, 2005 at 11:45:10AM -0600, Ryan Harper wrote:> > Updated to latest tip, commented out cpus entry in xmexample2 as per > Ian''s request. Previous description of patch and discussion [1]here. > > Please apply. > > 1. http://lists.xensource.com/archives/html/xen-devel/2005-11/msg00763.htmlApplied, thank you Ryan, and sorry for the delay -- it just got caught up in my Great Hunt for Bug #411 (Ongoing), amongst other things. Ewan. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel