Will be used first to count module references. It is optimized to read
the mask only once per stop and to minimize the loop lengths.

Signed-off-by: Jan Kiszka <jan.kis...@siemens.com>
---
 scripts/gdb/percpu.py |   33 +++++++++++++++++++++++++++++++++
 1 files changed, 33 insertions(+), 0 deletions(-)

diff --git a/scripts/gdb/percpu.py b/scripts/gdb/percpu.py
index 4dab8d3..bc04188 100644
--- a/scripts/gdb/percpu.py
+++ b/scripts/gdb/percpu.py
@@ -43,6 +43,39 @@ def per_cpu(var_ptr, cpu):
        pointer = var_ptr.cast(get_long_type()) + offset
        return pointer.cast(var_ptr.type).dereference()
 
+cpu_mask = { }
+
+def for_each_cpu(mask_name, func, arg = None):
+       def invalidate_handler(event):
+               global cpu_online_mask
+               cpu_mask = { }
+               gdb.events.stop.disconnect(invalidate_handler)
+               gdb.events.new_objfile.disconnect(invalidate_handler)
+
+       global cpu_mask
+       mask = None
+       if mask_name in cpu_mask:
+               mask = cpu_mask[mask_name]
+       if mask == None:
+               mask = gdb.parse_and_eval(mask_name + ".bits")
+               cpu_mask[mask_name] = mask
+               gdb.events.stop.connect(invalidate_handler)
+               gdb.events.new_objfile.connect(invalidate_handler)
+
+       max_cpu_id = mask.type.sizeof * 8
+       bits_per_entry = mask[0].type.sizeof * 8
+       for entry in range(max_cpu_id / bits_per_entry):
+               bits = mask[entry]
+               if bits == 0:
+                       continue
+               for bit in range(bits_per_entry):
+                       if bits & 1:
+                               cpu = entry * bits_per_entry + bit
+                               func(cpu, arg)
+                       bits >>= 1
+                       if bits == 0:
+                               break
+
 
 class PerCpu(gdb.Function):
        __doc__ = "Return per-cpu variable.\n" \
-- 
1.7.3.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to