diff mbox series

[5.10,138/563] bpf: Remove config check to enable bpf support for branch records

Message ID 20220124184029.173197383@linuxfoundation.org
State New
Headers show
Series None | expand

Commit Message

Greg KH Jan. 24, 2022, 6:38 p.m. UTC
From: Kajol Jain <kjain@linux.ibm.com>

[ Upstream commit db52f57211b4e45f0ebb274e2c877b211dc18591 ]

Branch data available to BPF programs can be very useful to get stack traces
out of userspace application.

Commit fff7b64355ea ("bpf: Add bpf_read_branch_records() helper") added BPF
support to capture branch records in x86. Enable this feature also for other
architectures as well by removing checks specific to x86.

If an architecture doesn't support branch records, bpf_read_branch_records()
still has appropriate checks and it will return an -EINVAL in that scenario.
Based on UAPI helper doc in include/uapi/linux/bpf.h, unsupported architectures
should return -ENOENT in such case. Hence, update the appropriate check to
return -ENOENT instead.

Selftest 'perf_branches' result on power9 machine which has the branch stacks
support:

 - Before this patch:

  [command]# ./test_progs -t perf_branches
   #88/1 perf_branches/perf_branches_hw:FAIL
   #88/2 perf_branches/perf_branches_no_hw:OK
   #88 perf_branches:FAIL
  Summary: 0/1 PASSED, 0 SKIPPED, 1 FAILED

 - After this patch:

  [command]# ./test_progs -t perf_branches
   #88/1 perf_branches/perf_branches_hw:OK
   #88/2 perf_branches/perf_branches_no_hw:OK
   #88 perf_branches:OK
  Summary: 1/2 PASSED, 0 SKIPPED, 0 FAILED

Selftest 'perf_branches' result on power9 machine which doesn't have branch
stack report:

 - After this patch:

  [command]# ./test_progs -t perf_branches
   #88/1 perf_branches/perf_branches_hw:SKIP
   #88/2 perf_branches/perf_branches_no_hw:OK
   #88 perf_branches:OK
  Summary: 1/1 PASSED, 1 SKIPPED, 0 FAILED

Fixes: fff7b64355eac ("bpf: Add bpf_read_branch_records() helper")
Suggested-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Kajol Jain <kjain@linux.ibm.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20211206073315.77432-1-kjain@linux.ibm.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 kernel/trace/bpf_trace.c | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

Comments

Pavel Machek Jan. 25, 2022, 7:27 p.m. UTC | #1
Hi!

> Branch data available to BPF programs can be very useful to get stack traces
> out of userspace application.
> 
> Commit fff7b64355ea ("bpf: Add bpf_read_branch_records() helper") added BPF
> support to capture branch records in x86. Enable this feature also for other
> architectures as well by removing checks specific to x86.
> 
> If an architecture doesn't support branch records, bpf_read_branch_records()
> still has appropriate checks and it will return an -EINVAL in that scenario.
> Based on UAPI helper doc in include/uapi/linux/bpf.h, unsupported architectures
> should return -ENOENT in such case. Hence, update the appropriate check to
> return -ENOENT instead.
> 
> Selftest 'perf_branches' result on power9 machine which has the branch stacks
> support:
> 
>  - Before this patch:
> 
>   [command]# ./test_progs -t perf_branches
>    #88/1 perf_branches/perf_branches_hw:FAIL
>    #88/2 perf_branches/perf_branches_no_hw:OK
>    #88 perf_branches:FAIL
>   Summary: 0/1 PASSED, 0 SKIPPED, 1 FAILED
> 
>  - After this patch:
> 
>   [command]# ./test_progs -t perf_branches
>    #88/1 perf_branches/perf_branches_hw:OK
>    #88/2 perf_branches/perf_branches_no_hw:OK
>    #88 perf_branches:OK
>   Summary: 1/2 PASSED, 0 SKIPPED, 0 FAILED
> 
> Selftest 'perf_branches' result on power9 machine which doesn't have branch
> stack report:
> 
>  - After this patch:
> 
>   [command]# ./test_progs -t perf_branches
>    #88/1 perf_branches/perf_branches_hw:SKIP
>    #88/2 perf_branches/perf_branches_no_hw:OK
>    #88 perf_branches:OK
>   Summary: 1/1 PASSED, 1 SKIPPED, 0 FAILED

This makes me nervous, it is not really a bugfix and probably noone
tested it on the stable branch. It would be safer to keep it disabled.

Best regards,
								Pavel
diff mbox series

Patch

diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
index ba644760f5076..a9e074769881f 100644
--- a/kernel/trace/bpf_trace.c
+++ b/kernel/trace/bpf_trace.c
@@ -1517,9 +1517,6 @@  static const struct bpf_func_proto bpf_perf_prog_read_value_proto = {
 BPF_CALL_4(bpf_read_branch_records, struct bpf_perf_event_data_kern *, ctx,
 	   void *, buf, u32, size, u64, flags)
 {
-#ifndef CONFIG_X86
-	return -ENOENT;
-#else
 	static const u32 br_entry_size = sizeof(struct perf_branch_entry);
 	struct perf_branch_stack *br_stack = ctx->data->br_stack;
 	u32 to_copy;
@@ -1528,7 +1525,7 @@  BPF_CALL_4(bpf_read_branch_records, struct bpf_perf_event_data_kern *, ctx,
 		return -EINVAL;
 
 	if (unlikely(!br_stack))
-		return -EINVAL;
+		return -ENOENT;
 
 	if (flags & BPF_F_GET_BRANCH_RECORDS_SIZE)
 		return br_stack->nr * br_entry_size;
@@ -1540,7 +1537,6 @@  BPF_CALL_4(bpf_read_branch_records, struct bpf_perf_event_data_kern *, ctx,
 	memcpy(buf, br_stack->entries, to_copy);
 
 	return to_copy;
-#endif
 }
 
 static const struct bpf_func_proto bpf_read_branch_records_proto = {