Skip to content

Commit

Permalink
scripts/gdb: add class to iterate over CPU masks
Browse files Browse the repository at this point in the history
Will be used first to count module references.  It is optimized to read
the mask only once per stop.

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 116b47b commit 3d4cd9c
Showing 1 changed file with 54 additions and 0 deletions.
54 changes: 54 additions & 0 deletions scripts/gdb/linux/cpus.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,60 @@ def per_cpu(var_ptr, cpu):
return pointer.cast(var_ptr.type).dereference()


cpu_mask = {}


def cpu_mask_invalidate(event):
global cpu_mask
cpu_mask = {}
gdb.events.stop.disconnect(cpu_mask_invalidate)
if hasattr(gdb.events, 'new_objfile'):
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
break

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

cpu = self.entry * self.bits_per_entry + self.bit

self.bits >>= 1
self.bit += 1

return cpu


class PerCpu(gdb.Function):
"""Return per-cpu variable.
Expand Down

0 comments on commit 3d4cd9c

Please sign in to comment.