From nobody Wed Sep 30 05:00:24 2026 Received: from out-170.mta0.migadu.com (out-170.mta0.migadu.com [91.218.175.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D0CBF3446C7; Thu, 13 Aug 2026 05:17:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786598226; cv=none; b=nKgXJMx4Meg/GuX5C/7r26ruyiGpfp3YFoz4/Q/PAu4HSRDYtQpjWZEwoasis6ogp02saT1CSJTHBTDwRCaC772RaT8HoOrTPo2NkV3NJEFjKcIru6kY+eJN1PMW3GGsQJJpiHFd6OF0pAlPOji9UyWv7SZ+gKyJA+6GkOz3YbY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786598226; c=relaxed/simple; bh=XWFZK/e/7CsX4iMIsxwBsCGV+o44AZdAJ4gnsWag03o=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=GJsFzRXEyF7PSH6T+HeBc4zuuG8um/R/ntfUwZMdc+pa9mGxLAb2DVpozqSy/KS4CrhwJ6xhqiMx/jDWXYCXnl72lynhSxVhL6FT7rPFZju1A4xAG0Wi58SZrp8GMcForbkzPj8eH0FkcHiwqdBcrBZTNNy8aEXx23yHuDOiE4s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=gGqHBHIi; arc=none smtp.client-ip=91.218.175.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="gGqHBHIi" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1786598214; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=EYcOFy8k9Qk2cCl/jWteAJqGPNJg4JpMyMzEqhTo0Is=; b=gGqHBHIiKtMTOnIZQKKSlzGdfXL1nLGq1LypkigyAHxq6CRyoECql3nmpHnNLke/PIDUez cZCnt3Zv2makSGMZowpH2FUZzPO3vr6pSPPGmyjr4Xn2ktZ7ckhObLyc2rt7pm1UD8rac+ E2mvjZy4vcGKUA+ub4h2kA7jz+RjtDE= From: Jiayuan Chen To: bpf@vger.kernel.org, memxor@gmail.com Cc: Jiayuan Chen , Andrii Nakryiko , Eduard Zingerman , Ihor Solodrai , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , Jiri Olsa , Emil Tsalapatis , Shuah Khan , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , Mykyta Yatsenko , Taegu Ha , Amery Hung , Paul Chaignon , linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, llvm@lists.linux.dev Subject: [PATCH net-next v1] selftests/bpf: Fix insn count expectations in chained global subprogs test Date: Thu, 13 Aug 2026 13:16:29 +0800 Message-ID: <20260813051635.121670-1-jiayuan.chen@linux.dev> 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 X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" The test asserts exact per-subprog insns_self/insns_total values and the aggregate processed count, but these depend on compiler codegen. The expected values match -mcpu=3Dv3 output; under -mcpu=3Dv4 clang emits a sign-extending load in global_good() instead of a load plus two shifts, so the subprog is verified in 3 insns instead of 5 and the test fails on the cpuv4 flavor. Rewrite the involved subprogs as naked functions with hand-written instruction sequences using only v1 instructions, so the verified insn counts no longer depend on cpu version or compiler codegen. Fixes: c2e6c7de8830 ("bpf: Show more useful info in stack depth stats") Signed-off-by: Jiayuan Chen --- .../bpf/progs/verifier_global_subprogs.c | 56 +++++++++++++++---- 1 file changed, 45 insertions(+), 11 deletions(-) diff --git a/tools/testing/selftests/bpf/progs/verifier_global_subprogs.c b= /tools/testing/selftests/bpf/progs/verifier_global_subprogs.c index 7b65eea97ebc..3352dc177ec1 100644 --- a/tools/testing/selftests/bpf/progs/verifier_global_subprogs.c +++ b/tools/testing/selftests/bpf/progs/verifier_global_subprogs.c @@ -25,9 +25,22 @@ __noinline long global_bad(void) return arr[unkn_idx]; /* BOOM */ } =20 -__noinline long global_good(void) +/* Insn counts asserted in chained_global_func_calls_success() depend on + * the exact instruction sequences of this function and its callers, so + * they are written in inline asm to be independent of compiler codegen. + */ +__naked __noinline long global_good(void) { - return arr[0]; + /* return (long)arr[0]; 5 insns (ld_imm64 counts as one) */ + asm volatile ( + "r1 =3D %[arr] ll;" + "r0 =3D *(u32 *)(r1 + 0);" + "r0 <<=3D 32;" + "r0 s>>=3D 32;" + "exit;" + : + : __imm_addr(arr) + : __clobber_all); } =20 __noinline long global_calls_bad(void) @@ -35,9 +48,13 @@ __noinline long global_calls_bad(void) return global_good() + global_bad() /* does BOOM indirectly */; } =20 -__noinline long global_calls_good_only(void) +__naked __noinline long global_calls_good_only(void) { - return global_good(); + /* return global_good(); 2 insns */ + asm volatile ( + "call global_good;" + "exit;" + ::: __clobber_all); } =20 __noinline long global_dead(void) @@ -56,13 +73,30 @@ __msg("subprog 0 (chained_global_func_calls_success) ma= in insns_self 7 insns_tot __msg("subprog {{[0-9]+}} (global_calls_good_only) global insns_self 2 ins= ns_total 2 stack") __msg("subprog {{[0-9]+}} (global_good) global insns_self 5 insns_total 5 = stack") __msg("processed 14 insns") -int chained_global_func_calls_success(void) -{ - int sum =3D 0; - - if (call_dead_subprog) - sum +=3D global_dead(); - return global_calls_good_only() + sum; +__naked int chained_global_func_calls_success(void) +{ + /* int sum =3D 0; + * if (call_dead_subprog) + * sum +=3D global_dead(); + * return global_calls_good_only() + sum; + * + * call_dead_subprog is known false, so 7 insns are processed: + * the branch to l0 is always taken and global_dead() is dead code. + */ + asm volatile ( + "r6 =3D 0;" + "r1 =3D %[call_dead_subprog] ll;" + "r1 =3D *(u8 *)(r1 + 0);" + "if r1 =3D=3D 0 goto l0_%=3D;" + "call global_dead;" + "r6 =3D r0;" + "l0_%=3D:" + "call global_calls_good_only;" + "r0 +=3D r6;" + "exit;" + : + : __imm_addr(call_dead_subprog) + : __clobber_all); } =20 SEC("?raw_tp") --=20 2.43.0