* [PATCH 1/2] [v2] bpf: hide unused bpf_patch_call_args
@ 2023-05-23 19:43 Arnd Bergmann
2023-05-23 19:43 ` [PATCH 2/2] [v2] bpf: fix bpf_probe_read_kernel prototype mismatch Arnd Bergmann
2023-05-24 3:05 ` [PATCH 1/2] [v2] bpf: hide unused bpf_patch_call_args Yonghong Song
0 siblings, 2 replies; 8+ messages in thread
From: Arnd Bergmann @ 2023-05-23 19:43 UTC (permalink / raw)
To: Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko
Cc: Arnd Bergmann, John Fastabend, Martin KaFai Lau, Song Liu,
Yonghong Song, KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa,
Jason A. Donenfeld, bpf, linux-kernel
From: Arnd Bergmann <arnd@arndb.de>
This function has no callers and no declaration when CONFIG_BPF_JIT_ALWAYS_ON
is enabled:
kernel/bpf/core.c:2075:6: error: no previous prototype for 'bpf_patch_call_args' [-Werror=missing-prototypes]
Hide the definition as well.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
v2: change indentation to align arguments better. Still not great
as the line is just too long
---
kernel/bpf/core.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c
index 7421487422d4..0926714641eb 100644
--- a/kernel/bpf/core.c
+++ b/kernel/bpf/core.c
@@ -2064,14 +2064,16 @@ EVAL4(PROG_NAME_LIST, 416, 448, 480, 512)
};
#undef PROG_NAME_LIST
#define PROG_NAME_LIST(stack_size) PROG_NAME_ARGS(stack_size),
-static u64 (*interpreters_args[])(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5,
- const struct bpf_insn *insn) = {
+static __maybe_unused
+u64 (*interpreters_args[])(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5,
+ const struct bpf_insn *insn) = {
EVAL6(PROG_NAME_LIST, 32, 64, 96, 128, 160, 192)
EVAL6(PROG_NAME_LIST, 224, 256, 288, 320, 352, 384)
EVAL4(PROG_NAME_LIST, 416, 448, 480, 512)
};
#undef PROG_NAME_LIST
+#ifdef CONFIG_BPF_SYSCALL
void bpf_patch_call_args(struct bpf_insn *insn, u32 stack_depth)
{
stack_depth = max_t(u32, stack_depth, 1);
@@ -2080,6 +2082,7 @@ void bpf_patch_call_args(struct bpf_insn *insn, u32 stack_depth)
__bpf_call_base_args;
insn->code = BPF_JMP | BPF_CALL_ARGS;
}
+#endif
#else
static unsigned int __bpf_prog_ret0_warn(const void *ctx,
--
2.39.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/2] [v2] bpf: fix bpf_probe_read_kernel prototype mismatch
2023-05-23 19:43 [PATCH 1/2] [v2] bpf: hide unused bpf_patch_call_args Arnd Bergmann
@ 2023-05-23 19:43 ` Arnd Bergmann
2023-05-24 3:12 ` Yonghong Song
2023-05-24 3:05 ` [PATCH 1/2] [v2] bpf: hide unused bpf_patch_call_args Yonghong Song
1 sibling, 1 reply; 8+ messages in thread
From: Arnd Bergmann @ 2023-05-23 19:43 UTC (permalink / raw)
To: Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko, Song Liu,
Steven Rostedt, Masami Hiramatsu
Cc: Arnd Bergmann, stable, Martin KaFai Lau, Yonghong Song,
John Fastabend, KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa,
Kumar Kartikeya Dwivedi, Dave Marchevsky, Joanne Koong,
Delyan Kratunov, Peter Zijlstra, bpf, linux-kernel,
linux-trace-kernel
From: Arnd Bergmann <arnd@arndb.de>
bpf_probe_read_kernel() has a __weak definition in core.c and another
definition with an incompatible prototype in kernel/trace/bpf_trace.c,
when CONFIG_BPF_EVENTS is enabled.
Since the two are incompatible, there cannot be a shared declaration
in a header file, but the lack of a prototype causes a W=1 warning:
kernel/bpf/core.c:1638:12: error: no previous prototype for 'bpf_probe_read_kernel' [-Werror=missing-prototypes]
Change the core.c file to only reference the inner
bpf_probe_read_kernel_common() helper and provide a prototype for that.
Aside from the warning, this addresses a bug on 32-bit architectures
from incorrect argument passing with the mismatched prototype.
Cc: stable@vger.kernel.org
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
--
v2: rewrite completely to fix the mismatch.
---
include/linux/bpf.h | 2 ++
kernel/bpf/core.c | 9 ++++++---
kernel/trace/bpf_trace.c | 3 +--
3 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/include/linux/bpf.h b/include/linux/bpf.h
index 36e4b2d8cca2..6a231ec61a87 100644
--- a/include/linux/bpf.h
+++ b/include/linux/bpf.h
@@ -2619,6 +2619,8 @@ static inline void bpf_dynptr_set_rdonly(struct bpf_dynptr_kern *ptr)
}
#endif /* CONFIG_BPF_SYSCALL */
+int bpf_probe_read_kernel_common(void *dst, u32 size, const void *unsafe_ptr);
+
void __bpf_free_used_btfs(struct bpf_prog_aux *aux,
struct btf_mod_pair *used_btfs, u32 len);
diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c
index 0926714641eb..e7f0d5f146fa 100644
--- a/kernel/bpf/core.c
+++ b/kernel/bpf/core.c
@@ -35,6 +35,7 @@
#include <linux/bpf_verifier.h>
#include <linux/nodemask.h>
#include <linux/nospec.h>
+#include <linux/bpf.h>
#include <linux/bpf_mem_alloc.h>
#include <linux/memcontrol.h>
@@ -1635,11 +1636,13 @@ bool bpf_opcode_in_insntable(u8 code)
}
#ifndef CONFIG_BPF_JIT_ALWAYS_ON
-u64 __weak bpf_probe_read_kernel(void *dst, u32 size, const void *unsafe_ptr)
+#ifndef CONFIG_BPF_EVENTS
+int bpf_probe_read_kernel_common(void * dst, u32 size, const void *unsafe_ptr)
{
memset(dst, 0, size);
return -EFAULT;
}
+#endif
/**
* ___bpf_prog_run - run eBPF program on a given context
@@ -1931,8 +1934,8 @@ static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn)
DST = *(SIZE *)(unsigned long) (SRC + insn->off); \
CONT; \
LDX_PROBE_MEM_##SIZEOP: \
- bpf_probe_read_kernel(&DST, sizeof(SIZE), \
- (const void *)(long) (SRC + insn->off)); \
+ bpf_probe_read_kernel_common(&DST, sizeof(SIZE), \
+ (const void *)(long) (SRC + insn->off)); \
DST = *((SIZE *)&DST); \
CONT;
diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
index 2bc41e6ac9fe..290fdce2ce53 100644
--- a/kernel/trace/bpf_trace.c
+++ b/kernel/trace/bpf_trace.c
@@ -223,8 +223,7 @@ const struct bpf_func_proto bpf_probe_read_user_str_proto = {
.arg3_type = ARG_ANYTHING,
};
-static __always_inline int
-bpf_probe_read_kernel_common(void *dst, u32 size, const void *unsafe_ptr)
+int bpf_probe_read_kernel_common(void *dst, u32 size, const void *unsafe_ptr)
{
int ret;
--
2.39.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] [v2] bpf: hide unused bpf_patch_call_args
2023-05-23 19:43 [PATCH 1/2] [v2] bpf: hide unused bpf_patch_call_args Arnd Bergmann
2023-05-23 19:43 ` [PATCH 2/2] [v2] bpf: fix bpf_probe_read_kernel prototype mismatch Arnd Bergmann
@ 2023-05-24 3:05 ` Yonghong Song
2023-05-24 13:23 ` Arnd Bergmann
1 sibling, 1 reply; 8+ messages in thread
From: Yonghong Song @ 2023-05-24 3:05 UTC (permalink / raw)
To: Arnd Bergmann, Alexei Starovoitov, Daniel Borkmann,
Andrii Nakryiko
Cc: Arnd Bergmann, John Fastabend, Martin KaFai Lau, Song Liu,
Yonghong Song, KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa,
Jason A. Donenfeld, bpf, linux-kernel
On 5/23/23 12:43 PM, Arnd Bergmann wrote:
> From: Arnd Bergmann <arnd@arndb.de>
>
> This function has no callers and no declaration when CONFIG_BPF_JIT_ALWAYS_ON
> is enabled:
>
> kernel/bpf/core.c:2075:6: error: no previous prototype for 'bpf_patch_call_args' [-Werror=missing-prototypes]
If CONFIG_BPF_JIT_ALWAYS_ON is enabled, the definition of
bpf_patch_call_args should be invisible. Maybe I missed something.
Could you list *ALL& bpf related config options in your setup
so people can reproduce you above error messages?
>
> Hide the definition as well.
>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> ---
> v2: change indentation to align arguments better. Still not great
> as the line is just too long
> ---
> kernel/bpf/core.c | 7 +++++--
> 1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c
> index 7421487422d4..0926714641eb 100644
> --- a/kernel/bpf/core.c
> +++ b/kernel/bpf/core.c
> @@ -2064,14 +2064,16 @@ EVAL4(PROG_NAME_LIST, 416, 448, 480, 512)
> };
> #undef PROG_NAME_LIST
> #define PROG_NAME_LIST(stack_size) PROG_NAME_ARGS(stack_size),
> -static u64 (*interpreters_args[])(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5,
> - const struct bpf_insn *insn) = {
> +static __maybe_unused
> +u64 (*interpreters_args[])(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5,
> + const struct bpf_insn *insn) = {
> EVAL6(PROG_NAME_LIST, 32, 64, 96, 128, 160, 192)
> EVAL6(PROG_NAME_LIST, 224, 256, 288, 320, 352, 384)
> EVAL4(PROG_NAME_LIST, 416, 448, 480, 512)
> };
> #undef PROG_NAME_LIST
>
> +#ifdef CONFIG_BPF_SYSCALL
> void bpf_patch_call_args(struct bpf_insn *insn, u32 stack_depth)
> {
> stack_depth = max_t(u32, stack_depth, 1);
> @@ -2080,6 +2082,7 @@ void bpf_patch_call_args(struct bpf_insn *insn, u32 stack_depth)
> __bpf_call_base_args;
> insn->code = BPF_JMP | BPF_CALL_ARGS;
> }
> +#endif
>
> #else
> static unsigned int __bpf_prog_ret0_warn(const void *ctx,
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] [v2] bpf: fix bpf_probe_read_kernel prototype mismatch
2023-05-23 19:43 ` [PATCH 2/2] [v2] bpf: fix bpf_probe_read_kernel prototype mismatch Arnd Bergmann
@ 2023-05-24 3:12 ` Yonghong Song
2023-05-24 13:28 ` Arnd Bergmann
0 siblings, 1 reply; 8+ messages in thread
From: Yonghong Song @ 2023-05-24 3:12 UTC (permalink / raw)
To: Arnd Bergmann, Alexei Starovoitov, Daniel Borkmann,
Andrii Nakryiko, Song Liu, Steven Rostedt, Masami Hiramatsu
Cc: Arnd Bergmann, stable, Martin KaFai Lau, Yonghong Song,
John Fastabend, KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa,
Kumar Kartikeya Dwivedi, Dave Marchevsky, Joanne Koong,
Delyan Kratunov, Peter Zijlstra, bpf, linux-kernel,
linux-trace-kernel
On 5/23/23 12:43 PM, Arnd Bergmann wrote:
> From: Arnd Bergmann <arnd@arndb.de>
>
> bpf_probe_read_kernel() has a __weak definition in core.c and another
> definition with an incompatible prototype in kernel/trace/bpf_trace.c,
> when CONFIG_BPF_EVENTS is enabled.
>
> Since the two are incompatible, there cannot be a shared declaration
> in a header file, but the lack of a prototype causes a W=1 warning:
>
> kernel/bpf/core.c:1638:12: error: no previous prototype for 'bpf_probe_read_kernel' [-Werror=missing-prototypes]
>
> Change the core.c file to only reference the inner
> bpf_probe_read_kernel_common() helper and provide a prototype for that.
>
> Aside from the warning, this addresses a bug on 32-bit architectures
> from incorrect argument passing with the mismatched prototype.
Could you explain what is this '32-bit architectures ... incorrect
argument passing' thing?
>
> Cc: stable@vger.kernel.org
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> --
> v2: rewrite completely to fix the mismatch.
> ---
> include/linux/bpf.h | 2 ++
> kernel/bpf/core.c | 9 ++++++---
> kernel/trace/bpf_trace.c | 3 +--
> 3 files changed, 9 insertions(+), 5 deletions(-)
>
> diff --git a/include/linux/bpf.h b/include/linux/bpf.h
> index 36e4b2d8cca2..6a231ec61a87 100644
> --- a/include/linux/bpf.h
> +++ b/include/linux/bpf.h
> @@ -2619,6 +2619,8 @@ static inline void bpf_dynptr_set_rdonly(struct bpf_dynptr_kern *ptr)
> }
> #endif /* CONFIG_BPF_SYSCALL */
>
> +int bpf_probe_read_kernel_common(void *dst, u32 size, const void *unsafe_ptr);
> +
> void __bpf_free_used_btfs(struct bpf_prog_aux *aux,
> struct btf_mod_pair *used_btfs, u32 len);
>
> diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c
> index 0926714641eb..e7f0d5f146fa 100644
> --- a/kernel/bpf/core.c
> +++ b/kernel/bpf/core.c
> @@ -35,6 +35,7 @@
> #include <linux/bpf_verifier.h>
> #include <linux/nodemask.h>
> #include <linux/nospec.h>
> +#include <linux/bpf.h>
> #include <linux/bpf_mem_alloc.h>
> #include <linux/memcontrol.h>
>
> @@ -1635,11 +1636,13 @@ bool bpf_opcode_in_insntable(u8 code)
> }
>
> #ifndef CONFIG_BPF_JIT_ALWAYS_ON
> -u64 __weak bpf_probe_read_kernel(void *dst, u32 size, const void *unsafe_ptr)
> +#ifndef CONFIG_BPF_EVENTS
> +int bpf_probe_read_kernel_common(void * dst, u32 size, const void *unsafe_ptr)
void * dst => void *dst
> {
> memset(dst, 0, size);
> return -EFAULT;
> }
> +#endif
>
> /**
> * ___bpf_prog_run - run eBPF program on a given context
> @@ -1931,8 +1934,8 @@ static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn)
> DST = *(SIZE *)(unsigned long) (SRC + insn->off); \
> CONT; \
> LDX_PROBE_MEM_##SIZEOP: \
> - bpf_probe_read_kernel(&DST, sizeof(SIZE), \
> - (const void *)(long) (SRC + insn->off)); \
> + bpf_probe_read_kernel_common(&DST, sizeof(SIZE), \
> + (const void *)(long) (SRC + insn->off)); \
> DST = *((SIZE *)&DST); \
> CONT;
>
> diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
> index 2bc41e6ac9fe..290fdce2ce53 100644
> --- a/kernel/trace/bpf_trace.c
> +++ b/kernel/trace/bpf_trace.c
> @@ -223,8 +223,7 @@ const struct bpf_func_proto bpf_probe_read_user_str_proto = {
> .arg3_type = ARG_ANYTHING,
> };
>
> -static __always_inline int
> -bpf_probe_read_kernel_common(void *dst, u32 size, const void *unsafe_ptr)
> +int bpf_probe_read_kernel_common(void *dst, u32 size, const void *unsafe_ptr)
> {
> int ret;
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] [v2] bpf: hide unused bpf_patch_call_args
2023-05-24 3:05 ` [PATCH 1/2] [v2] bpf: hide unused bpf_patch_call_args Yonghong Song
@ 2023-05-24 13:23 ` Arnd Bergmann
2023-05-24 18:12 ` Yonghong Song
0 siblings, 1 reply; 8+ messages in thread
From: Arnd Bergmann @ 2023-05-24 13:23 UTC (permalink / raw)
To: Yonghong Song, Arnd Bergmann, Alexei Starovoitov, Daniel Borkmann,
Andrii Nakryiko
Cc: John Fastabend, Martin KaFai Lau, Song Liu, Yonghong Song,
KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa,
Jason A . Donenfeld, bpf, linux-kernel
On Wed, May 24, 2023, at 05:05, Yonghong Song wrote:
> On 5/23/23 12:43 PM, Arnd Bergmann wrote:
>> From: Arnd Bergmann <arnd@arndb.de>
>>
>> This function has no callers and no declaration when CONFIG_BPF_JIT_ALWAYS_ON
>> is enabled:
>>
>> kernel/bpf/core.c:2075:6: error: no previous prototype for 'bpf_patch_call_args' [-Werror=missing-prototypes]
>
> If CONFIG_BPF_JIT_ALWAYS_ON is enabled, the definition of
> bpf_patch_call_args should be invisible. Maybe I missed something.
> Could you list *ALL& bpf related config options in your setup
> so people can reproduce you above error messages?
Sorry, my mistake. I've reworded the changelog now to fix this:
| This function is only used when CONFIG_BPF_JIT_ALWAYS_ON is disabled,
| but CONFIG_BPF_SYSCALL is enabled. When both are turned off, the
| prototype is missing but the unused function is still compiled,
| as seen from this W=1 warning:
|
| kernel/bpf/core.c:2075:6: error: no previous prototype for 'bpf_patch_call_args' [-Werror=missing-prototypes]
|
| Add a matching #ifdef for the definition to leave it out.
If this makes sense now, I'll send out a v3.
Arnd
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] [v2] bpf: fix bpf_probe_read_kernel prototype mismatch
2023-05-24 3:12 ` Yonghong Song
@ 2023-05-24 13:28 ` Arnd Bergmann
2023-05-24 18:45 ` Yonghong Song
0 siblings, 1 reply; 8+ messages in thread
From: Arnd Bergmann @ 2023-05-24 13:28 UTC (permalink / raw)
To: Yonghong Song, Arnd Bergmann, Alexei Starovoitov, Daniel Borkmann,
Andrii Nakryiko, Song Liu, Steven Rostedt, Masami Hiramatsu
Cc: stable, Martin KaFai Lau, Yonghong Song, John Fastabend, KP Singh,
Stanislav Fomichev, Hao Luo, Jiri Olsa, Kumar Kartikeya Dwivedi,
Dave Marchevsky, Joanne Koong, Delyan Kratunov, Peter Zijlstra,
bpf, linux-kernel, linux-trace-kernel
On Wed, May 24, 2023, at 05:12, Yonghong Song wrote:
> On 5/23/23 12:43 PM, Arnd Bergmann wrote:
>> Aside from the warning, this addresses a bug on 32-bit architectures
>> from incorrect argument passing with the mismatched prototype.
>
> Could you explain what is this '32-bit architectures ... incorrect
> argument passing' thing?
I've expanded that paragraph now:
| Aside from the warning, this addresses a bug on 32-bit architectures
| from incorrect argument passing with the mismatched prototype:
| BPF_CALL_x() functions use 64-bit arguments that are passed in
| pairs of register or on the stack on 32-bit architectures, while the
| normal function uses one register per argument.
Let me know if you think I should put more details in there.
>> @@ -1635,11 +1636,13 @@ bool bpf_opcode_in_insntable(u8 code)
>> }
>>
>> #ifndef CONFIG_BPF_JIT_ALWAYS_ON
>> -u64 __weak bpf_probe_read_kernel(void *dst, u32 size, const void *unsafe_ptr)
>> +#ifndef CONFIG_BPF_EVENTS
>> +int bpf_probe_read_kernel_common(void * dst, u32 size, const void *unsafe_ptr)
>
> void * dst => void *dst
>
Fixed now.
Thanks,
Arnd
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] [v2] bpf: hide unused bpf_patch_call_args
2023-05-24 13:23 ` Arnd Bergmann
@ 2023-05-24 18:12 ` Yonghong Song
0 siblings, 0 replies; 8+ messages in thread
From: Yonghong Song @ 2023-05-24 18:12 UTC (permalink / raw)
To: Arnd Bergmann, Arnd Bergmann, Alexei Starovoitov, Daniel Borkmann,
Andrii Nakryiko
Cc: John Fastabend, Martin KaFai Lau, Song Liu, Yonghong Song,
KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa,
Jason A . Donenfeld, bpf, linux-kernel
On 5/24/23 6:23 AM, Arnd Bergmann wrote:
> On Wed, May 24, 2023, at 05:05, Yonghong Song wrote:
>> On 5/23/23 12:43 PM, Arnd Bergmann wrote:
>>> From: Arnd Bergmann <arnd@arndb.de>
>>>
>>> This function has no callers and no declaration when CONFIG_BPF_JIT_ALWAYS_ON
>>> is enabled:
>>>
>>> kernel/bpf/core.c:2075:6: error: no previous prototype for 'bpf_patch_call_args' [-Werror=missing-prototypes]
>>
>> If CONFIG_BPF_JIT_ALWAYS_ON is enabled, the definition of
>> bpf_patch_call_args should be invisible. Maybe I missed something.
>> Could you list *ALL& bpf related config options in your setup
>> so people can reproduce you above error messages?
>
> Sorry, my mistake. I've reworded the changelog now to fix this:
>
> | This function is only used when CONFIG_BPF_JIT_ALWAYS_ON is disabled,
> | but CONFIG_BPF_SYSCALL is enabled. When both are turned off, the
> | prototype is missing but the unused function is still compiled,
> | as seen from this W=1 warning:
> |
> | kernel/bpf/core.c:2075:6: error: no previous prototype for 'bpf_patch_call_args' [-Werror=missing-prototypes]
> |
> | Add a matching #ifdef for the definition to leave it out.
>
> If this makes sense now, I'll send out a v3.
Yes, the above new commit message sounds good to me. Thanks.
>
> Arnd
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] [v2] bpf: fix bpf_probe_read_kernel prototype mismatch
2023-05-24 13:28 ` Arnd Bergmann
@ 2023-05-24 18:45 ` Yonghong Song
0 siblings, 0 replies; 8+ messages in thread
From: Yonghong Song @ 2023-05-24 18:45 UTC (permalink / raw)
To: Arnd Bergmann, Arnd Bergmann, Alexei Starovoitov, Daniel Borkmann,
Andrii Nakryiko, Song Liu, Steven Rostedt, Masami Hiramatsu
Cc: stable, Martin KaFai Lau, Yonghong Song, John Fastabend, KP Singh,
Stanislav Fomichev, Hao Luo, Jiri Olsa, Kumar Kartikeya Dwivedi,
Dave Marchevsky, Joanne Koong, Peter Zijlstra, bpf, linux-kernel,
linux-trace-kernel
On 5/24/23 6:28 AM, Arnd Bergmann wrote:
> On Wed, May 24, 2023, at 05:12, Yonghong Song wrote:
>> On 5/23/23 12:43 PM, Arnd Bergmann wrote:
>
>>> Aside from the warning, this addresses a bug on 32-bit architectures
>>> from incorrect argument passing with the mismatched prototype.
>>
>> Could you explain what is this '32-bit architectures ... incorrect
>> argument passing' thing?
>
> I've expanded that paragraph now:
>
> | Aside from the warning, this addresses a bug on 32-bit architectures
> | from incorrect argument passing with the mismatched prototype:
> | BPF_CALL_x() functions use 64-bit arguments that are passed in
> | pairs of register or on the stack on 32-bit architectures, while the
> | normal function uses one register per argument.
>
> Let me know if you think I should put more details in there.
Please mention the function you try to address for the bug on
32-bit architecture is:
u64 __weak bpf_probe_read_kernel(void *dst, u32 size, const void
*unsafe_ptr)
which will be incompatible with
BPF_CALL_3(bpf_probe_read_kernel, void *, dst, u32, size,
const void *, unsafe_ptr)
in bpf_trace.c.
So you fixed this bug by using internal function
bpf_probe_read_kernel_common() instead.
Thanks.
>
>>> @@ -1635,11 +1636,13 @@ bool bpf_opcode_in_insntable(u8 code)
>>> }
>>>
>>> #ifndef CONFIG_BPF_JIT_ALWAYS_ON
>>> -u64 __weak bpf_probe_read_kernel(void *dst, u32 size, const void *unsafe_ptr)
>>> +#ifndef CONFIG_BPF_EVENTS
>>> +int bpf_probe_read_kernel_common(void * dst, u32 size, const void *unsafe_ptr)
>>
>> void * dst => void *dst
>>
>
> Fixed now.
>
> Thanks,
>
> Arnd
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2023-05-24 18:46 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-05-23 19:43 [PATCH 1/2] [v2] bpf: hide unused bpf_patch_call_args Arnd Bergmann
2023-05-23 19:43 ` [PATCH 2/2] [v2] bpf: fix bpf_probe_read_kernel prototype mismatch Arnd Bergmann
2023-05-24 3:12 ` Yonghong Song
2023-05-24 13:28 ` Arnd Bergmann
2023-05-24 18:45 ` Yonghong Song
2023-05-24 3:05 ` [PATCH 1/2] [v2] bpf: hide unused bpf_patch_call_args Yonghong Song
2023-05-24 13:23 ` Arnd Bergmann
2023-05-24 18:12 ` Yonghong Song
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox