示例#1
0
def lb_get_stats(priv):
    # Per-cpu
    if (symbol_exists("per_cpu__pcpu_lstats")):
        # 2.6.20
        addrs = percpu.get_cpu_var("pcpu_lstats")
        out = []
        for a in addrs:
            lb_stats = readSU("struct pcpu_lstats", a)
            stats = Bunch()
            stats.tx_packets = stats.rx_packets = lb_stats.packets
            stats.tx_bytes = stats.rx_bytes = lb_stats.bytes
            out.append(stats)
        return out

    elif (symbol_exists("per_cpu__loopback_stats")):
        addrs = percpu.get_cpu_var("loopback_stats")
        out = []
        for a in addrs:
            stats = readSU("struct net_device_stats", a)
            out.append(stats)
        return out
    elif (symbol_exists("init_net")): # 2.6.24
        out = []
        for cpu in range(sys_info.CPUS):
            a =  percpu.percpu_ptr(priv, cpu)
            lb_stats = readSU("struct pcpu_lstats", a)
            stats = Bunch()
            stats.tx_packets = stats.rx_packets = lb_stats.packets
            stats.tx_bytes = stats.rx_bytes = lb_stats.bytes
            out.append(stats)
        return out

    stats = readSU("struct net_device_stats", priv)
    return stats
示例#2
0
def printPerCPU():
    print ("\n\n ===== Per-CPU Data =====")
    softnet_data = percpu.get_cpu_var("softnet_data")
    netdev_rx_stat = percpu.get_cpu_var("netdev_rx_stat")
    for cpu in range(sys_info.CPUS):
        sd = readSU("struct softnet_data", softnet_data[cpu])
        print ("--CPU %d" % cpu)
        print ("\tinput_pkt_queue=0x%x qlen=%d" % \
            (Addr(sd.input_pkt_queue), sd.input_pkt_queue.qlen))
        netif_rx_stats = readSU("struct netif_rx_stats", netdev_rx_stat[cpu])
        print ("\tnetif_rx_stats total=%d, dropped=%d" % \
            (netif_rx_stats.total, netif_rx_stats.dropped))
示例#3
0
def show_cpuid_x86(options):
    phys_cpu_list = {}

    cpuinfo_addrs = percpu.get_cpu_var("cpu_info")
    for cpu, addr in enumerate(cpuinfo_addrs):
        cpuinfo_x86 = readSU("struct cpuinfo_x86", addr)
        phys_proc_id = cpuinfo_x86.phys_proc_id
        cpu_core_id = cpuinfo_x86.cpu_core_id

        cpu_core_dict = {}
        if (phys_proc_id in phys_cpu_list):
            cpu_core_dict = phys_cpu_list[phys_proc_id]

        cpu_core_dict[cpu] = cpuinfo_x86
        phys_cpu_list[phys_proc_id] = cpu_core_dict

    for phys_cpu in phys_cpu_list:
        crashcolor.set_color(crashcolor.BLUE)
        print("<<< Physical CPU %3d >>>" % (phys_cpu))
        crashcolor.set_color(crashcolor.RESET)
        core_dict = phys_cpu_list[phys_cpu]

        for cpu in core_dict:
            cpuinfo_x86 = core_dict[cpu]
            print("\tCPU %3d, core %3d : 0x%x %s" %
                  (cpu, cpuinfo_x86.cpu_core_id, cpuinfo_x86,
                   cpuinfo_x86.x86_model_id))

    print("\n\tFor details, run 'cpuinfo_x86  <address>'")
示例#4
0
def show_numa_info(options):
    try:
        numa_meminfo = readSymbol("numa_meminfo")
        nr_blks = numa_meminfo.nr_blks

        node_cpus = {}
        try:
            addrs = percpu.get_cpu_var("x86_cpu_to_node_map")
            for cpu, addr in enumerate(addrs):
                node = readInt(addr)
                if node in node_cpus:
                    cpu_list = node_cpus[node]
                else:
                    cpu_list = []
                cpu_list.append(cpu)
                node_cpus[node] = cpu_list
        except:
            pass

        print("available: %d node%s (0" %
              (nr_blks, "s" if nr_blks > 1 else ""),
              end="")
        if nr_blks > 1:
            print("-%d" % (nr_blks - 1), end="")
        print(")")
        for idx in range(0, nr_blks):
            numa_memblk = numa_meminfo.blk[idx]
            if numa_memblk.nid in node_cpus:
                print("node %d cpus: " % (numa_memblk.nid), end="")
                cpu_list = node_cpus[numa_memblk.nid]
                for cpu in range(0, len(cpu_list)):
                    print(" %d" % cpu_list[cpu], end="")
                print("")
            print("node %d : 0x%016x - 0x%016x" %
                  (numa_memblk.nid, numa_memblk.start, numa_memblk.end))
            print("node %d size : %d MB" %
                  (numa_memblk.nid,
                   (numa_memblk.end - numa_memblk.start) / (1024 * 1024)))

        if nr_blks <= 1:
            return
        numa_distance = readSymbol("numa_distance")
        numa_distance_cnt = readSymbol("numa_distance_cnt")
        print("node distances:")
        print(" %5s" % ("node"), end="")
        for i in range(0, nr_blks):
            print("%5d" % i, end="")
        print("")
        for i in range(0, numa_meminfo.nr_blks):
            print("%5d:" % (i), end="")
            for j in range(0, numa_meminfo.nr_blks):
                distance = numa_distance[i * numa_distance_cnt + j]
                print("%5d" % (distance), end="")
            print("")
    except:
        print("No NUMA information available")
示例#5
0
def show_cpufreq():
    if (not sys_info.machine in ("x86_64", "i386", "i686", "athlon")):
        print("Some information are only available on x86 architecutres")

    addrs = percpu.get_cpu_var("cpufreq_cpu_data")
    try:
        all_cpu_data = readSymbol("all_cpu_data")
    except:
        all_cpu_data = None
        pass

    for cpu, addr in enumerate(addrs):
        cpufreq_addr = readULong(addr)
        cpufreq_cpu_data = readSU('struct cpufreq_policy', cpufreq_addr)
        if (cpufreq_cpu_data == None or cpufreq_cpu_data == 0):
            print("struct cpufreq_policy = 0x%x" % (cpufreq_cpu_data))
            continue

        cur_cpu_khz = cpufreq_cpu_data.cur
        if (cur_cpu_khz == 0):
            cur_cpu_khz = readSymbol("cpu_khz")

        print("CPU %3d (0x%x) min = %d, max = %d, cur = %d" %
              (cpu, cpufreq_addr, cpufreq_cpu_data.min, cpufreq_cpu_data.max,
               cur_cpu_khz))
        if (all_cpu_data != None and all_cpu_data != 0):
            cpudata = all_cpu_data[cpu]
            print("\tcpudata = 0x%x, current_pstate = %d, turbo_pstate = %d,\n"
                  "\tmin_pstate = %d, max_pstate = %d, policy = %s" %
                  (cpudata, cpudata.pstate.current_pstate,
                   cpudata.pstate.turbo_pstate, cpudata.pstate.min_pstate,
                   cpudata.pstate.max_pstate,
                   cpufreq_policy_str(cpufreq_cpu_data.policy)))
            try:
                if (member_offset('struct cpudata', 'sample') > -1):
                    if (member_offset('struct sample', 'freq') > -1):
                        print(
                            "\t%s" %
                            (exec_crash_command("cpudata.sample.freq -d 0x%x" %
                                                (cpudata))))
                    if (member_offset('struct sample', 'time') > -1):
                        duration_ns = cpudata.sample.time - cpudata.last_sample_time
                        print("\tupdated %d ns (%d sec) ago" %\
                              (duration_ns, duration_ns / 1000000000))
            except:
                pass
示例#6
0
def print_softnet_data(details):
    from LinuxDump import percpu
    addrs = percpu.get_cpu_var("softnet_data")
    for cpu, a in enumerate(addrs):
        sd = readSU("struct softnet_data", a)
        # Print the completion queue
        print(" --CPU=%d" % cpu)
        # Count entries in the queue, it starts from sk_buff_head
        off = member_offset("struct sk_buff_head", "next")
        nq = getListSize(sd.input_pkt_queue, off, 10000)
        print("    ..input_pkt_queue has %d elements" % nq)
        if (details > 1):
            skbhead = sd.input_pkt_queue.castTo("struct sk_buff")
            for skb in readStructNext(skbhead, "next", inchead=False):
                print(skb)
                decode_skbuf(skb)

        print("    ..Completion queue")
        print_skbuff_head(sd.completion_queue)
示例#7
0
def print_blk_cpu_done(v=0):
    if (not symbol_exists("blk_cpu_done")):
        # This is an old kernel (e.g. RHEL4)
        return
    total = 0
    out = []
    for cpu, val in enumerate(get_cpu_var("blk_cpu_done")):
        lh = ListHead(val, "struct request")
        if (not len(lh)):
            continue
        total += len(lh)
        if (v > 0):
            out.append("   CPU={} Len={}".format(cpu, len(lh)))
        if (v > 1):
            for r in lh.csd:
                out.append("   {}".format(str(r)))
    if (total or v >= 0):
        print(" -- Requests on blk_cpu_done:    Count={}".format(total))
        if (v > 0 and total):
            print("\n".join(out))
    return total
示例#8
0
def show_tlb(options):
    cpuinfo_addrs = percpu.get_cpu_var("cpu_tlbstate")
    for cpu, addr in enumerate(cpuinfo_addrs):
        tlb_state = readSU("struct tlb_state", addr)
        task = 0
        if tlb_state.active_mm > 0:
            active_mm = readSU("struct mm_struct", tlb_state.active_mm)
            task = active_mm.owner

        if tlb_state.state == TLBSTATE_LAZY:
            crashcolor.set_color(crashcolor.BLUE)
        elif tlb_state.state == TLBSTATE_OK:
            crashcolor.set_color(crashcolor.LIGHTGREEN)
        if task != 0:
            task_name = task.comm
        else:
            task_name = ""

        print("CPU %3d : state = %d [%-13s], active_mm = 0x%x (%s)" %
              (cpu, tlb_state.state, tlb_str(
                  tlb_state.state), tlb_state.active_mm, task_name))
        crashcolor.set_color(crashcolor.RESET)
示例#9
0
def show_tasklet_hi_list(options):
    addrs = percpu.get_cpu_var("tasklet_hi_vec")
    show_tasklet_list_details(addrs, options)
示例#10
0
debug = API_options.debug

pointersize = sys_info.pointersize
# Fill-in the list
cpufreq_cpu_data = []

if (symbol_exists("cpufreq_cpu_data")):
    addr = sym2addr("cpufreq_cpu_data")
    # struct cpufreq_policy *cpufreq_cpu_data[NR_CPUS]

    for cpu in range(0, sys_info.CPUS):
        ptr = readPtr(addr + pointersize * cpu)
        p = readSU("struct cpufreq_policy", ptr)
        cpufreq_cpu_data.append(p)

elif (symbol_exists("per_cpu__cpufreq_cpu_data")):
    # static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data)
    vtype = percpu.get_cpu_var_type("cpufreq_cpu_data")
    for v in percpu.get_cpu_var("cpufreq_cpu_data"):
        cpufreq_cpu_data.append(readSU(vtype, v))


def print_cpufreq():
    for p in cpufreq_cpu_data:
        if (not p.governor):
            continue
        print("  CPU=%d" % p.cpu, p, p.governor.name)
        print ("      Frequencies: min=%d max=%d cur=%d" % \
            (p.min, p.max, p.cur))
示例#11
0
if (symbol_exists("sched_clock")):
    if (debug):
        print("Using sched_clock")
    # last_ran is in ns, derived from TSC
    sched_clock2ms = sched_clock2ms_26_tsc
else:
    # last_ran is in ticks, derived from jiffies
    if (debug):
        print("Using jiffies for clock base")

    if (sys_info.kernel >= "2.6.0"):
        sched_clock2ms = sched_clock2ms_26_jiffies
    else:
        sched_clock2ms = sched_clock2ms_24

runqueues_addrs = percpu.get_cpu_var("runqueues")
sys_info.runqueues_addrs = runqueues_addrs

# Older 2.6 use 'struct runqueue', newer ones 'struct rq'
rqtype = percpu.get_cpu_var_type('runqueues')
# In crash sources the order is like that:
#        if (MEMBER_EXISTS("rq", "clock"))
#                  rq_timestamp_name = "clock";
#           else if (MEMBER_EXISTS("rq", "most_recent_timestamp"))
#                  rq_timestamp_name = "most_recent_timestamp";
#            else if (MEMBER_EXISTS("rq", "timestamp_last_tick"))
#                  rq_timestamp_name = "timestamp_last_tick";

structSetAttr(rqtype, "Timestamp", [
    "clock", "most_recent_timestamp", "timestamp_last_tick", "tick_timestamp"
])