# mem-phys-addr.py: Resolve physical address samples # SPDX-License-Identifier: GPL-2.0 # # Copyright (c) 2018, Intel Corporation. import os import sys import re import bisect import collections from dataclasses import dataclass from typing import (Dict, Optional) sys.path.append(os.environ['PERF_EXEC_PATH'] + \ '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') @dataclass(frozen=True) class IomemEntry: """Read from a line in /proc/iomem""" begin: int end: int indent: int label: str # Physical memory layout from /proc/iomem. Key is the indent and then # a list of ranges. iomem: Dict[int, list[IomemEntry]] = collections.defaultdict(list) # Child nodes from the iomem parent. children: Dict[IomemEntry, set[IomemEntry]] = collections.defaultdict(set) # Maximum indent seen before an entry in the iomem file. max_indent: int = 0 # Count for each range of memory. load_mem_type_cnt: Dict[IomemEntry, int] = collections.Counter() # Perf event name set from the first sample in the data. event_name: Optional[str] = None def parse_iomem(): """Populate iomem from /proc/iomem file""" global iomem global max_indent global children with open('/proc/iomem', 'r', encoding='ascii') as f: for line in f: indent = 0 while line[indent] == ' ': indent += 1 if indent > max_indent: max_indent = indent m = re.split('-|:', line, 2) begin = int(m[0], 16) end = int(m[1], 16) label = m[2].strip() entry = IomemEntry(begin, end, indent, label) # Before adding entry, search for a parent node using its begin. if indent > 0: parent = find_memory_type(begin) assert parent, f"Given indent expected a parent for {label}" children[parent].add(entry) iomem[indent].append(entry) def find_memory_type(phys_addr) -> Optional[IomemEntry]: """Search iomem for the range containing phys_addr with the maximum indent""" for i in range(max_indent, -1, -1): if i not in iomem: continue position = bisect.bisect_right(iomem[i], phys_addr, key=lambda entry: entry.begin) if position is None: continue iomem_entry = iomem[i][position-1] if iomem_entry.begin <= phys_addr <= iomem_entry.end: return iomem_entry print(f"Didn't find {phys_addr}") return None def print_memory_type(): print(f"Event: {event_name}") print(f"{'Memory type':<40} {'count':>10} {'percentage':>10}") print(f"{'-' * 40:<40} {'-' * 10:>10} {'-' * 10:>10}") total = sum(load_mem_type_cnt.values()) # Add count from children into the parent. for i in range(max_indent, -1, -1): if i not in iomem: continue for entry in iomem[i]: global children for child in children[entry]: if load_mem_type_cnt[child] > 0: load_mem_type_cnt[entry] += load_mem_type_cnt[child] def print_entries(entries): """Print counts from parents down to their children""" global children for entry in sorted(entries, key = lambda entry: load_mem_type_cnt[entry], reverse = True): count = load_mem_type_cnt[entry] if count > 0: mem_type = ' ' * entry.indent + f"{entry.begin:x}-{entry.end:x} : {entry.label}" percent = 100 * count / total print(f"{mem_type:<40} {count:>10} {percent:>10.1f}") print_entries(children[entry]) print_entries(iomem[0]) def trace_begin(): parse_iomem() def trace_end(): print_memory_type() def process_event(param_dict): if "sample" not in param_dict: return sample = param_dict["sample"] if "phys_addr" not in sample: return phys_addr = sample["phys_addr"] entry = find_memory_type(phys_addr) if entry: load_mem_type_cnt[entry] += 1 global event_name if event_name is None: event_name = param_dict["ev_name"] n> Hosts the 0x221E linux distro kernel.Ubuntu
summaryrefslogtreecommitdiff
path: root/tools/testing/selftests/bpf/sdt-config.h
inux-6.12.y&id=a7789fd4caaf96ecfed5e28c4cddb927e6bebadb'>net: hsr: prevent NULL pointer dereference in hsr_proxy_announce()
AgeCommit message (Expand)Author
2022-04-05selftests/bpf: Add basic USDT selftestsAndrii Nakryiko
Jeongjun Park
2024-09-11net: hsr: Remove interlink_sequence_nr.Eric Dumazet
2024-09-09net: hsr: remove seqnr_lockEric Dumazet
2024-09-03netdev_features: convert NETIF_F_NETNS_LOCAL to dev->netns_localAlexander Lobakin
2024-09-03netdev_features: convert NETIF_F_LLTX to dev->lltxAlexander Lobakin
2024-06-14net: hsr: Send supervisory frames to HSR network with ProxyNodeTable dataLukasz Majewski
2024-05-09Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/netJakub Kicinski
2024-05-08hsr: Simplify code for announcing HSR nodes timer setupLukasz Majewski
2024-05-07net: annotate writes on dev->mtu from ndo_change_mtu()Eric Dumazet
2024-04-29net: hsr: init prune_proxy_timer soonerEric Dumazet
2024-04-26net: hsr: Provide RedBox support (HSR-SAN)Lukasz Majewski
2024-03-29net: hsr: Use full string description when opening HSR network deviceLukasz Majewski
2024-02-21net: hsr: constify the struct device_type usageRicardo B. Marliere
2024-02-14net: add netdev_set_operstate() helperEric Dumazet
2024-02-14net-sysfs: convert dev->operstate reads to lockless onesEric Dumazet
2024-01-29net: hsr: remove WARN_ONCE() in send_hsr_supervision_frame()Nikita Zhandarovich
2023-11-22net: hsr: Add support for MC filtering at the slave deviceMurali Karicheri
2023-06-21net: hsr: Disable promiscuous mode in offload modeRavi Gunasekaran
2022-12-01hsr: Use a single struct for self_node.Sebastian Andrzej Siewior
2022-12-01hsr: Synchronize sending frames to have always incremented outgoing seq nr.Sebastian Andrzej Siewior
2022-12-01hsr: Disable netpoll.Sebastian Andrzej Siewior
2022-12-01Revert "net: hsr: use hlist_head instead of list_head for mac addresses"Sebastian Andrzej Siewior
2022-03-11net: add per-cpu storage and net->core_statsEric Dumazet
2022-02-06net: hsr: use hlist_head instead of list_head for mac addressesJuhee Kang
2021-11-29net: Write lock dev_base_lock without disabling bottom halves.Sebastian Andrzej Siewior
2021-10-26net: hsr: Add support for redbox supervision framesAndreas Oetken
2021-10-02net: use eth_hw_addr_set() instead of ether_addr_copy()Jakub Kicinski