From nobody Mon Dec 1 23:34:59 2025 Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DB6132D23B8 for ; Wed, 26 Nov 2025 09:39:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764149955; cv=none; b=NnBxfE/QZFcnznBJ08WbhYrybf0aTLuQbG+ppapH69NyHi2t1/fesRiAzR7SvsrtkyUGqWnAwQ6RO9Stz0qjBFkwVnv8FufGN/IW7s/dRphv+pMXuGIDwxsJbagGxCAPkQ0B8mZ0pGn4w2cTQf+V4zFMCjfVLul7PilgGhHU0u8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764149955; c=relaxed/simple; bh=om+eQqL4kIiy2lNyumb4grIHb6MIzuA653l+7ULEiR0=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=VtHPh3LsuosZKcaeWxThg+e8o6c9KCiUbkdEw06nwiv9w2R0i5Pe2G9oKzfLkMNtPB1fPz3dyGbVyyPeEoDoUuQOUdTeFcNgb4Drq6ijPum1fA9bpKjcDy/V6CFTyWPqpzu0TOlh2VHGlJtzivtnih/0f9YGsL/NCT89G5PsF+I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com; spf=pass smtp.mailfrom=suse.com; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b=J/GAprF4; arc=none smtp.client-ip=209.85.128.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com header.b="J/GAprF4" Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-477b5e0323bso3507905e9.0 for ; Wed, 26 Nov 2025 01:39:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1764149946; x=1764754746; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=x+6xmd0GzT9/AUTeRYJ6kJi+uUQG7cdNszXI28WYXXs=; b=J/GAprF4fbY++lnqdNmdFaE6yJjzg9kHTT+tQadeZFbAf3sfD/o9QMncqE1QAbi1+z 6LgxzbTP4jEADqke17awRmBh1qM7TQ8WollrM+fh5DJvzKRF58g2UBWLKAYrKBbhrGNV SqzsL8PUpl8b4ZZwB9kVZDVgBj2l7Cj5ShySfuPk8hticQWKVYoQ09sDuTHhL8+I+1AU DYRyS7qEGv5Q5wvk7Px9BncUHXSViH3NFcb0Fx6s7w6IQlNU/kOm+eK4e17dyLFYDLC3 gTEyhiaM5U3OaWYx5VyiyNCqVbYF4QSABiJ+oK5wFaWTPqgFeUJs+pC8wFYX5ObKBSY3 WS7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764149946; x=1764754746; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=x+6xmd0GzT9/AUTeRYJ6kJi+uUQG7cdNszXI28WYXXs=; b=d8CzkKwHuUeFA1SiwBOu37NEldRezOYJTA8A9mdSyz1ARCMscCRbZELuVlGC7WaDYz PTNlhQvIaPtWBHxtwn1mtROyzTdG5AuXOyBVxiZVvM7zHUYhuJWUQTWk3tsKUpAEWwfP xP/kTuwKuCPyewGozkcm/t9wwYU/C6zL8GY2rpTGYBfwaiUjk5bZ7jK4CCM0Tr+IBjrC /pjZFTrNG4fF3Bm4IxjY6iagvD4tpeVGmyGeeyFYOEkfBAYWhFfPcltlAfUIk0Vytc+b VarosdX6/I1216CiooKAhkHRCEIw8YINC0VZ/to0ByH5sizEIIRqZZLQFoKgoLRwy1lU aCeQ== X-Forwarded-Encrypted: i=1; AJvYcCUXMHa8ZOHDSNniJaNuuXyskUHMJFshxDuWOuDtPZM/e2sib39bWCn0LDNry5dRY0OzsluM9bSY1hnhUMI=@vger.kernel.org X-Gm-Message-State: AOJu0Yxzw3VVSDUBSuhpmledKh2xBAGE9qpaZgm7/tRWUU4SnKTudXGr 115bx0V6kR+8txtBdgI7/MpYVC6NCkJcuXk4T8aKnAcEBwj1OSjAgZ39CxqEP9/PaZs= X-Gm-Gg: ASbGnct1UyMuEtTZhnZIN1VIkAu4GV0p1m3CX2mUy0g6A7XGMONJAVGkWDpStp856nS ZTYh2gMC6dWnSOi6VaO4FEB9JAF78n5BPpgnZdnV81ISNLZjZQ3c8kHvK+c+s2nbKFWhP1LJi9B 34H1k+swjHEZRqa6kVG2yDypqLskFUmB/K7LbCHlugrx0K0FHDuGw4Q9tfduqu9H9ViNHSivlRC 6AX9Dv+ahsgrFKl759lUH9dJfIFV0aqu8Eo5ucS7LrTuTJVa7hq/kjaCVKu1uHgQ6wJ8le2d5xF pUkfbr77+Y0oOJ09+1NodrWIAcqPwoHBp4Vp+zvDYMKnyOCZFgh/L3tbQZRgh72K/k8/mpHZBWf jsGzVfrMZ9AnJlCzVGODedkr4mePZuU5wPAGDv9VtF37jTY4CRdNZSb3Ra+qbLMMAYMB0wFZljD mW5n24s73MjJrrv4bLfD9xF2iTjnZp/Y+NVknuIvpfckXetdeqQA== X-Google-Smtp-Source: AGHT+IFhc5zZMh6wyGVDrg/kJjyoGsNNaAWNYZw1h4de4FZXAZS6SfLYWJk0bi/L5azz/8iO79YgQQ== X-Received: by 2002:a05:600c:2e4c:b0:477:9890:4528 with SMTP id 5b1f17b1804b1-477b9ea31e9mr141585845e9.2.1764149946038; Wed, 26 Nov 2025 01:39:06 -0800 (PST) Received: from F15.localdomain ([121.167.230.140]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3476a7a5d4asm1952757a91.11.2025.11.26.01.39.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Nov 2025 01:39:05 -0800 (PST) From: Hoyeon Lee To: bpf@vger.kernel.org Cc: Hoyeon Lee , Alexei Starovoitov , Daniel Borkmann , Andrii Nakryiko , Martin KaFai Lau , Eduard Zingerman , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Hao Luo , Jiri Olsa , Shuah Khan , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , Arnaldo Carvalho de Melo , Charlie Jenkins , Tony Ambardar , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, llvm@lists.linux.dev Subject: [PATCH bpf-next v2] tools: bpf: remove runqslower tool Date: Wed, 26 Nov 2025 18:38:11 +0900 Message-ID: <20251126093821.373291-1-hoyeon.lee@suse.com> X-Mailer: git-send-email 2.52.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" runqslower was added in commit 9c01546d26d2 "tools/bpf: Add runqslower tool to tools/bpf" as a BCC port to showcase early BPF CO-RE + libbpf workflows. runqslower continues to live in BCC (libbpf-tools), so there is no need to keep building and maintaining it. Drop tools/bpf/runqslower and remove all build hooks in tools/bpf and selftests accordingly. Signed-off-by: Hoyeon Lee --- Changes in V2: - remove RUNQSLOWER_OUTPUT variable from selftests/bpf Makefile tools/bpf/Makefile | 13 +- tools/bpf/runqslower/.gitignore | 2 - tools/bpf/runqslower/Makefile | 91 ---------- tools/bpf/runqslower/runqslower.bpf.c | 106 ----------- tools/bpf/runqslower/runqslower.c | 171 ------------------ tools/bpf/runqslower/runqslower.h | 13 -- tools/testing/selftests/bpf/.gitignore | 1 - tools/testing/selftests/bpf/Makefile | 16 +- .../selftests/bpf/test_bpftool_build.sh | 4 - 9 files changed, 4 insertions(+), 413 deletions(-) delete mode 100644 tools/bpf/runqslower/.gitignore delete mode 100644 tools/bpf/runqslower/Makefile delete mode 100644 tools/bpf/runqslower/runqslower.bpf.c delete mode 100644 tools/bpf/runqslower/runqslower.c delete mode 100644 tools/bpf/runqslower/runqslower.h diff --git a/tools/bpf/Makefile b/tools/bpf/Makefile index 062bbd6cd048..fd2585af1252 100644 --- a/tools/bpf/Makefile +++ b/tools/bpf/Makefile @@ -32,7 +32,7 @@ FEATURE_TESTS =3D libbfd disassembler-four-args disassemb= ler-init-styled FEATURE_DISPLAY =3D libbfd =20 check_feat :=3D 1 -NON_CHECK_FEAT_TARGETS :=3D clean bpftool_clean runqslower_clean resolve_b= tfids_clean +NON_CHECK_FEAT_TARGETS :=3D clean bpftool_clean resolve_btfids_clean ifdef MAKECMDGOALS ifeq ($(filter-out $(NON_CHECK_FEAT_TARGETS),$(MAKECMDGOALS)),) check_feat :=3D 0 @@ -70,7 +70,7 @@ $(OUTPUT)%.lex.o: $(OUTPUT)%.lex.c =20 PROGS =3D $(OUTPUT)bpf_jit_disasm $(OUTPUT)bpf_dbg $(OUTPUT)bpf_asm =20 -all: $(PROGS) bpftool runqslower +all: $(PROGS) bpftool =20 $(OUTPUT)bpf_jit_disasm: CFLAGS +=3D -DPACKAGE=3D'bpf_jit_disasm' $(OUTPUT)bpf_jit_disasm: $(OUTPUT)bpf_jit_disasm.o @@ -86,7 +86,7 @@ $(OUTPUT)bpf_exp.lex.c: $(OUTPUT)bpf_exp.yacc.c $(OUTPUT)bpf_exp.yacc.o: $(OUTPUT)bpf_exp.yacc.c $(OUTPUT)bpf_exp.lex.o: $(OUTPUT)bpf_exp.lex.c =20 -clean: bpftool_clean runqslower_clean resolve_btfids_clean +clean: bpftool_clean resolve_btfids_clean $(call QUIET_CLEAN, bpf-progs) $(Q)$(RM) -r -- $(OUTPUT)*.o $(OUTPUT)bpf_jit_disasm $(OUTPUT)bpf_dbg \ $(OUTPUT)bpf_asm $(OUTPUT)bpf_exp.yacc.* $(OUTPUT)bpf_exp.lex.* @@ -112,12 +112,6 @@ bpftool_install: bpftool_clean: $(call descend,bpftool,clean) =20 -runqslower: - $(call descend,runqslower) - -runqslower_clean: - $(call descend,runqslower,clean) - resolve_btfids: $(call descend,resolve_btfids) =20 @@ -125,5 +119,4 @@ resolve_btfids_clean: $(call descend,resolve_btfids,clean) =20 .PHONY: all install clean bpftool bpftool_install bpftool_clean \ - runqslower runqslower_clean \ resolve_btfids resolve_btfids_clean diff --git a/tools/bpf/runqslower/.gitignore b/tools/bpf/runqslower/.gitign= ore deleted file mode 100644 index ffdb70230c8b..000000000000 --- a/tools/bpf/runqslower/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-only -/.output diff --git a/tools/bpf/runqslower/Makefile b/tools/bpf/runqslower/Makefile deleted file mode 100644 index 78a436c4072e..000000000000 --- a/tools/bpf/runqslower/Makefile +++ /dev/null @@ -1,91 +0,0 @@ -# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) -include ../../scripts/Makefile.include - -OUTPUT ?=3D $(abspath .output)/ - -BPFTOOL_OUTPUT :=3D $(OUTPUT)bpftool/ -DEFAULT_BPFTOOL :=3D $(BPFTOOL_OUTPUT)bootstrap/bpftool -BPFTOOL ?=3D $(DEFAULT_BPFTOOL) -BPF_TARGET_ENDIAN ?=3D --target=3Dbpf -LIBBPF_SRC :=3D $(abspath ../../lib/bpf) -BPFOBJ_OUTPUT :=3D $(OUTPUT)libbpf/ -BPFOBJ :=3D $(BPFOBJ_OUTPUT)libbpf.a -BPF_DESTDIR :=3D $(BPFOBJ_OUTPUT) -BPF_INCLUDE :=3D $(BPF_DESTDIR)/include -INCLUDES :=3D -I$(OUTPUT) -I$(BPF_INCLUDE) -I$(abspath ../../include/uapi) -CFLAGS :=3D -g -Wall $(CLANG_CROSS_FLAGS) -CFLAGS +=3D $(EXTRA_CFLAGS) -LDFLAGS +=3D $(EXTRA_LDFLAGS) -LDLIBS +=3D -lelf -lz - -# Try to detect best kernel BTF source -KERNEL_REL :=3D $(shell uname -r) -VMLINUX_BTF_PATHS :=3D $(if $(O),$(O)/vmlinux) \ - $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \ - ../../../vmlinux /sys/kernel/btf/vmlinux \ - /boot/vmlinux-$(KERNEL_REL) -VMLINUX_BTF_PATH :=3D $(or $(VMLINUX_BTF),$(firstword \ - $(wildcard $(VMLINUX_BTF_PATHS)))) - -ifneq ($(V),1) -MAKEFLAGS +=3D --no-print-directory -submake_extras :=3D feature_display=3D0 -endif - -.DELETE_ON_ERROR: - -.PHONY: all clean runqslower libbpf_hdrs -all: runqslower - -runqslower: $(OUTPUT)/runqslower - -clean: - $(call QUIET_CLEAN, runqslower) - $(Q)$(RM) -r $(BPFOBJ_OUTPUT) $(BPFTOOL_OUTPUT) - $(Q)$(RM) $(OUTPUT)*.o $(OUTPUT)*.d - $(Q)$(RM) $(OUTPUT)*.skel.h $(OUTPUT)vmlinux.h - $(Q)$(RM) $(OUTPUT)runqslower - $(Q)$(RM) -r .output - -libbpf_hdrs: $(BPFOBJ) - -$(OUTPUT)/runqslower: $(OUTPUT)/runqslower.o $(BPFOBJ) - $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@ - -$(OUTPUT)/runqslower.o: runqslower.h $(OUTPUT)/runqslower.skel.h \ - $(OUTPUT)/runqslower.bpf.o | libbpf_hdrs - -$(OUTPUT)/runqslower.bpf.o: $(OUTPUT)/vmlinux.h runqslower.h | libbpf_hdrs - -$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(BPFTOOL) - $(QUIET_GEN)$(BPFTOOL) gen skeleton $< > $@ - -$(OUTPUT)/%.bpf.o: %.bpf.c $(BPFOBJ) | $(OUTPUT) - $(QUIET_GEN)$(CLANG) -g -O2 $(BPF_TARGET_ENDIAN) $(INCLUDES) \ - -c $(filter %.c,$^) -o $@ && \ - $(LLVM_STRIP) -g $@ - -$(OUTPUT)/%.o: %.c | $(OUTPUT) - $(QUIET_CC)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@ - -$(OUTPUT) $(BPFOBJ_OUTPUT) $(BPFTOOL_OUTPUT): - $(QUIET_MKDIR)mkdir -p $@ - -$(OUTPUT)/vmlinux.h: $(VMLINUX_BTF_PATH) | $(OUTPUT) $(BPFTOOL) -ifeq ($(VMLINUX_H),) - $(Q)if [ ! -e "$(VMLINUX_BTF_PATH)" ] ; then \ - echo "Couldn't find kernel BTF; set VMLINUX_BTF to" \ - "specify its location." >&2; \ - exit 1;\ - fi - $(QUIET_GEN)$(BPFTOOL) btf dump file $(VMLINUX_BTF_PATH) format c > $@ -else - $(Q)cp "$(VMLINUX_H)" $@ -endif - -$(BPFOBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(BPF= OBJ_OUTPUT) - $(Q)$(MAKE) $(submake_extras) -C $(LIBBPF_SRC) OUTPUT=3D$(BPFOBJ_OUTPUT) \ - DESTDIR=3D$(BPFOBJ_OUTPUT) prefix=3D $(abspath $@) install_headers - -$(DEFAULT_BPFTOOL): | $(BPFTOOL_OUTPUT) - $(Q)$(MAKE) $(submake_extras) -C ../bpftool OUTPUT=3D$(BPFTOOL_OUTPUT) bo= otstrap diff --git a/tools/bpf/runqslower/runqslower.bpf.c b/tools/bpf/runqslower/r= unqslower.bpf.c deleted file mode 100644 index fced54a3adf6..000000000000 --- a/tools/bpf/runqslower/runqslower.bpf.c +++ /dev/null @@ -1,106 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -// Copyright (c) 2019 Facebook -#include "vmlinux.h" -#include -#include "runqslower.h" - -#define TASK_RUNNING 0 -#define BPF_F_CURRENT_CPU 0xffffffffULL - -const volatile __u64 min_us =3D 0; -const volatile pid_t targ_pid =3D 0; - -struct { - __uint(type, BPF_MAP_TYPE_TASK_STORAGE); - __uint(map_flags, BPF_F_NO_PREALLOC); - __type(key, int); - __type(value, u64); -} start SEC(".maps"); - -struct { - __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); - __uint(key_size, sizeof(u32)); - __uint(value_size, sizeof(u32)); -} events SEC(".maps"); - -/* record enqueue timestamp */ -__always_inline -static int trace_enqueue(struct task_struct *t) -{ - u32 pid =3D t->pid; - u64 *ptr; - - if (!pid || (targ_pid && targ_pid !=3D pid)) - return 0; - - ptr =3D bpf_task_storage_get(&start, t, 0, - BPF_LOCAL_STORAGE_GET_F_CREATE); - if (!ptr) - return 0; - - *ptr =3D bpf_ktime_get_ns(); - return 0; -} - -SEC("tp_btf/sched_wakeup") -int handle__sched_wakeup(u64 *ctx) -{ - /* TP_PROTO(struct task_struct *p) */ - struct task_struct *p =3D (void *)ctx[0]; - - return trace_enqueue(p); -} - -SEC("tp_btf/sched_wakeup_new") -int handle__sched_wakeup_new(u64 *ctx) -{ - /* TP_PROTO(struct task_struct *p) */ - struct task_struct *p =3D (void *)ctx[0]; - - return trace_enqueue(p); -} - -SEC("tp_btf/sched_switch") -int handle__sched_switch(u64 *ctx) -{ - /* TP_PROTO(bool preempt, struct task_struct *prev, - * struct task_struct *next) - */ - struct task_struct *prev =3D (struct task_struct *)ctx[1]; - struct task_struct *next =3D (struct task_struct *)ctx[2]; - struct runq_event event =3D {}; - u64 *tsp, delta_us; - u32 pid; - - /* ivcsw: treat like an enqueue event and store timestamp */ - if (prev->__state =3D=3D TASK_RUNNING) - trace_enqueue(prev); - - pid =3D next->pid; - - /* For pid mismatch, save a bpf_task_storage_get */ - if (!pid || (targ_pid && targ_pid !=3D pid)) - return 0; - - /* fetch timestamp and calculate delta */ - tsp =3D bpf_task_storage_get(&start, next, 0, 0); - if (!tsp) - return 0; /* missed enqueue */ - - delta_us =3D (bpf_ktime_get_ns() - *tsp) / 1000; - if (min_us && delta_us <=3D min_us) - return 0; - - event.pid =3D pid; - event.delta_us =3D delta_us; - bpf_get_current_comm(&event.task, sizeof(event.task)); - - /* output */ - bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, - &event, sizeof(event)); - - bpf_task_storage_delete(&start, next); - return 0; -} - -char LICENSE[] SEC("license") =3D "GPL"; diff --git a/tools/bpf/runqslower/runqslower.c b/tools/bpf/runqslower/runqs= lower.c deleted file mode 100644 index 83c5993a139a..000000000000 --- a/tools/bpf/runqslower/runqslower.c +++ /dev/null @@ -1,171 +0,0 @@ -// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) -// Copyright (c) 2019 Facebook -#include -#include -#include -#include -#include -#include -#include -#include "runqslower.h" -#include "runqslower.skel.h" - -struct env { - pid_t pid; - __u64 min_us; - bool verbose; -} env =3D { - .min_us =3D 10000, -}; - -const char *argp_program_version =3D "runqslower 0.1"; -const char *argp_program_bug_address =3D ""; -const char argp_program_doc[] =3D -"runqslower Trace long process scheduling delays.\n" -" For Linux, uses eBPF, BPF CO-RE, libbpf, BTF.\n" -"\n" -"This script traces high scheduling delays between tasks being\n" -"ready to run and them running on CPU after that.\n" -"\n" -"USAGE: runqslower [-p PID] [min_us]\n" -"\n" -"EXAMPLES:\n" -" runqslower # trace run queue latency higher than 10000 us (de= fault)\n" -" runqslower 1000 # trace run queue latency higher than 1000 us\n" -" runqslower -p 123 # trace pid 123 only\n"; - -static const struct argp_option opts[] =3D { - { "pid", 'p', "PID", 0, "Process PID to trace"}, - { "verbose", 'v', NULL, 0, "Verbose debug output" }, - {}, -}; - -static error_t parse_arg(int key, char *arg, struct argp_state *state) -{ - static int pos_args; - int pid; - long long min_us; - - switch (key) { - case 'v': - env.verbose =3D true; - break; - case 'p': - errno =3D 0; - pid =3D strtol(arg, NULL, 10); - if (errno || pid <=3D 0) { - fprintf(stderr, "Invalid PID: %s\n", arg); - argp_usage(state); - } - env.pid =3D pid; - break; - case ARGP_KEY_ARG: - if (pos_args++) { - fprintf(stderr, - "Unrecognized positional argument: %s\n", arg); - argp_usage(state); - } - errno =3D 0; - min_us =3D strtoll(arg, NULL, 10); - if (errno || min_us <=3D 0) { - fprintf(stderr, "Invalid delay (in us): %s\n", arg); - argp_usage(state); - } - env.min_us =3D min_us; - break; - default: - return ARGP_ERR_UNKNOWN; - } - return 0; -} - -int libbpf_print_fn(enum libbpf_print_level level, - const char *format, va_list args) -{ - if (level =3D=3D LIBBPF_DEBUG && !env.verbose) - return 0; - return vfprintf(stderr, format, args); -} - -void handle_event(void *ctx, int cpu, void *data, __u32 data_sz) -{ - const struct runq_event *e =3D data; - struct tm *tm; - char ts[32]; - time_t t; - - time(&t); - tm =3D localtime(&t); - strftime(ts, sizeof(ts), "%H:%M:%S", tm); - printf("%-8s %-16s %-6d %14llu\n", ts, e->task, e->pid, e->delta_us); -} - -void handle_lost_events(void *ctx, int cpu, __u64 lost_cnt) -{ - printf("Lost %llu events on CPU #%d!\n", lost_cnt, cpu); -} - -int main(int argc, char **argv) -{ - static const struct argp argp =3D { - .options =3D opts, - .parser =3D parse_arg, - .doc =3D argp_program_doc, - }; - struct perf_buffer *pb =3D NULL; - struct runqslower_bpf *obj; - int err; - - err =3D argp_parse(&argp, argc, argv, 0, NULL, NULL); - if (err) - return err; - - libbpf_set_print(libbpf_print_fn); - - /* Use libbpf 1.0 API mode */ - libbpf_set_strict_mode(LIBBPF_STRICT_ALL); - - obj =3D runqslower_bpf__open(); - if (!obj) { - fprintf(stderr, "failed to open and/or load BPF object\n"); - return 1; - } - - /* initialize global data (filtering options) */ - obj->rodata->targ_pid =3D env.pid; - obj->rodata->min_us =3D env.min_us; - - err =3D runqslower_bpf__load(obj); - if (err) { - fprintf(stderr, "failed to load BPF object: %d\n", err); - goto cleanup; - } - - err =3D runqslower_bpf__attach(obj); - if (err) { - fprintf(stderr, "failed to attach BPF programs\n"); - goto cleanup; - } - - printf("Tracing run queue latency higher than %llu us\n", env.min_us); - printf("%-8s %-16s %-6s %14s\n", "TIME", "COMM", "PID", "LAT(us)"); - - pb =3D perf_buffer__new(bpf_map__fd(obj->maps.events), 64, - handle_event, handle_lost_events, NULL, NULL); - err =3D libbpf_get_error(pb); - if (err) { - pb =3D NULL; - fprintf(stderr, "failed to open perf buffer: %d\n", err); - goto cleanup; - } - - while ((err =3D perf_buffer__poll(pb, 100)) >=3D 0) - ; - printf("Error polling perf buffer: %d\n", err); - -cleanup: - perf_buffer__free(pb); - runqslower_bpf__destroy(obj); - - return err !=3D 0; -} diff --git a/tools/bpf/runqslower/runqslower.h b/tools/bpf/runqslower/runqs= lower.h deleted file mode 100644 index 4f70f07200c2..000000000000 --- a/tools/bpf/runqslower/runqslower.h +++ /dev/null @@ -1,13 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ -#ifndef __RUNQSLOWER_H -#define __RUNQSLOWER_H - -#define TASK_COMM_LEN 16 - -struct runq_event { - char task[TASK_COMM_LEN]; - __u64 delta_us; - pid_t pid; -}; - -#endif /* __RUNQSLOWER_H */ diff --git a/tools/testing/selftests/bpf/.gitignore b/tools/testing/selftes= ts/bpf/.gitignore index be1ee7ba7ce0..e091809f07a0 100644 --- a/tools/testing/selftests/bpf/.gitignore +++ b/tools/testing/selftests/bpf/.gitignore @@ -32,7 +32,6 @@ test_cpp /cpuv4 /host-tools /tools -/runqslower /bench /veristat /sign-file diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests= /bpf/Makefile index f00587d4ede6..c102922365f5 100644 --- a/tools/testing/selftests/bpf/Makefile +++ b/tools/testing/selftests/bpf/Makefile @@ -127,7 +127,6 @@ TEST_KMOD_TARGETS =3D $(addprefix $(OUTPUT)/,$(TEST_KMO= DS)) TEST_GEN_PROGS_EXTENDED =3D \ bench \ flow_dissector_load \ - runqslower \ test_cpp \ test_lirc_mode2_user \ veristat \ @@ -209,8 +208,6 @@ HOST_INCLUDE_DIR :=3D $(INCLUDE_DIR) endif HOST_BPFOBJ :=3D $(HOST_BUILD_DIR)/libbpf/libbpf.a RESOLVE_BTFIDS :=3D $(HOST_BUILD_DIR)/resolve_btfids/resolve_btfids -RUNQSLOWER_OUTPUT :=3D $(BUILD_DIR)/runqslower/ - VMLINUX_BTF_PATHS ?=3D $(if $(O),$(O)/vmlinux) \ $(if $(KBUILD_OUTPUT),$(KBUILD_OUTPUT)/vmlinux) \ ../../../../vmlinux \ @@ -232,7 +229,7 @@ $(notdir $(TEST_GEN_PROGS) $(TEST_KMODS) \ MAKE_DIRS :=3D $(sort $(BUILD_DIR)/libbpf $(HOST_BUILD_DIR)/libbpf \ $(BUILD_DIR)/bpftool $(HOST_BUILD_DIR)/bpftool \ $(HOST_BUILD_DIR)/resolve_btfids \ - $(RUNQSLOWER_OUTPUT) $(INCLUDE_DIR)) + $(INCLUDE_DIR)) $(MAKE_DIRS): $(call msg,MKDIR,,$@) $(Q)mkdir -p $@ @@ -304,17 +301,6 @@ TRUNNER_BPFTOOL :=3D $(DEFAULT_BPFTOOL) USE_BOOTSTRAP :=3D "bootstrap/" endif =20 -$(OUTPUT)/runqslower: $(BPFOBJ) | $(DEFAULT_BPFTOOL) $(RUNQSLOWER_OUTPUT) - $(Q)$(MAKE) $(submake_extras) -C $(TOOLSDIR)/bpf/runqslower \ - OUTPUT=3D$(RUNQSLOWER_OUTPUT) VMLINUX_BTF=3D$(VMLINUX_BTF) \ - BPFTOOL_OUTPUT=3D$(HOST_BUILD_DIR)/bpftool/ \ - BPFOBJ_OUTPUT=3D$(BUILD_DIR)/libbpf/ \ - BPFOBJ=3D$(BPFOBJ) BPF_INCLUDE=3D$(INCLUDE_DIR) \ - BPF_TARGET_ENDIAN=3D$(BPF_TARGET_ENDIAN) \ - EXTRA_CFLAGS=3D'-g $(OPT_FLAGS) $(SAN_CFLAGS) $(EXTRA_CFLAGS)' \ - EXTRA_LDFLAGS=3D'$(SAN_LDFLAGS) $(EXTRA_LDFLAGS)' && \ - cp $(RUNQSLOWER_OUTPUT)runqslower $@ - TEST_GEN_PROGS_EXTENDED +=3D $(TRUNNER_BPFTOOL) =20 $(TEST_GEN_PROGS) $(TEST_GEN_PROGS_EXTENDED): $(BPFOBJ) diff --git a/tools/testing/selftests/bpf/test_bpftool_build.sh b/tools/test= ing/selftests/bpf/test_bpftool_build.sh index 1453a53ed547..b03a87571592 100755 --- a/tools/testing/selftests/bpf/test_bpftool_build.sh +++ b/tools/testing/selftests/bpf/test_bpftool_build.sh @@ -90,10 +90,6 @@ echo -e "... through kbuild\n" =20 if [ -f ".config" ] ; then make_and_clean tools/bpf - ## "make tools/bpf" sets $(OUTPUT) to ...tools/bpf/runqslower for - ## runqslower, but the default (used for the "clean" target) is .output. - ## Let's make sure we clean runqslower's directory properly. - make -C tools/bpf/runqslower OUTPUT=3D${KDIR_ROOT_DIR}/tools/bpf/runqslow= er/ clean =20 ## $OUTPUT is overwritten in kbuild Makefile, and thus cannot be passed ## down from toplevel Makefile to bpftool's Makefile. --=20 2.52.0