@@ -12294,6 +12294,7 @@ enum special_kfunc_type {
1229412294 KF_bpf_task_work_schedule_signal,
1229512295 KF_bpf_task_work_schedule_resume,
1229612296 KF_bpf_tracing_is_exit,
12297+ KF_bpf_fsession_cookie,
1229712298};
1229812299
1229912300BTF_ID_LIST(special_kfunc_list)
@@ -12367,6 +12368,7 @@ BTF_ID(func, __bpf_trap)
1236712368BTF_ID(func, bpf_task_work_schedule_signal)
1236812369BTF_ID(func, bpf_task_work_schedule_resume)
1236912370BTF_ID(func, bpf_tracing_is_exit)
12371+ BTF_ID(func, bpf_fsession_cookie)
1237012372
1237112373static bool is_task_work_add_kfunc(u32 func_id)
1237212374{
@@ -12422,7 +12424,8 @@ get_kfunc_ptr_arg_type(struct bpf_verifier_env *env,
1242212424 bool arg_mem_size = false;
1242312425
1242412426 if (meta->func_id == special_kfunc_list[KF_bpf_cast_to_kern_ctx] ||
12425- meta->func_id == special_kfunc_list[KF_bpf_tracing_is_exit])
12427+ meta->func_id == special_kfunc_list[KF_bpf_tracing_is_exit] ||
12428+ meta->func_id == special_kfunc_list[KF_bpf_fsession_cookie])
1242612429 return KF_ARG_PTR_TO_CTX;
1242712430
1242812431 /* In this function, we verify the kfunc's BTF as per the argument type,
@@ -13915,7 +13918,8 @@ static int check_kfunc_call(struct bpf_verifier_env *env, struct bpf_insn *insn,
1391513918 }
1391613919 }
1391713920
13918- if (meta.func_id == special_kfunc_list[KF_bpf_session_cookie]) {
13921+ if (meta.func_id == special_kfunc_list[KF_bpf_session_cookie] ||
13922+ meta.func_id == special_kfunc_list[KF_bpf_fsession_cookie]) {
1391913923 meta.r0_size = sizeof(u64);
1392013924 meta.r0_rdonly = false;
1392113925 }
@@ -14196,6 +14200,9 @@ static int check_kfunc_call(struct bpf_verifier_env *env, struct bpf_insn *insn,
1419614200 return err;
1419714201 }
1419814202
14203+ if (meta.func_id == special_kfunc_list[KF_bpf_fsession_cookie])
14204+ env->prog->call_session_cookie = true;
14205+
1419914206 return 0;
1420014207}
1420114208
@@ -22025,6 +22032,15 @@ static int fixup_kfunc_call(struct bpf_verifier_env *env, struct bpf_insn *insn,
2202522032 insn_buf[4] = BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0);
2202622033 insn_buf[5] = BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1);
2202722034 *cnt = 6;
22035+ } else if (desc->func_id == special_kfunc_list[KF_bpf_fsession_cookie]) {
22036+ /* Load nr_args from ctx - 8 */
22037+ insn_buf[0] = BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, -8);
22038+ /* add rax, 2 */
22039+ insn_buf[1] = BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 2);
22040+ insn_buf[2] = BPF_ALU64_IMM(BPF_LSH, BPF_REG_0, 3);
22041+ insn_buf[3] = BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1);
22042+ insn_buf[4] = BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0);
22043+ *cnt = 5;
2202822044 }
2202922045
2203022046 if (env->insn_aux_data[insn_idx].arg_prog) {
0 commit comments