From nobody Mon Dec 1 23:34:48 2025 Received: from mail-wm1-f42.google.com (mail-wm1-f42.google.com [209.85.128.42]) (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 E0928246BD5 for ; Wed, 26 Nov 2025 07:34:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764142463; cv=none; b=uIR1lER9bSpklzLV9ygYNeoIooeSHEIzNilR9gTQzlIHRJPwL9zhIOjySLpeAgKCuB6iuUZzW/ppcmgRh85iwrpcywq9WPt2kF6r5JA+9B1ZBkDkhbPK7msX2KAw1haRT4u7kfwxWwjQ/4Gv4eiM0kx9a7cht7o4eluSH1LJ3HU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764142463; c=relaxed/simple; bh=HZHGEbWf4duCcAC2IFhVoTDYI22CIbFxeNitmSzTs0E=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=mH/4lkvgY1vl7sDGDGLzam0aCigoKsJffgT4mVb9Ui9jeNtroCEnkJ5NjrZCwzqD4SoCSrUI1IgezDSpCx1aQYjV5XUAOHYAclkWTJLoGZumwiqJMjrnZsc5OBJvordQcDDOTDjYUdk0ofO1y2kAF+NjeQECBmmFfA3akIRWZUg= 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=UNLPgSW8; arc=none smtp.client-ip=209.85.128.42 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="UNLPgSW8" Received: by mail-wm1-f42.google.com with SMTP id 5b1f17b1804b1-477563e28a3so3647655e9.1 for ; Tue, 25 Nov 2025 23:34:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1764142458; x=1764747258; 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=sPEFWx+aW9QC/nVK0x1/EOh/U5whRCkAn5X7jEbwW2g=; b=UNLPgSW8DaMda8t1FwNmLGrtiK7hHUsM8QU1mtaqR4nYHmIvV4FxYEYAzbp+6y1y8a nygzb1QX9mt1P7nE3w/wrGp11x/R3zQlLr140SjHdCOzfcFBVCjE4/7kOZ8kcRIZ7V9j lqeret/TM4t3qCiLNU9VG+E3/09jr/FNyU+fpuW8eOf/C+8vZ8oW8NTrYa3QRVZ97YRW eF8aHcpEBiL+c5uAnV4HXuZEd6iJWkkZqEiZHmzQxT5ZWCHNgPqcQeIrWvHeBk/LTdA0 f94xhyKFQ3QFEUbjl+xcMvKnNbT2vixL1xah2xifg4hIMyn72ZYYvGlFvM2bxjd5va9z nxOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764142458; x=1764747258; 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=sPEFWx+aW9QC/nVK0x1/EOh/U5whRCkAn5X7jEbwW2g=; b=l1qaIOCUn1ymye4k3PbrviWrmldmJ7V+Y0dRWyriGPugWr7wMPDem05m29y/39p7OH SO4M4HFs9lR/KAbDq0NOM/tMN8PI0WI/KzSpZqimozQQ5djyJumhBZ1TQWhx7O941YIp 9w/isz55pxxFF2NHFT8bhWiPorRwVEloT2+ykHFimxUrpm4SQdlf4G+EP4EKF+YcdKrD Zmci7fecvasWzme3DgftdfE/2hUGGkzMqEBPwOx6za9tJLxVP/SSXRyUJwcu8BWGxFas UmBMWE1tsxW5eKbsALeMpda9qzx/NYudUNCpkYSNmWHaTDeNBJAtAjAe+OljjMzofKU1 IMpg== X-Forwarded-Encrypted: i=1; AJvYcCU7ltQTglIkZukSUMl9l+U8qc7HaxjqTGSrYRvd872h4PgSzkUo+bgR/3sB4Yw4EeBeWP44hp/KJ6mZ1mw=@vger.kernel.org X-Gm-Message-State: AOJu0Yw6LUZel3+o6fVP9VHylXpe+TbXaEkmJvrtYtXQgsbj088R32sw LIFgB0VsW/SW7B8U48yQ1AsZlpigjkaEjau4UoPvD9Y5OLSgahHftDg02MT6ESOI1QE= X-Gm-Gg: ASbGnctJMsVykdPFQcJAn0Kaeid4SAsELh0wHE3pXT1puvjavv1eJfNdTFTeULNcDMS kBRKs4AXZ6sWqUwMwzGreipq9K12ZhDmXKV0d9bkC8DlVrCCsVYu2sdUMV6prkl6VhKbi7TyZnF av3CJ0K9ErxqgpjYXJjXyhuKExDV/6nuo+SWkYKawb9Xx9AFfeNPQoLyQqvLfsWIP6xQsOGAkbC egPlFq0GqXvKe7Q+UoBTtVBq/TwhEp3TcdxFJyqBO3UR3O31Pcm7jpYohkPk2zmk82wMH8M9PCx oOibpBiZ4buchdmkN3BwKJa+xnuTg7anvocUXh0dx3tW/5m0JycnW8kTniMuLhtdFh/cdhot8QK pYLK/bs2I5oPrrSLnLirCjPtKgVWxenVILuQvVSPZhDQNC7qsARAz0vYTCx6qS+AaolS9cjvqYc +WvrlC/J0b1yX/fHwkT8qensQ69ID+3+bkgpbsSLwIssKCqgxxWA== X-Google-Smtp-Source: AGHT+IExbNcMrZ8ihgVaZHsrCfvACWEaSJvBZnWNl9nlwlY/Qjpy6FU6zmaHua6tMjGBUq1Hvlg8Yg== X-Received: by 2002:a7b:cbd3:0:b0:477:991c:a17c with SMTP id 5b1f17b1804b1-477b9ea90b7mr161854985e9.6.1764142458142; Tue, 25 Nov 2025 23:34:18 -0800 (PST) Received: from F15.localdomain ([121.167.230.140]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3476a5603bdsm1603290a91.8.2025.11.25.23.34.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Nov 2025 23:34:17 -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 , Tony Ambardar , Charlie Jenkins , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, llvm@lists.linux.dev Subject: [PATCH] tools: bpf: remove runqslower tool Date: Wed, 26 Nov 2025 16:33:00 +0900 Message-ID: <20251126073308.365432-3-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 --- 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 | 14 -- .../selftests/bpf/test_bpftool_build.sh | 4 - 9 files changed, 3 insertions(+), 412 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..79f9f96d153f 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 \ @@ -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