mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
Make dom0_enforce_cpus() use vcpu_hotplug rather than directly modifying the sysfs entries.
Directly modifying the sysfs entries causes the xenstore state of a cpu's availability to be incorrect. Also slightly modify the dom0-cpus description in the xend-config. Rather than specifying which dom0 vcpus are to be used, it is now a target of how many vcpus to use as pinvcpu ops are the preferred method for setting which physical cpu a vcpu uses. Signed-off-by: Ryan Harper <ryanh@us.ibm.com> Signed-off-by: Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
This commit is contained in:
1 parent
87371321cc
commit
71a28c9e9d
4 files changed
+22
-28
No files matched your search
@@ -155,6 +155,7 @@ class XendDomain:
|
||||
if not dom0:
|
||||
dom0 = self.domain_unknown(0)
|
||||
dom0.dom0_init_store()
|
||||
dom0.dom0_enforce_cpus()
|
||||
|
||||
def close(self):
|
||||
pass
|
||||
|
||||
@@ -1120,6 +1120,26 @@ class XendDomainInfo:
|
||||
# get run-time value of vcpus and update store
|
||||
self.configure_vcpus(dom_get(self.domid)['vcpus'])
|
||||
|
||||
def dom0_enforce_cpus(self):
|
||||
dom = 0
|
||||
# get max number of cpus to use for dom0 from config
|
||||
from xen.xend import XendRoot
|
||||
xroot = XendRoot.instance()
|
||||
target = int(xroot.get_dom0_cpus())
|
||||
log.debug("number of cpus to use is %d" % (target))
|
||||
|
||||
# target = 0 means use all processors
|
||||
if target > 0:
|
||||
# count the number of online vcpus (cpu values in v2c map >= 0)
|
||||
vcpu_to_cpu = dom_get(dom)['vcpu_to_cpu']
|
||||
vcpus_online = len(filter(lambda x: x >= 0, vcpu_to_cpu))
|
||||
log.debug("found %d vcpus online" % (vcpus_online))
|
||||
|
||||
# disable any extra vcpus that are online over the requested target
|
||||
for vcpu in range(target, vcpus_online):
|
||||
log.info("enforcement is disabling DOM%d VCPU%d" % (dom, vcpu))
|
||||
self.vcpu_hotplug(vcpu, 0)
|
||||
|
||||
|
||||
def vm_field_ignore(_, _1, _2, _3):
|
||||
"""Dummy config field handler used for fields with built-in handling.
|
||||
|
||||
@@ -298,7 +298,6 @@ class Daemon:
|
||||
return self.cleanup(kill=True)
|
||||
|
||||
def run(self, status):
|
||||
_enforce_dom0_cpus()
|
||||
try:
|
||||
log.info("Xend Daemon started")
|
||||
event.listenEvent(self)
|
||||
@@ -323,32 +322,6 @@ class Daemon:
|
||||
#sys.exit(rc)
|
||||
os._exit(rc)
|
||||
|
||||
def _enforce_dom0_cpus():
|
||||
dn = xroot.get_dom0_cpus()
|
||||
|
||||
for d in glob.glob("/sys/devices/system/cpu/cpu*"):
|
||||
cpu = int(os.path.basename(d)[3:])
|
||||
if (dn == 0) or (cpu < dn):
|
||||
v = "1"
|
||||
else:
|
||||
v = "0"
|
||||
try:
|
||||
f = open("%s/online" %d, "r+")
|
||||
c = f.read(1)
|
||||
if (c != v):
|
||||
if v == "0":
|
||||
log.info("dom0 is trying to give back cpu %d", cpu)
|
||||
else:
|
||||
log.info("dom0 is trying to take cpu %d", cpu)
|
||||
f.seek(0)
|
||||
f.write(v)
|
||||
f.close()
|
||||
log.info("dom0 successfully enforced cpu %d", cpu)
|
||||
else:
|
||||
f.close()
|
||||
except:
|
||||
pass
|
||||
|
||||
def instance():
|
||||
global inst
|
||||
try:
|
||||
|
||||