lkml.org 
[lkml]   [2015]   [Jan]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v11 19/28] scripts/gdb: Add class to iterate over CPU masks
    Date
    Will be used first to count module references. It is optimized to read
    the mask only once per stop.

    Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
    ---
    scripts/gdb/linux/cpus.py | 54 +++++++++++++++++++++++++++++++++++++++++++++++
    1 file changed, 54 insertions(+)

    diff --git a/scripts/gdb/linux/cpus.py b/scripts/gdb/linux/cpus.py
    index b683da9..c1441f2 100644
    --- a/scripts/gdb/linux/cpus.py
    +++ b/scripts/gdb/linux/cpus.py
    @@ -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.

    --
    2.1.4


    \
     
     \ /
      Last update: 2015-01-29 08:21    [W:4.040 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site