Message ID | 788b0e49bd5dfc292b71a57f21cbf010821a0aca.1597915265.git.zhuyifei@google.com |
---|---|
State | Changes Requested |
Delegated to: | BPF Maintainers |
Headers | show |
Series | Allow storage of flexible metadata information for eBPF programs | expand |
On 8/20/20 2:42 AM, YiFei Zhu wrote: > From: YiFei Zhu <zhuyifei@google.com> > > This is a simple test to check that loading and dumping metadata > works, whether or not metadata contents are used by the program. > > Signed-off-by: YiFei Zhu <zhuyifei@google.com> > --- > tools/testing/selftests/bpf/Makefile | 3 +- > .../selftests/bpf/progs/metadata_unused.c | 15 ++++ > .../selftests/bpf/progs/metadata_used.c | 15 ++++ > .../selftests/bpf/test_bpftool_metadata.sh | 82 +++++++++++++++++++ > 4 files changed, 114 insertions(+), 1 deletion(-) > create mode 100644 tools/testing/selftests/bpf/progs/metadata_unused.c > create mode 100644 tools/testing/selftests/bpf/progs/metadata_used.c > create mode 100755 tools/testing/selftests/bpf/test_bpftool_metadata.sh > > diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile > index a83b5827532f..04e56c6843c6 100644 > --- a/tools/testing/selftests/bpf/Makefile > +++ b/tools/testing/selftests/bpf/Makefile > @@ -68,7 +68,8 @@ TEST_PROGS := test_kmod.sh \ > test_tc_edt.sh \ > test_xdping.sh \ > test_bpftool_build.sh \ > - test_bpftool.sh > + test_bpftool.sh \ > + test_bpftool_metadata.sh \ This is mostly testing bpftool side. We should add testing to test_progs too as it is what most developer runs. If you add skeleton support for metadata, similar to bss, it will both make user interface easy and make testing easy. > > TEST_PROGS_EXTENDED := with_addr.sh \ > with_tunnels.sh \ > diff --git a/tools/testing/selftests/bpf/progs/metadata_unused.c b/tools/testing/selftests/bpf/progs/metadata_unused.c > new file mode 100644 > index 000000000000..523b3c332426 > --- /dev/null > +++ b/tools/testing/selftests/bpf/progs/metadata_unused.c > @@ -0,0 +1,15 @@ > +// SPDX-License-Identifier: GPL-2.0-only > + > +#include <linux/bpf.h> > +#include <bpf/bpf_helpers.h> > + > +char metadata_a[] SEC(".metadata") = "foo"; > +int metadata_b SEC(".metadata") = 1; > + > +SEC("cgroup_skb/egress") > +int prog(struct xdp_md *ctx) > +{ > + return 0; > +} > + > +char _license[] SEC("license") = "GPL"; [...]
On Thu, Aug 20, 2020 at 3:03 PM Yonghong Song <yhs@fb.com> wrote: > > > > On 8/20/20 2:42 AM, YiFei Zhu wrote: > > From: YiFei Zhu <zhuyifei@google.com> > > > > This is a simple test to check that loading and dumping metadata > > works, whether or not metadata contents are used by the program. > > > > Signed-off-by: YiFei Zhu <zhuyifei@google.com> > > --- > > tools/testing/selftests/bpf/Makefile | 3 +- > > .../selftests/bpf/progs/metadata_unused.c | 15 ++++ > > .../selftests/bpf/progs/metadata_used.c | 15 ++++ > > .../selftests/bpf/test_bpftool_metadata.sh | 82 +++++++++++++++++++ > > 4 files changed, 114 insertions(+), 1 deletion(-) > > create mode 100644 tools/testing/selftests/bpf/progs/metadata_unused.c > > create mode 100644 tools/testing/selftests/bpf/progs/metadata_used.c > > create mode 100755 tools/testing/selftests/bpf/test_bpftool_metadata.sh > > > > diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile > > index a83b5827532f..04e56c6843c6 100644 > > --- a/tools/testing/selftests/bpf/Makefile > > +++ b/tools/testing/selftests/bpf/Makefile > > @@ -68,7 +68,8 @@ TEST_PROGS := test_kmod.sh \ > > test_tc_edt.sh \ > > test_xdping.sh \ > > test_bpftool_build.sh \ > > - test_bpftool.sh > > + test_bpftool.sh \ > > + test_bpftool_metadata.sh \ > > This is mostly testing bpftool side. > We should add testing to test_progs too as it is what most developer > runs. If you add skeleton support for metadata, similar to bss, it will > both make user interface easy and make testing easy. > I concur. It also seems that program code can use metadata variables just like .rodata variables (e.g., for debug logging, etc), so we need to add tests exercising that ability as well. > > > > TEST_PROGS_EXTENDED := with_addr.sh \ > > with_tunnels.sh \ > > diff --git a/tools/testing/selftests/bpf/progs/metadata_unused.c b/tools/testing/selftests/bpf/progs/metadata_unused.c > > new file mode 100644 > > index 000000000000..523b3c332426 > > --- /dev/null > > +++ b/tools/testing/selftests/bpf/progs/metadata_unused.c > > @@ -0,0 +1,15 @@ > > +// SPDX-License-Identifier: GPL-2.0-only > > + > > +#include <linux/bpf.h> > > +#include <bpf/bpf_helpers.h> > > + > > +char metadata_a[] SEC(".metadata") = "foo"; > > +int metadata_b SEC(".metadata") = 1; > > + > > +SEC("cgroup_skb/egress") > > +int prog(struct xdp_md *ctx) > > +{ > > + return 0; > > +} > > + > > +char _license[] SEC("license") = "GPL"; > [...]
diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile index a83b5827532f..04e56c6843c6 100644 --- a/tools/testing/selftests/bpf/Makefile +++ b/tools/testing/selftests/bpf/Makefile @@ -68,7 +68,8 @@ TEST_PROGS := test_kmod.sh \ test_tc_edt.sh \ test_xdping.sh \ test_bpftool_build.sh \ - test_bpftool.sh + test_bpftool.sh \ + test_bpftool_metadata.sh \ TEST_PROGS_EXTENDED := with_addr.sh \ with_tunnels.sh \ diff --git a/tools/testing/selftests/bpf/progs/metadata_unused.c b/tools/testing/selftests/bpf/progs/metadata_unused.c new file mode 100644 index 000000000000..523b3c332426 --- /dev/null +++ b/tools/testing/selftests/bpf/progs/metadata_unused.c @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#include <linux/bpf.h> +#include <bpf/bpf_helpers.h> + +char metadata_a[] SEC(".metadata") = "foo"; +int metadata_b SEC(".metadata") = 1; + +SEC("cgroup_skb/egress") +int prog(struct xdp_md *ctx) +{ + return 0; +} + +char _license[] SEC("license") = "GPL"; diff --git a/tools/testing/selftests/bpf/progs/metadata_used.c b/tools/testing/selftests/bpf/progs/metadata_used.c new file mode 100644 index 000000000000..59785404f7bb --- /dev/null +++ b/tools/testing/selftests/bpf/progs/metadata_used.c @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#include <linux/bpf.h> +#include <bpf/bpf_helpers.h> + +char metadata_a[] SEC(".metadata") = "bar"; +int metadata_b SEC(".metadata") = 2; + +SEC("cgroup_skb/egress") +int prog(struct xdp_md *ctx) +{ + return metadata_b ? 1 : 0; +} + +char _license[] SEC("license") = "GPL"; diff --git a/tools/testing/selftests/bpf/test_bpftool_metadata.sh b/tools/testing/selftests/bpf/test_bpftool_metadata.sh new file mode 100755 index 000000000000..a7515c09dc2d --- /dev/null +++ b/tools/testing/selftests/bpf/test_bpftool_metadata.sh @@ -0,0 +1,82 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 + +# Kselftest framework requirement - SKIP code is 4. +ksft_skip=4 + +TESTNAME=bpftool_metadata +BPF_FS=$(awk '$3 == "bpf" {print $2; exit}' /proc/mounts) +BPF_DIR=$BPF_FS/test_$TESTNAME + +_cleanup() +{ + set +e + rm -rf $BPF_DIR 2> /dev/null +} + +cleanup_skip() +{ + echo "selftests: $TESTNAME [SKIP]" + _cleanup + + exit $ksft_skip +} + +cleanup() +{ + if [ "$?" = 0 ]; then + echo "selftests: $TESTNAME [PASS]" + else + echo "selftests: $TESTNAME [FAILED]" + fi + _cleanup +} + +if [ $(id -u) -ne 0 ]; then + echo "selftests: $TESTNAME [SKIP] Need root privileges" + exit $ksft_skip +fi + +if [ -z "$BPF_FS" ]; then + echo "selftests: $TESTNAME [SKIP] Could not run test without bpffs mounted" + exit $ksft_skip +fi + +if ! bpftool version > /dev/null 2>&1; then + echo "selftests: $TESTNAME [SKIP] Could not run test without bpftool" + exit $ksft_skip +fi + +set -e + +trap cleanup_skip EXIT + +mkdir $BPF_DIR + +trap cleanup EXIT + +bpftool prog load metadata_unused.o $BPF_DIR/unused + +METADATA_PLAIN="$(bpftool prog --metadata)" +echo "$METADATA_PLAIN" | grep 'metadata_a = "foo"' > /dev/null +echo "$METADATA_PLAIN" | grep 'metadata_b = 1' > /dev/null + +bpftool prog --metadata --json | grep '"metadata":{"metadata_a":"foo","metadata_b":1}' > /dev/null + +bpftool map | grep 'metada.metadata' > /dev/null + +rm $BPF_DIR/unused + +bpftool prog load metadata_used.o $BPF_DIR/used + +METADATA_PLAIN="$(bpftool prog --metadata)" +echo "$METADATA_PLAIN" | grep 'metadata_a = "bar"' > /dev/null +echo "$METADATA_PLAIN" | grep 'metadata_b = 2' > /dev/null + +bpftool prog --metadata --json | grep '"metadata":{"metadata_a":"bar","metadata_b":2}' > /dev/null + +bpftool map | grep 'metada.metadata' > /dev/null + +rm $BPF_DIR/used + +exit 0