]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
bpf: Add __force annotations to silence sparse warnings
authorMykyta Yatsenko <yatsenko@meta.com>
Thu, 15 Jan 2026 18:45:09 +0000 (18:45 +0000)
committerAndrii Nakryiko <andrii@kernel.org>
Fri, 16 Jan 2026 22:21:11 +0000 (14:21 -0800)
Add __force annotations to casts that convert between __user and kernel
address spaces. These casts are intentional:

- In bpf_send_signal_common(), the value is stored in si_value.sival_ptr
  which is typed as void __user *, but the value comes from a BPF
  program parameter.

- In the bpf_*_dynptr() kfuncs, user pointers are cast to const void *
  before being passed to copy helper functions that correctly handle
  the user address space through copy_from_user variants.

Without __force, sparse reports:
  warning: cast removes address space '__user' of expression

Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Mykyta Yatsenko <yatsenko@meta.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20260115184509.3585759-1-mykyta.yatsenko5@gmail.com
Closes: https://lore.kernel.org/oe-kbuild-all/202601131740.6C3BdBaB-lkp@intel.com/
kernel/trace/bpf_trace.c

index 3a17f79b20c2c7e3a62ca10c5b8243df7f9327df..f73e08c223b5b3a53eb4e71b4e94993a0de148f5 100644 (file)
@@ -830,7 +830,7 @@ static int bpf_send_signal_common(u32 sig, enum pid_type type, struct task_struc
                info.si_code = SI_KERNEL;
                info.si_pid = 0;
                info.si_uid = 0;
-               info.si_value.sival_ptr = (void *)(unsigned long)value;
+               info.si_value.sival_ptr = (void __user __force *)(unsigned long)value;
                siginfo = &info;
        }
 
@@ -3518,7 +3518,7 @@ __bpf_kfunc int bpf_send_signal_task(struct task_struct *task, int sig, enum pid
 __bpf_kfunc int bpf_probe_read_user_dynptr(struct bpf_dynptr *dptr, u64 off,
                                           u64 size, const void __user *unsafe_ptr__ign)
 {
-       return __bpf_dynptr_copy(dptr, off, size, (const void *)unsafe_ptr__ign,
+       return __bpf_dynptr_copy(dptr, off, size, (const void __force *)unsafe_ptr__ign,
                                 copy_user_data_nofault, NULL);
 }
 
@@ -3532,7 +3532,7 @@ __bpf_kfunc int bpf_probe_read_kernel_dynptr(struct bpf_dynptr *dptr, u64 off,
 __bpf_kfunc int bpf_probe_read_user_str_dynptr(struct bpf_dynptr *dptr, u64 off,
                                               u64 size, const void __user *unsafe_ptr__ign)
 {
-       return __bpf_dynptr_copy_str(dptr, off, size, (const void *)unsafe_ptr__ign,
+       return __bpf_dynptr_copy_str(dptr, off, size, (const void __force *)unsafe_ptr__ign,
                                     copy_user_str_nofault, NULL);
 }
 
@@ -3546,14 +3546,14 @@ __bpf_kfunc int bpf_probe_read_kernel_str_dynptr(struct bpf_dynptr *dptr, u64 of
 __bpf_kfunc int bpf_copy_from_user_dynptr(struct bpf_dynptr *dptr, u64 off,
                                          u64 size, const void __user *unsafe_ptr__ign)
 {
-       return __bpf_dynptr_copy(dptr, off, size, (const void *)unsafe_ptr__ign,
+       return __bpf_dynptr_copy(dptr, off, size, (const void __force *)unsafe_ptr__ign,
                                 copy_user_data_sleepable, NULL);
 }
 
 __bpf_kfunc int bpf_copy_from_user_str_dynptr(struct bpf_dynptr *dptr, u64 off,
                                              u64 size, const void __user *unsafe_ptr__ign)
 {
-       return __bpf_dynptr_copy_str(dptr, off, size, (const void *)unsafe_ptr__ign,
+       return __bpf_dynptr_copy_str(dptr, off, size, (const void __force *)unsafe_ptr__ign,
                                     copy_user_str_sleepable, NULL);
 }
 
@@ -3561,7 +3561,7 @@ __bpf_kfunc int bpf_copy_from_user_task_dynptr(struct bpf_dynptr *dptr, u64 off,
                                               u64 size, const void __user *unsafe_ptr__ign,
                                               struct task_struct *tsk)
 {
-       return __bpf_dynptr_copy(dptr, off, size, (const void *)unsafe_ptr__ign,
+       return __bpf_dynptr_copy(dptr, off, size, (const void __force *)unsafe_ptr__ign,
                                 copy_user_data_sleepable, tsk);
 }
 
@@ -3569,7 +3569,7 @@ __bpf_kfunc int bpf_copy_from_user_task_str_dynptr(struct bpf_dynptr *dptr, u64
                                                   u64 size, const void __user *unsafe_ptr__ign,
                                                   struct task_struct *tsk)
 {
-       return __bpf_dynptr_copy_str(dptr, off, size, (const void *)unsafe_ptr__ign,
+       return __bpf_dynptr_copy_str(dptr, off, size, (const void __force *)unsafe_ptr__ign,
                                     copy_user_str_sleepable, tsk);
 }