diff --git a/model/numa/__init__.py b/model/numa/__init__.py index d32abb5b847cf62dfd4bdeb5ebb6f2a7e6ba526a..e06ed909c5d03855f81789402dc1382f02e3bdd7 100644 --- a/model/numa/__init__.py +++ b/model/numa/__init__.py @@ -151,9 +151,36 @@ class cmd_numa(gdb.Command): if args: gdb.execute("numa {}".format(args)) +def size_fmt(num, suffix='B'): + for unit in ['','Ki','Mi','Gi','Ti','Pi','Ei','Zi']: + if abs(num) < 1024.0: + return "%3.0f%s%s" % (num, unit, suffix) + num /= 1024.0 + return "%.0f%s%s" % (num, 'Yi', suffix) + +class cmd_numa_spread_pages(gdb.Command): + def __init__ (self): + gdb.Command.__init__ (self, "numa spread_pages", gdb.COMMAND_NONE) + + def invoke (self, args, from_tty): + if gdb.selected_inferior().pid == 0: + log_user.error("No PID for this inferior. Is it running?") + return + + with open("/proc/{}/maps".format(gdb.selected_inferior().pid)) as fmap: + # search for "00601000-00622000 rw-p 00000000 00:00 0 [heap]" + for line in fmap.readlines(): + if "heap" in line: break + start, stop = line.split(" ")[0].split("-") + start, stop = int(start, 16), int(stop, 16) + size = size_fmt(stop - start) + log_user.info("Process heap goes from {} to {} (={})".format(hex(start), hex(stop), size)) + def on_activated(): cmd_numa_current_node() cmd_numa_pagemap() cmd_numa_current_node_by_call() + cmd_numa_spread_pages() + def initialize(): cmd_numa()