mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

GCC errors when compiling tailcall_bpf2bpf_hierarchy2.c and tailcall_bpf2bpf_hierarchy3.c with the following error: progs/tailcall_bpf2bpf_hierarchy2.c: In function 'tailcall_bpf2bpf_hierarchy_2': progs/tailcall_bpf2bpf_hierarchy2.c:66:9: error: input operand constraint contains '+' 66 | asm volatile (""::"r+"(ret)); | ^~~ Changed implementation to make use of __sink macro that abstracts the desired behaviour. The proposed change seems valid for both GCC and CLANG. Signed-off-by: Cupertino Miranda <cupertino.miranda@oracle.com> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/bpf/20240819151129.1366484-4-cupertino.miranda@oracle.com
62 lines
1.1 KiB
C
62 lines
1.1 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
#include <linux/bpf.h>
|
|
#include <bpf/bpf_helpers.h>
|
|
#include "bpf_misc.h"
|
|
|
|
int classifier_0(struct __sk_buff *skb);
|
|
|
|
struct {
|
|
__uint(type, BPF_MAP_TYPE_PROG_ARRAY);
|
|
__uint(max_entries, 1);
|
|
__uint(key_size, sizeof(__u32));
|
|
__array(values, void (void));
|
|
} jmp_table0 SEC(".maps") = {
|
|
.values = {
|
|
[0] = (void *) &classifier_0,
|
|
},
|
|
};
|
|
|
|
struct {
|
|
__uint(type, BPF_MAP_TYPE_PROG_ARRAY);
|
|
__uint(max_entries, 1);
|
|
__uint(key_size, sizeof(__u32));
|
|
__array(values, void (void));
|
|
} jmp_table1 SEC(".maps") = {
|
|
.values = {
|
|
[0] = (void *) &classifier_0,
|
|
},
|
|
};
|
|
|
|
int count = 0;
|
|
|
|
static __noinline
|
|
int subprog_tail(struct __sk_buff *skb, void *jmp_table)
|
|
{
|
|
bpf_tail_call_static(skb, jmp_table, 0);
|
|
return 0;
|
|
}
|
|
|
|
__auxiliary
|
|
SEC("tc")
|
|
int classifier_0(struct __sk_buff *skb)
|
|
{
|
|
count++;
|
|
subprog_tail(skb, &jmp_table0);
|
|
subprog_tail(skb, &jmp_table1);
|
|
return count;
|
|
}
|
|
|
|
__success
|
|
__retval(33)
|
|
SEC("tc")
|
|
int tailcall_bpf2bpf_hierarchy_3(struct __sk_buff *skb)
|
|
{
|
|
int ret = 0;
|
|
|
|
bpf_tail_call_static(skb, &jmp_table0, 0);
|
|
|
|
__sink(ret);
|
|
return ret;
|
|
}
|
|
|
|
char __license[] SEC("license") = "GPL";
|