The qdisc BPF selftests fail to build because qdisc-related kfuncs are used without proper declarations, and struct bpf_sk_buff_ptr is only introduced in a function prototype scope, triggering -Wvisibility and type mismatch errors under -Werror.
Fix the build by: - adding a file-scope forward declaration for struct bpf_sk_buff_ptr - declaring qdisc kfuncs (bpf_qdisc_* and bpf_skb_get_hash/bpf_kfree_skb) as __ksym in the shared header - including required BPF headers in qdisc test progs
Tested: make -C tools/testing/selftests/bpf OUTPUT=/tmp/selftests-bpf \ /tmp/selftests-bpf/bpf_qdisc_fifo.bpf.o \ /tmp/selftests-bpf/bpf_qdisc_fq.bpf.o \ /tmp/selftests-bpf/bpf_qdisc_fail__incompl_ops.bpf.o
Signed-off-by: Sun Jian sun.jian.kdev@gmail.com --- .../selftests/bpf/progs/bpf_qdisc_common.h | 17 +++++++++++++++++ .../bpf/progs/bpf_qdisc_fail__incompl_ops.c | 4 ++++ .../selftests/bpf/progs/bpf_qdisc_fifo.c | 4 ++++ .../testing/selftests/bpf/progs/bpf_qdisc_fq.c | 1 + 4 files changed, 26 insertions(+)
diff --git a/tools/testing/selftests/bpf/progs/bpf_qdisc_common.h b/tools/testing/selftests/bpf/progs/bpf_qdisc_common.h index 3754f581b328..bed2294c35f9 100644 --- a/tools/testing/selftests/bpf/progs/bpf_qdisc_common.h +++ b/tools/testing/selftests/bpf/progs/bpf_qdisc_common.h @@ -3,6 +3,9 @@ #ifndef _BPF_QDISC_COMMON_H #define _BPF_QDISC_COMMON_H
+#include <vmlinux.h> +#include <bpf/bpf_helpers.h> + #define NET_XMIT_SUCCESS 0x00 #define NET_XMIT_DROP 0x01 /* skb dropped */ #define NET_XMIT_CN 0x02 /* congestion notification */ @@ -14,6 +17,20 @@
struct bpf_sk_buff_ptr;
+/* kfunc declarations provided via vmlinux BTF */ +extern void bpf_qdisc_skb_drop(struct sk_buff *skb, + struct bpf_sk_buff_ptr *to_free) __ksym; + +extern void bpf_qdisc_bstats_update(struct Qdisc *sch, + const struct sk_buff *skb) __ksym; + +extern void bpf_qdisc_watchdog_schedule(struct Qdisc *sch, + u64 expire, u64 delta_ns) __ksym; + +extern __u32 bpf_skb_get_hash(struct sk_buff *skb) __ksym; + +extern void bpf_kfree_skb(struct sk_buff *skb) __ksym; + static struct qdisc_skb_cb *qdisc_skb_cb(const struct sk_buff *skb) { return (struct qdisc_skb_cb *)skb->cb; diff --git a/tools/testing/selftests/bpf/progs/bpf_qdisc_fail__incompl_ops.c b/tools/testing/selftests/bpf/progs/bpf_qdisc_fail__incompl_ops.c index f188062ed730..8f9b2d2cb9a1 100644 --- a/tools/testing/selftests/bpf/progs/bpf_qdisc_fail__incompl_ops.c +++ b/tools/testing/selftests/bpf/progs/bpf_qdisc_fail__incompl_ops.c @@ -1,6 +1,10 @@ // SPDX-License-Identifier: GPL-2.0
#include <vmlinux.h> + +#include <bpf/bpf_helpers.h> +#include <bpf/bpf_tracing.h> + #include "bpf_experimental.h" #include "bpf_qdisc_common.h"
diff --git a/tools/testing/selftests/bpf/progs/bpf_qdisc_fifo.c b/tools/testing/selftests/bpf/progs/bpf_qdisc_fifo.c index 1de2be3e370b..524d3ae2c9a1 100644 --- a/tools/testing/selftests/bpf/progs/bpf_qdisc_fifo.c +++ b/tools/testing/selftests/bpf/progs/bpf_qdisc_fifo.c @@ -1,6 +1,10 @@ // SPDX-License-Identifier: GPL-2.0
#include <vmlinux.h> + +#include <bpf/bpf_helpers.h> +#include <bpf/bpf_tracing.h> + #include "bpf_experimental.h" #include "bpf_qdisc_common.h"
diff --git a/tools/testing/selftests/bpf/progs/bpf_qdisc_fq.c b/tools/testing/selftests/bpf/progs/bpf_qdisc_fq.c index 1a3233a275c7..dd47820fa230 100644 --- a/tools/testing/selftests/bpf/progs/bpf_qdisc_fq.c +++ b/tools/testing/selftests/bpf/progs/bpf_qdisc_fq.c @@ -35,6 +35,7 @@ #include <vmlinux.h> #include <errno.h> #include <bpf/bpf_helpers.h> +#include <bpf/bpf_tracing.h> #include "bpf_experimental.h" #include "bpf_qdisc_common.h"
linux-kselftest-mirror@lists.linaro.org