All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: Alexei Starovoitov <ast@kernel.org>
Cc: llvm@lists.linux.dev, oe-kbuild-all@lists.linux.dev
Subject: [ast-bpf:stacklive 12/22] kernel/bpf/liveness.c:2302:5: warning: stack frame size (1464) exceeds limit (1280) in 'compute_subprog_arg_access'
Date: Tue, 17 Mar 2026 18:55:02 +0800	[thread overview]
Message-ID: <202603171840.EMoRjsHz-lkp@intel.com> (raw)

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/ast/bpf.git stacklive
head:   f4d911f1115995504320e415e04768858065221b
commit: d9d806381e9caf5be8c404e90b7997fd39bacf63 [12/22] bpf: Add per-subprog arg tracking analysis
config: hexagon-allmodconfig (https://download.01.org/0day-ci/archive/20260317/202603171840.EMoRjsHz-lkp@intel.com/config)
compiler: clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260317/202603171840.EMoRjsHz-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202603171840.EMoRjsHz-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> kernel/bpf/liveness.c:2302:5: warning: stack frame size (1464) exceeds limit (1280) in 'compute_subprog_arg_access' [-Wframe-larger-than]
    2302 | int compute_subprog_arg_access(struct bpf_verifier_env *env,
         |     ^
   1 warning generated.


vim +/compute_subprog_arg_access +2302 kernel/bpf/liveness.c

  2244	
  2245	/*
  2246	 * Backward pass: compute per-instruction argument read liveness.
  2247	 * arg_live[i][arg] = union of arg_use[j][arg] for all j reachable from i.
  2248	 * No def-kills: conservative (reads through written slots stay live).
  2249	 *
  2250	 * For nested calls (subprog0 -> subprog1 -> subprog2), this works
  2251	 * transitively: the forward pass folds inner callee reads into arg_use
  2252	 * at each BPF-to-BPF call instruction, so arg_live for subprog1 already
  2253	 * includes reads that subprog2 makes through subprog1's arguments.
  2254	 * clean_verifier_state() only needs to consult the immediate child's
  2255	 * arg_live to get correct liveness for any call depth.
  2256	 */
  2257	static int compute_arg_live(struct bpf_verifier_env *env,
  2258				    int subprog, int start, int len,
  2259				    struct subprog_arg_access *access,
  2260				    u64 (*arg_use)[NUM_AT_IDS][2])
  2261	{
  2262		int po_start = env->subprog_info[subprog].postorder_start;
  2263		int po_end = env->subprog_info[subprog + 1].postorder_start;
  2264		bool changed = true;
  2265	
  2266		access->subprog_len = len;
  2267		access->arg_live = kvzalloc_objs(*access->arg_live, len, GFP_KERNEL_ACCOUNT);
  2268		if (!access->arg_live)
  2269			return -ENOMEM;
  2270	
  2271		while (changed) {
  2272			changed = false;
  2273			for (int p = po_start; p < po_end; p++) {
  2274				int insn_idx = env->cfg.insn_postorder[p];
  2275				int li = insn_idx - start;
  2276				struct bpf_iarray *succ;
  2277				u64 new_live[NUM_AT_IDS][2] = {};
  2278				int a;
  2279	
  2280				succ = bpf_insn_successors(env, insn_idx);
  2281				for (int s = 0; s < succ->cnt; s++) {
  2282					int target = succ->items[s];
  2283	
  2284					if (target < start || target >= start + len)
  2285						continue;
  2286					for (a = 0; a < NUM_AT_IDS; a++)
  2287						spis_or(new_live[a], access->arg_live[target - start][a]);
  2288				}
  2289				for (a = 0; a < NUM_AT_IDS; a++)
  2290					spis_or(new_live[a], arg_use[li][a]);
  2291	
  2292				for (a = 0; a < NUM_AT_IDS; a++) {
  2293					if (!spis_equal(new_live[a], access->arg_live[li][a])) {
  2294						spis_copy(access->arg_live[li][a], new_live[a]);
  2295						changed = true;
  2296					}
  2297				}
  2298			}
  2299		}
  2300		return 0;
  2301	}
> 2302	int compute_subprog_arg_access(struct bpf_verifier_env *env,
  2303				       struct insn_live_regs *state)
  2304	{
  2305		struct bpf_insn *insns = env->prog->insnsi;
  2306		struct subprog_at_info *info;
  2307		int k, err = 0;
  2308	
  2309		env->subprog_arg_access = kvcalloc(env->subprog_cnt,
  2310						   sizeof(*env->subprog_arg_access),
  2311						   GFP_KERNEL_ACCOUNT);
  2312		if (!env->subprog_arg_access)
  2313			return -ENOMEM;
  2314	
  2315		info = kvcalloc(env->subprog_cnt, sizeof(*info), GFP_KERNEL_ACCOUNT);
  2316		if (!info)
  2317			return -ENOMEM;
  2318	
  2319		/*
  2320		 * Process subprogs in topological order (leaves first).
  2321		 * Each subprog gets: arg tracking, callee folding, arg liveness.
  2322		 * Subprog 0 needs stack tracking but not arg liveness.
  2323		 */
  2324		for (k = 0; k < env->subprog_cnt; k++) {
  2325			int i = env->subprog_topo_order[k];
  2326			struct subprog_arg_access *access;
  2327	
  2328			access = &env->subprog_arg_access[i];
  2329			err = compute_subprog_arg_tracking(env, insns, i,
  2330							   access, &info[i],
  2331							   state);
  2332			if (err)
  2333				goto err_free;
  2334	
  2335			if (i > 0) {
  2336				fold_callee_accesses_for_subprog(env, insns, i,
  2337								 access,
  2338								 &info[i]);
  2339			}
  2340	
  2341			if (i > 0) {
  2342				int start = env->subprog_info[i].start;
  2343	
  2344				err = compute_arg_live(env, i, start,
  2345						       info[i].len, access,
  2346						       info[i].arg_use);
  2347				if (err)
  2348					goto err_free;
  2349			}
  2350		}
  2351	
  2352	err_free:
  2353		for (k = 0; k < env->subprog_cnt; k++) {
  2354			kvfree(info[k].at_in);
  2355			kvfree(info[k].arg_use);
  2356		}
  2357		kvfree(info);
  2358		return err;
  2359	}
  2360	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

                 reply	other threads:[~2026-03-17 10:55 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=202603171840.EMoRjsHz-lkp@intel.com \
    --to=lkp@intel.com \
    --cc=ast@kernel.org \
    --cc=llvm@lists.linux.dev \
    --cc=oe-kbuild-all@lists.linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.