Skip to content

Commit

Permalink
scripts/gdb: convert CpuList to generator function
Browse files Browse the repository at this point in the history
Yet another code simplification.

Signed-off-by: Jan Kiszka <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: Jason Wessel <[email protected]>
Cc: Andi Kleen <[email protected]>
Cc: Ben Widawsky <[email protected]>
Cc: Borislav Petkov <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
jan-kiszka authored and torvalds committed Feb 17, 2015
1 parent fffb944 commit a77e15e
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 40 deletions.
71 changes: 32 additions & 39 deletions scripts/gdb/linux/cpus.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,50 +61,43 @@ def cpu_mask_invalidate(event):
gdb.events.new_objfile.disconnect(cpu_mask_invalidate)


class CpuList():
def __init__(self, mask_name):
global cpu_mask
self.mask = None
if mask_name in cpu_mask:
self.mask = cpu_mask[mask_name]
if self.mask is None:
self.mask = gdb.parse_and_eval(mask_name + ".bits")
if hasattr(gdb, 'events'):
cpu_mask[mask_name] = self.mask
gdb.events.stop.connect(cpu_mask_invalidate)
if hasattr(gdb.events, 'new_objfile'):
gdb.events.new_objfile.connect(cpu_mask_invalidate)
self.bits_per_entry = self.mask[0].type.sizeof * 8
self.num_entries = self.mask.type.sizeof * 8 / self.bits_per_entry
self.entry = -1
self.bits = 0

def __iter__(self):
return self

def __next__(self):
while self.bits == 0:
self.entry += 1
if self.entry == self.num_entries:
raise StopIteration
self.bits = self.mask[self.entry]
if self.bits != 0:
self.bit = 0
def cpu_list(mask_name):
global cpu_mask
mask = None
if mask_name in cpu_mask:
mask = cpu_mask[mask_name]
if mask is None:
mask = gdb.parse_and_eval(mask_name + ".bits")
if hasattr(gdb, 'events'):
cpu_mask[mask_name] = mask
gdb.events.stop.connect(cpu_mask_invalidate)
if hasattr(gdb.events, 'new_objfile'):
gdb.events.new_objfile.connect(cpu_mask_invalidate)
bits_per_entry = mask[0].type.sizeof * 8
num_entries = mask.type.sizeof * 8 / bits_per_entry
entry = -1
bits = 0

while True:
while bits == 0:
entry += 1
if entry == num_entries:
return
bits = mask[entry]
if bits != 0:
bit = 0
break

while self.bits & 1 == 0:
self.bits >>= 1
self.bit += 1

cpu = self.entry * self.bits_per_entry + self.bit
while bits & 1 == 0:
bits >>= 1
bit += 1

self.bits >>= 1
self.bit += 1
cpu = entry * bits_per_entry + bit

return cpu
bits >>= 1
bit += 1

def next(self):
return self.__next__()
yield cpu


class PerCpu(gdb.Function):
Expand Down
2 changes: 1 addition & 1 deletion scripts/gdb/linux/modules.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ def invoke(self, arg, from_tty):
for module in module_list():
ref = 0
module_refptr = module['refptr']
for cpu in cpus.CpuList("cpu_possible_mask"):
for cpu in cpus.cpu_list("cpu_possible_mask"):
refptr = cpus.per_cpu(module_refptr, cpu)
ref += refptr['incs']
ref -= refptr['decs']
Expand Down

0 comments on commit a77e15e

Please sign in to comment.