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:
parent
0ba1f53191
commit
763952d08b
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user