From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wr1-f42.google.com (mail-wr1-f42.google.com [209.85.221.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 BE969364E9F for ; Tue, 17 Mar 2026 17:44:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.42 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773769449; cv=none; b=qxy6//OaAqiF4/nJki8CLpjy6Y216DdrSRpFxoZyEkc4TY4CSQUAC6cDBJRoYIHTsnNoMvzGzEJG9G1Ssn2muHR8Gkd3r1AL8gXBfL+NY0BYl2ooEt9YkOmbcqp8mtSHq4622C2BT+0N7u2++4h/4pPJPQRe4Wu4LtEeT1oJ7as= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773769449; c=relaxed/simple; bh=uaQfqIHjhh8Gqr/bLL939JPfWeYhXncO5ZIFI86IOb4=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=Lp6JZBM+ZTImwl52UWVEQjQm7wrPf7EWd7PUjWnp1dosIJeHURRMtTj9w6i01+sxBm4b6MafqvkrGgQev6zaMzyGtOUjWYnhHWRuKnbsw//QM50LdhJDyyREiDBZ4g2HPPldqfgm6dgY27L+qYByvsShMOLTtVpqezz/pTzTzYE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=W2YvS9+S; arc=none smtp.client-ip=209.85.221.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="W2YvS9+S" Received: by mail-wr1-f42.google.com with SMTP id ffacd0b85a97d-439b9b1900bso4014087f8f.1 for ; Tue, 17 Mar 2026 10:44:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773769446; x=1774374246; 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=lnubqgwRPMuKsNglSaObUJCTGW7l4XL4h0WWvrX8A7E=; b=W2YvS9+SaavsxR1JSolzSKk1+XMiClxzbyPPrIPsREObN5SblQyGd/GAr1JP0Qh3PG pe+hgkdzE4dfr5o+cwFb9thTvnYgaSV261oCd7zHCfCzmPz1GGDoJGbL2o73CrPpXf7u tBfO4nCreKvaZVPjSs20FKlktTxzCeWFRN3IhxKXCAsnD2MBCoFS8DsQEPiBu8f0mY33 BygUQLLkGqwNxFzH5GElzshjb/TGyMNelPA6eZ+QeS3T9QxpHnfvKAXScpuJmPvVh9TD YX/HjTIrBZjlEnQjBK4M7atSeOTgXQD9mL94pOANoiu5/ZIexirNcA5s2TrvSi4Ghwfa KfQA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773769446; x=1774374246; 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=lnubqgwRPMuKsNglSaObUJCTGW7l4XL4h0WWvrX8A7E=; b=iYvePPEj2Ippsy/ZfRfDD/uDu6RQ+ozpP5FjnATpACNXyYEIv5Mq6ORK+S6XpQT12y StummHxmongOjT1efUdjgwutX+5KdaPNUmpPt1q64vIJin4LNe8xzbGRfoS7HUnHgeCj cF61sXM572b/XMhqD1VHcxYPmjK1+Ak5poPQLa0UI+Z6fAKLWdgKFRl4laBpWOw1e51b MyW3gw36Va8yWbQMTitF8++EWn12WzDocH+nmDK6sA1lgm4v3RMvb12mOXUHNPmTZSPF dmgOTGYYedQgTQITDn/3jMb8wWGoF+JBCQFYNWss7O6t3hJhYfZ/tbkF0nrvxVyFe4WI vuKg== X-Gm-Message-State: AOJu0Yz8MGGtZJV2hGvcSLHnAMnGvdZ6Dv6Boi/6j4jx53xZvpnZBU8o ywk46UhI/R8KKDNHRG4TvrUhjsVbPccerKAedoSlp4FrcbpQRx8KEndS X-Gm-Gg: ATEYQzzs2UDLCZ9L+R3m8e87phnL3EQ6tM6dXSA+/M5PQRq0Vz/fSywfQoaWzZ8/xl/ gn6wec0EM9RBl0lExXfnhtmxitne5TWcJhYrT72ThRzLxskYqLYqcRsjXqYE1qyd5UdGNaVGuyH Q1kptDviDdUvzeqRGYc+zU/AsQ8n3HujoTUt2dGNhnIEr6VNmCKP/hVYICxthMVxd9g1GEaocaL 0NfehR8fNiN0bwJzKZk/V8SroJw7I64nMFRCCsTY9whWoEWLFeCteFsxYJPMGL1BTdBSuhq0mkQ yt0Nymn49y9Q5dD5myqDtcNIPNEYlzMvFYO3bGlc0FxBt59C9T4eXSdGKUMZkIPwp8fvzjua5HT hA0EBuTUHLi8j2SKpydpQNlbVN2z8LxzP5GlQSoxV7f1qBZ1cAJKU9IaG1eFFlGe019jdy8tCil tP7Mtj15BGth4htuDAUXqoLQ4LD/yIVw9c4UJOjHNxJHzU4buxPUwZl51yU8TXeeMc/tb6VO6/4 NOMheTQzO2i X-Received: by 2002:a05:600c:470d:b0:485:3bc7:a231 with SMTP id 5b1f17b1804b1-486f4451240mr7442725e9.29.1773769445699; Tue, 17 Mar 2026 10:44:05 -0700 (PDT) Received: from dohko.chello.ie (188-141-5-72.dynamic.upc.ie. [188.141.5.72]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-486f420d946sm6364995e9.1.2026.03.17.10.44.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Mar 2026 10:44:05 -0700 (PDT) From: David Carlier To: Tejun Heo , David Vernet , Andrea Righi Cc: linux-kernel@vger.kernel.org, David Carlier Subject: [PATCH] sched_ext/selftests: Fix bpf_link leak on assertion failure Date: Tue, 17 Mar 2026 17:44:02 +0000 Message-ID: <20260317174402.48082-1-devnexen@gmail.com> X-Mailer: git-send-email 2.53.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit The SCX_EQ/SCX_ASSERT/SCX_FAIL_IF macros expand to return SCX_TEST_FAIL on failure. When an assertion fires after bpf_map__attach_struct_ops() but before bpf_link__destroy(), the link leaks. Since the test runner is a single process, the leaked link keeps the BPF scheduler attached, causing subsequent tests to fail to attach their own scheduler -- cascading test failures from a single bug. Fix by moving bpf_link__destroy() before assertions. UEI and BSS data live in the skeleton's mmap'd sections and survive link destruction, following the existing pattern in dsp_local_on.c. Signed-off-by: David Carlier --- tools/testing/selftests/sched_ext/ddsp_bogus_dsq_fail.c | 2 +- tools/testing/selftests/sched_ext/ddsp_vtimelocal_fail.c | 2 +- tools/testing/selftests/sched_ext/exit.c | 2 +- tools/testing/selftests/sched_ext/hotplug.c | 4 ++-- tools/testing/selftests/sched_ext/numa.c | 2 +- tools/testing/selftests/sched_ext/prog_run.c | 4 ++-- tools/testing/selftests/sched_ext/rt_stall.c | 2 +- .../testing/selftests/sched_ext/select_cpu_dispatch_bad_dsq.c | 2 +- .../testing/selftests/sched_ext/select_cpu_dispatch_dbl_dsp.c | 2 +- tools/testing/selftests/sched_ext/select_cpu_vtime.c | 3 +-- 10 files changed, 12 insertions(+), 13 deletions(-) diff --git a/tools/testing/selftests/sched_ext/ddsp_bogus_dsq_fail.c b/tools/testing/selftests/sched_ext/ddsp_bogus_dsq_fail.c index b6d13496b24e..c326c914f217 100644 --- a/tools/testing/selftests/sched_ext/ddsp_bogus_dsq_fail.c +++ b/tools/testing/selftests/sched_ext/ddsp_bogus_dsq_fail.c @@ -35,8 +35,8 @@ static enum scx_test_status run(void *ctx) sleep(1); - SCX_EQ(skel->data->uei.kind, EXIT_KIND(SCX_EXIT_ERROR)); bpf_link__destroy(link); + SCX_EQ(skel->data->uei.kind, EXIT_KIND(SCX_EXIT_ERROR)); return SCX_TEST_PASS; } diff --git a/tools/testing/selftests/sched_ext/ddsp_vtimelocal_fail.c b/tools/testing/selftests/sched_ext/ddsp_vtimelocal_fail.c index af9ce4ee8baa..5142ff19a9c4 100644 --- a/tools/testing/selftests/sched_ext/ddsp_vtimelocal_fail.c +++ b/tools/testing/selftests/sched_ext/ddsp_vtimelocal_fail.c @@ -34,8 +34,8 @@ static enum scx_test_status run(void *ctx) sleep(1); - SCX_EQ(skel->data->uei.kind, EXIT_KIND(SCX_EXIT_ERROR)); bpf_link__destroy(link); + SCX_EQ(skel->data->uei.kind, EXIT_KIND(SCX_EXIT_ERROR)); return SCX_TEST_PASS; } diff --git a/tools/testing/selftests/sched_ext/exit.c b/tools/testing/selftests/sched_ext/exit.c index b987611789d1..d9038e704ad4 100644 --- a/tools/testing/selftests/sched_ext/exit.c +++ b/tools/testing/selftests/sched_ext/exit.c @@ -45,11 +45,11 @@ static enum scx_test_status run(void *ctx) while (skel->data->uei.kind == EXIT_KIND(SCX_EXIT_NONE)) sched_yield(); + bpf_link__destroy(link); SCX_EQ(skel->data->uei.kind, EXIT_KIND(SCX_EXIT_UNREG_BPF)); SCX_EQ(skel->data->uei.exit_code, tc); sprintf(buf, "%d", tc); SCX_ASSERT(!strcmp(skel->data->uei.msg, buf)); - bpf_link__destroy(link); exit__destroy(skel); } diff --git a/tools/testing/selftests/sched_ext/hotplug.c b/tools/testing/selftests/sched_ext/hotplug.c index 0cfbb111a2d0..25aa60975fa3 100644 --- a/tools/testing/selftests/sched_ext/hotplug.c +++ b/tools/testing/selftests/sched_ext/hotplug.c @@ -84,13 +84,13 @@ static enum scx_test_status test_hotplug(bool onlining, bool cbs_defined) while (!UEI_EXITED(skel, uei)) sched_yield(); + bpf_link__destroy(link); SCX_EQ(skel->data->uei.kind, kind); SCX_EQ(UEI_REPORT(skel, uei), code); if (!onlining) toggle_online_status(1); - bpf_link__destroy(link); hotplug__destroy(skel); return SCX_TEST_PASS; @@ -124,13 +124,13 @@ static enum scx_test_status test_hotplug_attach(void) while (!UEI_EXITED(skel, uei)) sched_yield(); + bpf_link__destroy(link); kind = SCX_KIND_VAL(SCX_EXIT_UNREG_KERN); code = SCX_ECODE_VAL(SCX_ECODE_ACT_RESTART) | SCX_ECODE_VAL(SCX_ECODE_RSN_HOTPLUG); SCX_EQ(skel->data->uei.kind, kind); SCX_EQ(UEI_REPORT(skel, uei), code); - bpf_link__destroy(link); hotplug__destroy(skel); return status; diff --git a/tools/testing/selftests/sched_ext/numa.c b/tools/testing/selftests/sched_ext/numa.c index b060c3b65c82..f1145be9cfa1 100644 --- a/tools/testing/selftests/sched_ext/numa.c +++ b/tools/testing/selftests/sched_ext/numa.c @@ -36,8 +36,8 @@ static enum scx_test_status run(void *ctx) /* Just sleeping is fine, plenty of scheduling events happening */ sleep(1); - SCX_EQ(skel->data->uei.kind, EXIT_KIND(SCX_EXIT_NONE)); bpf_link__destroy(link); + SCX_EQ(skel->data->uei.kind, EXIT_KIND(SCX_EXIT_NONE)); return SCX_TEST_PASS; } diff --git a/tools/testing/selftests/sched_ext/prog_run.c b/tools/testing/selftests/sched_ext/prog_run.c index 05974820ca69..d101595b99b0 100644 --- a/tools/testing/selftests/sched_ext/prog_run.c +++ b/tools/testing/selftests/sched_ext/prog_run.c @@ -53,10 +53,10 @@ static enum scx_test_status run(void *ctx) while (skel->data->uei.kind == EXIT_KIND(SCX_EXIT_NONE)) sched_yield(); - SCX_EQ(skel->data->uei.kind, EXIT_KIND(SCX_EXIT_UNREG_BPF)); - SCX_EQ(skel->data->uei.exit_code, 0xdeadbeef); close(prog_fd); bpf_link__destroy(link); + SCX_EQ(skel->data->uei.kind, EXIT_KIND(SCX_EXIT_UNREG_BPF)); + SCX_EQ(skel->data->uei.exit_code, 0xdeadbeef); return SCX_TEST_PASS; } diff --git a/tools/testing/selftests/sched_ext/rt_stall.c b/tools/testing/selftests/sched_ext/rt_stall.c index 81ea9b4883e5..a6bc5adbd930 100644 --- a/tools/testing/selftests/sched_ext/rt_stall.c +++ b/tools/testing/selftests/sched_ext/rt_stall.c @@ -260,8 +260,8 @@ static enum scx_test_status run(void *ctx) } res = sched_stress_test(is_ext); if (is_ext) { - SCX_EQ(skel->data->uei.kind, EXIT_KIND(SCX_EXIT_NONE)); bpf_link__destroy(link); + SCX_EQ(skel->data->uei.kind, EXIT_KIND(SCX_EXIT_NONE)); } if (!res) diff --git a/tools/testing/selftests/sched_ext/select_cpu_dispatch_bad_dsq.c b/tools/testing/selftests/sched_ext/select_cpu_dispatch_bad_dsq.c index 5e72ebbc90a5..db4369f509e7 100644 --- a/tools/testing/selftests/sched_ext/select_cpu_dispatch_bad_dsq.c +++ b/tools/testing/selftests/sched_ext/select_cpu_dispatch_bad_dsq.c @@ -35,8 +35,8 @@ static enum scx_test_status run(void *ctx) sleep(1); - SCX_EQ(skel->data->uei.kind, EXIT_KIND(SCX_EXIT_ERROR)); bpf_link__destroy(link); + SCX_EQ(skel->data->uei.kind, EXIT_KIND(SCX_EXIT_ERROR)); return SCX_TEST_PASS; } diff --git a/tools/testing/selftests/sched_ext/select_cpu_dispatch_dbl_dsp.c b/tools/testing/selftests/sched_ext/select_cpu_dispatch_dbl_dsp.c index aa85949478bc..6c8a14b91327 100644 --- a/tools/testing/selftests/sched_ext/select_cpu_dispatch_dbl_dsp.c +++ b/tools/testing/selftests/sched_ext/select_cpu_dispatch_dbl_dsp.c @@ -35,8 +35,8 @@ static enum scx_test_status run(void *ctx) sleep(1); - SCX_EQ(skel->data->uei.kind, EXIT_KIND(SCX_EXIT_ERROR)); bpf_link__destroy(link); + SCX_EQ(skel->data->uei.kind, EXIT_KIND(SCX_EXIT_ERROR)); return SCX_TEST_PASS; } diff --git a/tools/testing/selftests/sched_ext/select_cpu_vtime.c b/tools/testing/selftests/sched_ext/select_cpu_vtime.c index 1e9b5c9bfff1..7593aa05e03d 100644 --- a/tools/testing/selftests/sched_ext/select_cpu_vtime.c +++ b/tools/testing/selftests/sched_ext/select_cpu_vtime.c @@ -37,9 +37,8 @@ static enum scx_test_status run(void *ctx) sleep(1); - SCX_ASSERT(skel->bss->consumed); - bpf_link__destroy(link); + SCX_ASSERT(skel->bss->consumed); return SCX_TEST_PASS; } -- 2.53.0