mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-18 05:29:50 -04:00
Merge branch 'bpf-add-_impl-suffix-for-kfuncs-with-implicit-args'
Mykyta Yatsenko says: ==================== bpf: Add _impl suffix for kfuncs with implicit args We have established a pattern of function naming win "_impl" suffix; those functions accept verifier-provided bpf_prog_aux argument. Following uniform convention will allow for transparent backwards compatibility with the upcoming KF_IMPLICIT_ARGS feature. This patch set aims to fix current deviation from the convention to eliminate unnecessary backwards incompatibility in the future. Three kfuncs added in 6.18 don’t follow this *_impl convention and therefore won’t participate in the new KF_IMPLICIT_ARGS mechanism: * bpf_task_work_schedule_resume() * bpf_task_work_schedule_signal() * bpf_stream_vprintk() Rename them to align with the implicit-arg flow: bpf_task_work_schedule_resume() -> bpf_task_work_schedule_resume_impl() bpf_task_work_schedule_signal() -> bpf_task_work_schedule_signal_impl() bpf_stream_vprintk() -> bpf_stream_vprintk_impl() The KF_IMPLICIT_ARGS mechanism is not in tree yet, so callers must switch to the *_impl names for now. Once the new mechanism lands, the plain names (without _impl) will be reintroduced. Signed-off-by: Mykyta Yatsenko <yatsenko@meta.com> Acked-by: Ihor Solodrai <ihor.solodrai@linux.dev> --- Changes in v3: - Fix commit messages - Link to v2: https://lore.kernel.org/r/20251104-implv2-v2-0-6dbc35f39f28@meta.com Changes in v1: - Split commit into 2 - Rebase on the correct branch - Link to v1: https://lore.kernel.org/all/20251103232319.122965-1-mykyta.yatsenko5@gmail.com/ ==================== Link: https://patch.msgid.link/20251104-implv2-v3-0-4772b9ae0e06@meta.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
@@ -4169,7 +4169,8 @@ static int bpf_task_work_schedule(struct task_struct *task, struct bpf_task_work
|
||||
}
|
||||
|
||||
/**
|
||||
* bpf_task_work_schedule_signal - Schedule BPF callback using task_work_add with TWA_SIGNAL mode
|
||||
* bpf_task_work_schedule_signal_impl - Schedule BPF callback using task_work_add with TWA_SIGNAL
|
||||
* mode
|
||||
* @task: Task struct for which callback should be scheduled
|
||||
* @tw: Pointer to struct bpf_task_work in BPF map value for internal bookkeeping
|
||||
* @map__map: bpf_map that embeds struct bpf_task_work in the values
|
||||
@@ -4178,15 +4179,17 @@ static int bpf_task_work_schedule(struct task_struct *task, struct bpf_task_work
|
||||
*
|
||||
* Return: 0 if task work has been scheduled successfully, negative error code otherwise
|
||||
*/
|
||||
__bpf_kfunc int bpf_task_work_schedule_signal(struct task_struct *task, struct bpf_task_work *tw,
|
||||
void *map__map, bpf_task_work_callback_t callback,
|
||||
void *aux__prog)
|
||||
__bpf_kfunc int bpf_task_work_schedule_signal_impl(struct task_struct *task,
|
||||
struct bpf_task_work *tw, void *map__map,
|
||||
bpf_task_work_callback_t callback,
|
||||
void *aux__prog)
|
||||
{
|
||||
return bpf_task_work_schedule(task, tw, map__map, callback, aux__prog, TWA_SIGNAL);
|
||||
}
|
||||
|
||||
/**
|
||||
* bpf_task_work_schedule_resume - Schedule BPF callback using task_work_add with TWA_RESUME mode
|
||||
* bpf_task_work_schedule_resume_impl - Schedule BPF callback using task_work_add with TWA_RESUME
|
||||
* mode
|
||||
* @task: Task struct for which callback should be scheduled
|
||||
* @tw: Pointer to struct bpf_task_work in BPF map value for internal bookkeeping
|
||||
* @map__map: bpf_map that embeds struct bpf_task_work in the values
|
||||
@@ -4195,9 +4198,10 @@ __bpf_kfunc int bpf_task_work_schedule_signal(struct task_struct *task, struct b
|
||||
*
|
||||
* Return: 0 if task work has been scheduled successfully, negative error code otherwise
|
||||
*/
|
||||
__bpf_kfunc int bpf_task_work_schedule_resume(struct task_struct *task, struct bpf_task_work *tw,
|
||||
void *map__map, bpf_task_work_callback_t callback,
|
||||
void *aux__prog)
|
||||
__bpf_kfunc int bpf_task_work_schedule_resume_impl(struct task_struct *task,
|
||||
struct bpf_task_work *tw, void *map__map,
|
||||
bpf_task_work_callback_t callback,
|
||||
void *aux__prog)
|
||||
{
|
||||
return bpf_task_work_schedule(task, tw, map__map, callback, aux__prog, TWA_RESUME);
|
||||
}
|
||||
@@ -4376,9 +4380,9 @@ BTF_ID_FLAGS(func, bpf_strnstr);
|
||||
#if defined(CONFIG_BPF_LSM) && defined(CONFIG_CGROUPS)
|
||||
BTF_ID_FLAGS(func, bpf_cgroup_read_xattr, KF_RCU)
|
||||
#endif
|
||||
BTF_ID_FLAGS(func, bpf_stream_vprintk, KF_TRUSTED_ARGS)
|
||||
BTF_ID_FLAGS(func, bpf_task_work_schedule_signal, KF_TRUSTED_ARGS)
|
||||
BTF_ID_FLAGS(func, bpf_task_work_schedule_resume, KF_TRUSTED_ARGS)
|
||||
BTF_ID_FLAGS(func, bpf_stream_vprintk_impl, KF_TRUSTED_ARGS)
|
||||
BTF_ID_FLAGS(func, bpf_task_work_schedule_signal_impl, KF_TRUSTED_ARGS)
|
||||
BTF_ID_FLAGS(func, bpf_task_work_schedule_resume_impl, KF_TRUSTED_ARGS)
|
||||
BTF_KFUNCS_END(common_btf_ids)
|
||||
|
||||
static const struct btf_kfunc_id_set common_kfunc_set = {
|
||||
|
||||
@@ -355,7 +355,8 @@ __bpf_kfunc_start_defs();
|
||||
* Avoid using enum bpf_stream_id so that kfunc users don't have to pull in the
|
||||
* enum in headers.
|
||||
*/
|
||||
__bpf_kfunc int bpf_stream_vprintk(int stream_id, const char *fmt__str, const void *args, u32 len__sz, void *aux__prog)
|
||||
__bpf_kfunc int bpf_stream_vprintk_impl(int stream_id, const char *fmt__str, const void *args,
|
||||
u32 len__sz, void *aux__prog)
|
||||
{
|
||||
struct bpf_bprintf_data data = {
|
||||
.get_bin_args = true,
|
||||
|
||||
@@ -12259,8 +12259,8 @@ enum special_kfunc_type {
|
||||
KF_bpf_res_spin_lock_irqsave,
|
||||
KF_bpf_res_spin_unlock_irqrestore,
|
||||
KF___bpf_trap,
|
||||
KF_bpf_task_work_schedule_signal,
|
||||
KF_bpf_task_work_schedule_resume,
|
||||
KF_bpf_task_work_schedule_signal_impl,
|
||||
KF_bpf_task_work_schedule_resume_impl,
|
||||
};
|
||||
|
||||
BTF_ID_LIST(special_kfunc_list)
|
||||
@@ -12331,13 +12331,13 @@ BTF_ID(func, bpf_res_spin_unlock)
|
||||
BTF_ID(func, bpf_res_spin_lock_irqsave)
|
||||
BTF_ID(func, bpf_res_spin_unlock_irqrestore)
|
||||
BTF_ID(func, __bpf_trap)
|
||||
BTF_ID(func, bpf_task_work_schedule_signal)
|
||||
BTF_ID(func, bpf_task_work_schedule_resume)
|
||||
BTF_ID(func, bpf_task_work_schedule_signal_impl)
|
||||
BTF_ID(func, bpf_task_work_schedule_resume_impl)
|
||||
|
||||
static bool is_task_work_add_kfunc(u32 func_id)
|
||||
{
|
||||
return func_id == special_kfunc_list[KF_bpf_task_work_schedule_signal] ||
|
||||
func_id == special_kfunc_list[KF_bpf_task_work_schedule_resume];
|
||||
return func_id == special_kfunc_list[KF_bpf_task_work_schedule_signal_impl] ||
|
||||
func_id == special_kfunc_list[KF_bpf_task_work_schedule_resume_impl];
|
||||
}
|
||||
|
||||
static bool is_kfunc_ret_null(struct bpf_kfunc_call_arg_meta *meta)
|
||||
|
||||
@@ -182,7 +182,7 @@ bpftool prog tracelog
|
||||
|
||||
bpftool prog tracelog { stdout | stderr } *PROG*
|
||||
Dump the BPF stream of the program. BPF programs can write to these streams
|
||||
at runtime with the **bpf_stream_vprintk**\ () kfunc. The kernel may write
|
||||
at runtime with the **bpf_stream_vprintk_impl**\ () kfunc. The kernel may write
|
||||
error messages to the standard error stream. This facility should be used
|
||||
only for debugging purposes.
|
||||
|
||||
|
||||
@@ -315,20 +315,20 @@ enum libbpf_tristate {
|
||||
___param, sizeof(___param)); \
|
||||
})
|
||||
|
||||
extern int bpf_stream_vprintk(int stream_id, const char *fmt__str, const void *args,
|
||||
__u32 len__sz, void *aux__prog) __weak __ksym;
|
||||
extern int bpf_stream_vprintk_impl(int stream_id, const char *fmt__str, const void *args,
|
||||
__u32 len__sz, void *aux__prog) __weak __ksym;
|
||||
|
||||
#define bpf_stream_printk(stream_id, fmt, args...) \
|
||||
({ \
|
||||
static const char ___fmt[] = fmt; \
|
||||
unsigned long long ___param[___bpf_narg(args)]; \
|
||||
\
|
||||
_Pragma("GCC diagnostic push") \
|
||||
_Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \
|
||||
___bpf_fill(___param, args); \
|
||||
_Pragma("GCC diagnostic pop") \
|
||||
\
|
||||
bpf_stream_vprintk(stream_id, ___fmt, ___param, sizeof(___param), NULL);\
|
||||
#define bpf_stream_printk(stream_id, fmt, args...) \
|
||||
({ \
|
||||
static const char ___fmt[] = fmt; \
|
||||
unsigned long long ___param[___bpf_narg(args)]; \
|
||||
\
|
||||
_Pragma("GCC diagnostic push") \
|
||||
_Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \
|
||||
___bpf_fill(___param, args); \
|
||||
_Pragma("GCC diagnostic pop") \
|
||||
\
|
||||
bpf_stream_vprintk_impl(stream_id, ___fmt, ___param, sizeof(___param), NULL); \
|
||||
})
|
||||
|
||||
/* Use __bpf_printk when bpf_printk call has 3 or fewer fmt args
|
||||
|
||||
@@ -10,7 +10,7 @@ SEC("syscall")
|
||||
__failure __msg("Possibly NULL pointer passed")
|
||||
int stream_vprintk_null_arg(void *ctx)
|
||||
{
|
||||
bpf_stream_vprintk(BPF_STDOUT, "", NULL, 0, NULL);
|
||||
bpf_stream_vprintk_impl(BPF_STDOUT, "", NULL, 0, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ SEC("syscall")
|
||||
__failure __msg("R3 type=scalar expected=")
|
||||
int stream_vprintk_scalar_arg(void *ctx)
|
||||
{
|
||||
bpf_stream_vprintk(BPF_STDOUT, "", (void *)46, 0, NULL);
|
||||
bpf_stream_vprintk_impl(BPF_STDOUT, "", (void *)46, 0, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ SEC("syscall")
|
||||
__failure __msg("arg#1 doesn't point to a const string")
|
||||
int stream_vprintk_string_arg(void *ctx)
|
||||
{
|
||||
bpf_stream_vprintk(BPF_STDOUT, ctx, NULL, 0, NULL);
|
||||
bpf_stream_vprintk_impl(BPF_STDOUT, ctx, NULL, 0, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ int oncpu_hash_map(struct pt_regs *args)
|
||||
if (!work)
|
||||
return 0;
|
||||
|
||||
bpf_task_work_schedule_resume(task, &work->tw, &hmap, process_work, NULL);
|
||||
bpf_task_work_schedule_resume_impl(task, &work->tw, &hmap, process_work, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -80,7 +80,7 @@ int oncpu_array_map(struct pt_regs *args)
|
||||
work = bpf_map_lookup_elem(&arrmap, &key);
|
||||
if (!work)
|
||||
return 0;
|
||||
bpf_task_work_schedule_signal(task, &work->tw, &arrmap, process_work, NULL);
|
||||
bpf_task_work_schedule_signal_impl(task, &work->tw, &arrmap, process_work, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -102,6 +102,6 @@ int oncpu_lru_map(struct pt_regs *args)
|
||||
work = bpf_map_lookup_elem(&lrumap, &key);
|
||||
if (!work || work->data[0])
|
||||
return 0;
|
||||
bpf_task_work_schedule_resume(task, &work->tw, &lrumap, process_work, NULL);
|
||||
bpf_task_work_schedule_resume_impl(task, &work->tw, &lrumap, process_work, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ int mismatch_map(struct pt_regs *args)
|
||||
work = bpf_map_lookup_elem(&arrmap, &key);
|
||||
if (!work)
|
||||
return 0;
|
||||
bpf_task_work_schedule_resume(task, &work->tw, &hmap, process_work, NULL);
|
||||
bpf_task_work_schedule_resume_impl(task, &work->tw, &hmap, process_work, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ int no_map_task_work(struct pt_regs *args)
|
||||
struct bpf_task_work tw;
|
||||
|
||||
task = bpf_get_current_task_btf();
|
||||
bpf_task_work_schedule_resume(task, &tw, &hmap, process_work, NULL);
|
||||
bpf_task_work_schedule_resume_impl(task, &tw, &hmap, process_work, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -76,7 +76,7 @@ int task_work_null(struct pt_regs *args)
|
||||
struct task_struct *task;
|
||||
|
||||
task = bpf_get_current_task_btf();
|
||||
bpf_task_work_schedule_resume(task, NULL, &hmap, process_work, NULL);
|
||||
bpf_task_work_schedule_resume_impl(task, NULL, &hmap, process_work, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -91,6 +91,6 @@ int map_null(struct pt_regs *args)
|
||||
work = bpf_map_lookup_elem(&arrmap, &key);
|
||||
if (!work)
|
||||
return 0;
|
||||
bpf_task_work_schedule_resume(task, &work->tw, NULL, process_work, NULL);
|
||||
bpf_task_work_schedule_resume_impl(task, &work->tw, NULL, process_work, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -51,8 +51,8 @@ int schedule_task_work(void *ctx)
|
||||
if (!work)
|
||||
return 0;
|
||||
}
|
||||
err = bpf_task_work_schedule_signal(bpf_get_current_task_btf(), &work->tw, &hmap,
|
||||
process_work, NULL);
|
||||
err = bpf_task_work_schedule_signal_impl(bpf_get_current_task_btf(), &work->tw, &hmap,
|
||||
process_work, NULL);
|
||||
if (err)
|
||||
__sync_fetch_and_add(&schedule_error, 1);
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user