kvm_stat: Only consider online cpus

In kvm_stat we grovel through /sys to find out how many cpus are in the
system. However if a cpu is offline it will still be present in /sys,
and the perf_event_open() will fail.

Modify the logic to only return online cpus. We need to be careful on
systems which don't support cpu hotplug, the online file will not be
present at all.

Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Michael Ellerman 2014-06-17 17:54:30 +10:00 committed by Paolo Bonzini
parent 0ba1f53191
commit 763952d08b

View File

@ -311,18 +311,30 @@ class TracepointProvider(object):
self.select(fields) self.select(fields)
def fields(self): def fields(self):
return self._fields return self._fields
def _online_cpus(self):
l = []
pattern = r'cpu([0-9]+)'
basedir = '/sys/devices/system/cpu'
for entry in os.listdir(basedir):
match = re.match(pattern, entry)
if not match:
continue
path = os.path.join(basedir, entry, 'online')
if os.path.exists(path) and open(path).read().strip() != '1':
continue
l.append(int(match.group(1)))
return l
def _setup(self, _fields): def _setup(self, _fields):
self._fields = _fields self._fields = _fields
cpure = r'cpu([0-9]+)' cpus = self._online_cpus()
self.cpus = [int(re.match(cpure, x).group(1))
for x in os.listdir('/sys/devices/system/cpu')
if re.match(cpure, x)]
import resource import resource
nfiles = len(self.cpus) * 1000 nfiles = len(cpus) * 1000
resource.setrlimit(resource.RLIMIT_NOFILE, (nfiles, nfiles)) resource.setrlimit(resource.RLIMIT_NOFILE, (nfiles, nfiles))
events = [] events = []
self.group_leaders = [] self.group_leaders = []
for cpu in self.cpus: for cpu in cpus:
group = Group(cpu) group = Group(cpu)
for name in _fields: for name in _fields:
tracepoint = name tracepoint = name