All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: oe-kbuild@lists.linux.dev
Cc: lkp@intel.com, Dan Carpenter <error27@gmail.com>
Subject: kernel/bpf/fixups.c:1058 jit_subprogs() warn: mask and shift to zero: expr='addr >> 32'
Date: Sat, 09 May 2026 20:45:01 +0800	[thread overview]
Message-ID: <202605092030.Um03iYK8-lkp@intel.com> (raw)

BCC: lkp@intel.com
CC: oe-kbuild-all@lists.linux.dev
CC: linux-kernel@vger.kernel.org
TO: Xu Kuohai <xukuohai@huawei.com>
CC: Alexei Starovoitov <ast@kernel.org>
CC: Anton Protopopov <a.s.protopopov@gmail.com>
CC: Hari Bathini <hbathini@linux.ibm.com>
CC: Pu Lehui <pulehui@huawei.com>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   70390501d1944d4e5b8f7352be180fceb3a44132
commit: d3e945223e0158c85dbde23de4f89493a2a817f6 bpf: Move constants blinding out of arch-specific JITs
date:   3 weeks ago
:::::: branch date: 9 hours ago
:::::: commit date: 3 weeks ago
config: m68k-randconfig-r073-20260509 (https://download.01.org/0day-ci/archive/20260509/202605092030.Um03iYK8-lkp@intel.com/config)
compiler: m68k-linux-gcc (GCC) 12.5.0
smatch: v0.5.0-9065-ge9cc34fd

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
| Fixes: d3e945223e01 ("bpf: Move constants blinding out of arch-specific JITs")
| Reported-by: kernel test robot <lkp@intel.com>
| Reported-by: Dan Carpenter <error27@gmail.com>
| Closes: https://lore.kernel.org/r/202605092030.Um03iYK8-lkp@intel.com/

smatch warnings:
kernel/bpf/fixups.c:1058 jit_subprogs() warn: mask and shift to zero: expr='addr >> 32'

vim +1058 kernel/bpf/fixups.c

d3e945223e0158 Xu Kuohai          2026-04-16  1015  
d3e945223e0158 Xu Kuohai          2026-04-16  1016  static int jit_subprogs(struct bpf_verifier_env *env)
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1017  {
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1018  	struct bpf_prog *prog = env->prog, **func, *tmp;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1019  	int i, j, subprog_start, subprog_end = 0, len, subprog;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1020  	struct bpf_map *map_ptr;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1021  	struct bpf_insn *insn;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1022  	void *old_bpf_func;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1023  	int err, num_exentries;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1024  
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1025  	for (i = 0, insn = prog->insnsi; i < prog->len; i++, insn++) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1026  		if (!bpf_pseudo_func(insn) && !bpf_pseudo_call(insn))
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1027  			continue;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1028  
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1029  		/* Upon error here we cannot fall back to interpreter but
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1030  		 * need a hard reject of the program. Thus -EFAULT is
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1031  		 * propagated in any case.
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1032  		 */
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1033  		subprog = bpf_find_subprog(env, i + insn->imm + 1);
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1034  		if (verifier_bug_if(subprog < 0, env, "No program to jit at insn %d",
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1035  				    i + insn->imm + 1))
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1036  			return -EFAULT;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1037  		/* temporarily remember subprog id inside insn instead of
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1038  		 * aux_data, since next loop will split up all insns into funcs
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1039  		 */
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1040  		insn->off = subprog;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1041  		/* remember original imm in case JIT fails and fallback
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1042  		 * to interpreter will be needed
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1043  		 */
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1044  		env->insn_aux_data[i].call_imm = insn->imm;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1045  		/* point imm to __bpf_call_base+1 from JITs point of view */
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1046  		insn->imm = 1;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1047  		if (bpf_pseudo_func(insn)) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1048  #if defined(MODULES_VADDR)
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1049  			u64 addr = MODULES_VADDR;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1050  #else
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1051  			u64 addr = VMALLOC_START;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1052  #endif
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1053  			/* jit (e.g. x86_64) may emit fewer instructions
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1054  			 * if it learns a u32 imm is the same as a u64 imm.
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1055  			 * Set close enough to possible prog address.
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1056  			 */
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1057  			insn[0].imm = (u32)addr;
449f08fa59dda5 Alexei Starovoitov 2026-04-12 @1058  			insn[1].imm = addr >> 32;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1059  		}
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1060  	}
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1061  
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1062  	err = bpf_prog_alloc_jited_linfo(prog);
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1063  	if (err)
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1064  		goto out_undo_insn;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1065  
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1066  	err = -ENOMEM;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1067  	func = kzalloc_objs(prog, env->subprog_cnt);
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1068  	if (!func)
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1069  		goto out_undo_insn;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1070  
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1071  	for (i = 0; i < env->subprog_cnt; i++) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1072  		subprog_start = subprog_end;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1073  		subprog_end = env->subprog_info[i + 1].start;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1074  
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1075  		len = subprog_end - subprog_start;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1076  		/* bpf_prog_run() doesn't call subprogs directly,
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1077  		 * hence main prog stats include the runtime of subprogs.
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1078  		 * subprogs don't have IDs and not reachable via prog_get_next_id
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1079  		 * func[i]->stats will never be accessed and stays NULL
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1080  		 */
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1081  		func[i] = bpf_prog_alloc_no_stats(bpf_prog_size(len), GFP_USER);
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1082  		if (!func[i])
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1083  			goto out_free;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1084  		memcpy(func[i]->insnsi, &prog->insnsi[subprog_start],
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1085  		       len * sizeof(struct bpf_insn));
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1086  		func[i]->type = prog->type;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1087  		func[i]->len = len;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1088  		if (bpf_prog_calc_tag(func[i]))
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1089  			goto out_free;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1090  		func[i]->is_func = 1;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1091  		func[i]->sleepable = prog->sleepable;
d3e945223e0158 Xu Kuohai          2026-04-16  1092  		func[i]->blinded = prog->blinded;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1093  		func[i]->aux->func_idx = i;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1094  		/* Below members will be freed only at prog->aux */
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1095  		func[i]->aux->btf = prog->aux->btf;
d3e945223e0158 Xu Kuohai          2026-04-16  1096  		func[i]->aux->subprog_start = subprog_start;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1097  		func[i]->aux->func_info = prog->aux->func_info;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1098  		func[i]->aux->func_info_cnt = prog->aux->func_info_cnt;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1099  		func[i]->aux->poke_tab = prog->aux->poke_tab;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1100  		func[i]->aux->size_poke_tab = prog->aux->size_poke_tab;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1101  		func[i]->aux->main_prog_aux = prog->aux;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1102  
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1103  		for (j = 0; j < prog->aux->size_poke_tab; j++) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1104  			struct bpf_jit_poke_descriptor *poke;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1105  
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1106  			poke = &prog->aux->poke_tab[j];
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1107  			if (poke->insn_idx < subprog_end &&
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1108  			    poke->insn_idx >= subprog_start)
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1109  				poke->aux = func[i]->aux;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1110  		}
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1111  
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1112  		func[i]->aux->name[0] = 'F';
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1113  		func[i]->aux->stack_depth = env->subprog_info[i].stack_depth;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1114  		if (env->subprog_info[i].priv_stack_mode == PRIV_STACK_ADAPTIVE)
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1115  			func[i]->aux->jits_use_priv_stack = true;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1116  
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1117  		func[i]->jit_requested = 1;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1118  		func[i]->blinding_requested = prog->blinding_requested;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1119  		func[i]->aux->kfunc_tab = prog->aux->kfunc_tab;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1120  		func[i]->aux->kfunc_btf_tab = prog->aux->kfunc_btf_tab;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1121  		func[i]->aux->linfo = prog->aux->linfo;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1122  		func[i]->aux->nr_linfo = prog->aux->nr_linfo;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1123  		func[i]->aux->jited_linfo = prog->aux->jited_linfo;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1124  		func[i]->aux->linfo_idx = env->subprog_info[i].linfo_idx;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1125  		func[i]->aux->arena = prog->aux->arena;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1126  		func[i]->aux->used_maps = env->used_maps;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1127  		func[i]->aux->used_map_cnt = env->used_map_cnt;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1128  		num_exentries = 0;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1129  		insn = func[i]->insnsi;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1130  		for (j = 0; j < func[i]->len; j++, insn++) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1131  			if (BPF_CLASS(insn->code) == BPF_LDX &&
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1132  			    (BPF_MODE(insn->code) == BPF_PROBE_MEM ||
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1133  			     BPF_MODE(insn->code) == BPF_PROBE_MEM32 ||
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1134  			     BPF_MODE(insn->code) == BPF_PROBE_MEM32SX ||
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1135  			     BPF_MODE(insn->code) == BPF_PROBE_MEMSX))
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1136  				num_exentries++;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1137  			if ((BPF_CLASS(insn->code) == BPF_STX ||
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1138  			     BPF_CLASS(insn->code) == BPF_ST) &&
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1139  			     BPF_MODE(insn->code) == BPF_PROBE_MEM32)
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1140  				num_exentries++;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1141  			if (BPF_CLASS(insn->code) == BPF_STX &&
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1142  			     BPF_MODE(insn->code) == BPF_PROBE_ATOMIC)
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1143  				num_exentries++;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1144  		}
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1145  		func[i]->aux->num_exentries = num_exentries;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1146  		func[i]->aux->tail_call_reachable = env->subprog_info[i].tail_call_reachable;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1147  		func[i]->aux->exception_cb = env->subprog_info[i].is_exception_cb;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1148  		func[i]->aux->changes_pkt_data = env->subprog_info[i].changes_pkt_data;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1149  		func[i]->aux->might_sleep = env->subprog_info[i].might_sleep;
0251e40c482992 Eduard Zingerman   2026-04-15  1150  		func[i]->aux->token = prog->aux->token;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1151  		if (!i)
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1152  			func[i]->aux->exception_boundary = env->seen_exception;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1153  		func[i] = bpf_int_jit_compile(func[i]);
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1154  		if (!func[i]->jited) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1155  			err = -ENOTSUPP;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1156  			goto out_free;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1157  		}
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1158  		cond_resched();
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1159  	}
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1160  
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1161  	/* at this point all bpf functions were successfully JITed
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1162  	 * now populate all bpf_calls with correct addresses and
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1163  	 * run last pass of JIT
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1164  	 */
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1165  	for (i = 0; i < env->subprog_cnt; i++) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1166  		insn = func[i]->insnsi;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1167  		for (j = 0; j < func[i]->len; j++, insn++) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1168  			if (bpf_pseudo_func(insn)) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1169  				subprog = insn->off;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1170  				insn[0].imm = (u32)(long)func[subprog]->bpf_func;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1171  				insn[1].imm = ((u64)(long)func[subprog]->bpf_func) >> 32;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1172  				continue;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1173  			}
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1174  			if (!bpf_pseudo_call(insn))
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1175  				continue;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1176  			subprog = insn->off;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1177  			insn->imm = BPF_CALL_IMM(func[subprog]->bpf_func);
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1178  		}
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1179  
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1180  		/* we use the aux data to keep a list of the start addresses
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1181  		 * of the JITed images for each function in the program
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1182  		 *
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1183  		 * for some architectures, such as powerpc64, the imm field
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1184  		 * might not be large enough to hold the offset of the start
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1185  		 * address of the callee's JITed image from __bpf_call_base
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1186  		 *
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1187  		 * in such cases, we can lookup the start address of a callee
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1188  		 * by using its subprog id, available from the off field of
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1189  		 * the call instruction, as an index for this list
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1190  		 */
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1191  		func[i]->aux->func = func;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1192  		func[i]->aux->func_cnt = env->subprog_cnt - env->hidden_subprog_cnt;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1193  		func[i]->aux->real_func_cnt = env->subprog_cnt;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1194  	}
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1195  	for (i = 0; i < env->subprog_cnt; i++) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1196  		old_bpf_func = func[i]->bpf_func;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1197  		tmp = bpf_int_jit_compile(func[i]);
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1198  		if (tmp != func[i] || func[i]->bpf_func != old_bpf_func) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1199  			verbose(env, "JIT doesn't support bpf-to-bpf calls\n");
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1200  			err = -ENOTSUPP;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1201  			goto out_free;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1202  		}
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1203  		cond_resched();
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1204  	}
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1205  
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1206  	/*
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1207  	 * Cleanup func[i]->aux fields which aren't required
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1208  	 * or can become invalid in future
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1209  	 */
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1210  	for (i = 0; i < env->subprog_cnt; i++) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1211  		func[i]->aux->used_maps = NULL;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1212  		func[i]->aux->used_map_cnt = 0;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1213  	}
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1214  
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1215  	/* finally lock prog and jit images for all functions and
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1216  	 * populate kallsysm. Begin at the first subprogram, since
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1217  	 * bpf_prog_load will add the kallsyms for the main program.
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1218  	 */
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1219  	for (i = 1; i < env->subprog_cnt; i++) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1220  		err = bpf_prog_lock_ro(func[i]);
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1221  		if (err)
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1222  			goto out_free;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1223  	}
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1224  
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1225  	for (i = 1; i < env->subprog_cnt; i++)
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1226  		bpf_prog_kallsyms_add(func[i]);
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1227  
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1228  	/* Last step: make now unused interpreter insns from main
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1229  	 * prog consistent for later dump requests, so they can
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1230  	 * later look the same as if they were interpreted only.
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1231  	 */
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1232  	for (i = 0, insn = prog->insnsi; i < prog->len; i++, insn++) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1233  		if (bpf_pseudo_func(insn)) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1234  			insn[0].imm = env->insn_aux_data[i].call_imm;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1235  			insn[1].imm = insn->off;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1236  			insn->off = 0;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1237  			continue;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1238  		}
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1239  		if (!bpf_pseudo_call(insn))
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1240  			continue;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1241  		insn->off = env->insn_aux_data[i].call_imm;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1242  		subprog = bpf_find_subprog(env, i + insn->off + 1);
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1243  		insn->imm = subprog;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1244  	}
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1245  
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1246  	prog->jited = 1;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1247  	prog->bpf_func = func[0]->bpf_func;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1248  	prog->jited_len = func[0]->jited_len;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1249  	prog->aux->extable = func[0]->aux->extable;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1250  	prog->aux->num_exentries = func[0]->aux->num_exentries;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1251  	prog->aux->func = func;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1252  	prog->aux->func_cnt = env->subprog_cnt - env->hidden_subprog_cnt;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1253  	prog->aux->real_func_cnt = env->subprog_cnt;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1254  	prog->aux->bpf_exception_cb = (void *)func[env->exception_callback_subprog]->bpf_func;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1255  	prog->aux->exception_boundary = func[0]->aux->exception_boundary;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1256  	bpf_prog_jit_attempt_done(prog);
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1257  	return 0;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1258  out_free:
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1259  	/* We failed JIT'ing, so at this point we need to unregister poke
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1260  	 * descriptors from subprogs, so that kernel is not attempting to
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1261  	 * patch it anymore as we're freeing the subprog JIT memory.
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1262  	 */
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1263  	for (i = 0; i < prog->aux->size_poke_tab; i++) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1264  		map_ptr = prog->aux->poke_tab[i].tail_call.map;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1265  		map_ptr->ops->map_poke_untrack(map_ptr, prog->aux);
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1266  	}
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1267  	/* At this point we're guaranteed that poke descriptors are not
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1268  	 * live anymore. We can just unlink its descriptor table as it's
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1269  	 * released with the main prog.
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1270  	 */
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1271  	for (i = 0; i < env->subprog_cnt; i++) {
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1272  		if (!func[i])
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1273  			continue;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1274  		func[i]->aux->poke_tab = NULL;
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1275  		bpf_jit_free(func[i]);
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1276  	}
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1277  	kfree(func);
449f08fa59dda5 Alexei Starovoitov 2026-04-12  1278  out_undo_insn:
d3e945223e0158 Xu Kuohai          2026-04-16  1279  	bpf_prog_jit_attempt_done(prog);
d3e945223e0158 Xu Kuohai          2026-04-16  1280  	return err;
d3e945223e0158 Xu Kuohai          2026-04-16  1281  }
d3e945223e0158 Xu Kuohai          2026-04-16  1282  

:::::: The code at line 1058 was first introduced by commit
:::::: 449f08fa59dda5da40317b6976604b877c4ecd63 bpf: Move fixup/post-processing logic from verifier.c into fixups.c

:::::: TO: Alexei Starovoitov <ast@kernel.org>
:::::: CC: Alexei Starovoitov <ast@kernel.org>

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

             reply	other threads:[~2026-05-09 12:45 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-09 12:45 kernel test robot [this message]
  -- strict thread matches above, loose matches on Subject: below --
2026-08-23 13:22 kernel/bpf/fixups.c:1058 jit_subprogs() warn: mask and shift to zero: expr='addr >> 32' kernel test robot

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=202605092030.Um03iYK8-lkp@intel.com \
    --to=lkp@intel.com \
    --cc=error27@gmail.com \
    --cc=oe-kbuild@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.