Message ID | 20181217182554.52170-2-sdf@google.com |
---|---|
State | Changes Requested, archived |
Delegated to: | BPF Maintainers |
Headers | show |
Series | skip verifier/map tests if kernel support is missing | expand |
On 12/17/2018 07:25 PM, Stanislav Fomichev wrote: > Export bpf_map_type_supported() and bpf_prog_type_supported() which > return true/false to indicate kernel support for the appropriate > program or map type. These helpers will be used in the next commits > to selectively skip test_verifier/test_maps tests. > > bpf_map_type_supported() supports only limited set of maps for which we > do fixups in the test_verifier, for unknown maps it falls back to > 'supported'. > > Signed-off-by: Stanislav Fomichev <sdf@google.com> > --- > tools/testing/selftests/bpf/probe_helpers.c | 68 +++++++++++++++++++++ > tools/testing/selftests/bpf/probe_helpers.h | 10 +++ > 2 files changed, 78 insertions(+) > create mode 100644 tools/testing/selftests/bpf/probe_helpers.c > create mode 100644 tools/testing/selftests/bpf/probe_helpers.h > > diff --git a/tools/testing/selftests/bpf/probe_helpers.c b/tools/testing/selftests/bpf/probe_helpers.c > new file mode 100644 > index 000000000000..00467fdda813 > --- /dev/null > +++ b/tools/testing/selftests/bpf/probe_helpers.c > @@ -0,0 +1,68 @@ > +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > +#include <unistd.h> > +#include <bpf/bpf.h> > + > +#include "cgroup_helpers.h" > +#include "bpf_util.h" > +#include "../../../include/linux/filter.h" > + > +bool bpf_prog_type_supported(enum bpf_prog_type prog_type) > +{ > + struct bpf_load_program_attr attr; > + struct bpf_insn insns[] = { > + BPF_MOV64_IMM(BPF_REG_0, 0), > + BPF_EXIT_INSN(), > + }; > + int ret; > + > + if (prog_type == BPF_PROG_TYPE_UNSPEC) > + return true; > + > + memset(&attr, 0, sizeof(attr)); > + attr.prog_type = prog_type; > + attr.insns = insns; > + attr.insns_cnt = ARRAY_SIZE(insns); > + attr.license = "GPL"; > + > + ret = bpf_load_program_xattr(&attr, NULL, 0); > + if (ret < 0) > + return false; > + close(ret); > + > + return true; > +} > + > +bool bpf_map_type_supported(enum bpf_map_type map_type) > +{ > + int key_size, value_size, max_entries; > + int fd; > + > + key_size = sizeof(__u32); > + value_size = sizeof(__u32); > + max_entries = 1; > + > + /* limited set of maps for test_verifier.c and test_maps.c */ > + switch (map_type) { > + case BPF_MAP_TYPE_SOCKMAP: > + case BPF_MAP_TYPE_SOCKHASH: > + case BPF_MAP_TYPE_XSKMAP: > + break; > + case BPF_MAP_TYPE_STACK_TRACE: > + value_size = sizeof(__u64); > + case BPF_MAP_TYPE_CGROUP_STORAGE: > + case BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE: > + key_size = sizeof(struct bpf_cgroup_storage_key); > + value_size = sizeof(__u64); > + max_entries = 0; > + break; > + default: > + return true; Given bpf_map_type_supported() is mainly called in the "unexpected" failure case, it's probably okay to have this less restricted here. Also, ideally we shouldn't need an explicit opt-in for every newly added map type to probe in future. But presumably both limitation will be removed when using libbpf API. > + } > + > + fd = bpf_create_map(map_type, key_size, value_size, max_entries, 0); > + if (fd < 0) > + return false; > + close(fd); > + > + return true; > +} > diff --git a/tools/testing/selftests/bpf/probe_helpers.h b/tools/testing/selftests/bpf/probe_helpers.h > new file mode 100644 > index 000000000000..9a107d6fe936 > --- /dev/null > +++ b/tools/testing/selftests/bpf/probe_helpers.h > @@ -0,0 +1,10 @@ > +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ > +#ifndef __PROBE_HELPERS_H > +#define __PROBE_HELPERS_H > + > +#include <linux/bpf.h> > + > +bool bpf_prog_type_supported(enum bpf_prog_type prog_type); > +bool bpf_map_type_supported(enum bpf_map_type map_type); > + > +#endif >
On 12/19, Daniel Borkmann wrote: > On 12/17/2018 07:25 PM, Stanislav Fomichev wrote: > > Export bpf_map_type_supported() and bpf_prog_type_supported() which > > return true/false to indicate kernel support for the appropriate > > program or map type. These helpers will be used in the next commits > > to selectively skip test_verifier/test_maps tests. > > > > bpf_map_type_supported() supports only limited set of maps for which we > > do fixups in the test_verifier, for unknown maps it falls back to > > 'supported'. > > > > Signed-off-by: Stanislav Fomichev <sdf@google.com> > > --- > > tools/testing/selftests/bpf/probe_helpers.c | 68 +++++++++++++++++++++ > > tools/testing/selftests/bpf/probe_helpers.h | 10 +++ > > 2 files changed, 78 insertions(+) > > create mode 100644 tools/testing/selftests/bpf/probe_helpers.c > > create mode 100644 tools/testing/selftests/bpf/probe_helpers.h > > > > diff --git a/tools/testing/selftests/bpf/probe_helpers.c b/tools/testing/selftests/bpf/probe_helpers.c > > new file mode 100644 > > index 000000000000..00467fdda813 > > --- /dev/null > > +++ b/tools/testing/selftests/bpf/probe_helpers.c > > @@ -0,0 +1,68 @@ > > +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) > > +#include <unistd.h> > > +#include <bpf/bpf.h> > > + > > +#include "cgroup_helpers.h" > > +#include "bpf_util.h" > > +#include "../../../include/linux/filter.h" > > + > > +bool bpf_prog_type_supported(enum bpf_prog_type prog_type) > > +{ > > + struct bpf_load_program_attr attr; > > + struct bpf_insn insns[] = { > > + BPF_MOV64_IMM(BPF_REG_0, 0), > > + BPF_EXIT_INSN(), > > + }; > > + int ret; > > + > > + if (prog_type == BPF_PROG_TYPE_UNSPEC) > > + return true; > > + > > + memset(&attr, 0, sizeof(attr)); > > + attr.prog_type = prog_type; > > + attr.insns = insns; > > + attr.insns_cnt = ARRAY_SIZE(insns); > > + attr.license = "GPL"; > > + > > + ret = bpf_load_program_xattr(&attr, NULL, 0); > > + if (ret < 0) > > + return false; > > + close(ret); > > + > > + return true; > > +} > > + > > +bool bpf_map_type_supported(enum bpf_map_type map_type) > > +{ > > + int key_size, value_size, max_entries; > > + int fd; > > + > > + key_size = sizeof(__u32); > > + value_size = sizeof(__u32); > > + max_entries = 1; > > + > > + /* limited set of maps for test_verifier.c and test_maps.c */ > > + switch (map_type) { > > + case BPF_MAP_TYPE_SOCKMAP: > > + case BPF_MAP_TYPE_SOCKHASH: > > + case BPF_MAP_TYPE_XSKMAP: > > + break; > > + case BPF_MAP_TYPE_STACK_TRACE: > > + value_size = sizeof(__u64); > > + case BPF_MAP_TYPE_CGROUP_STORAGE: > > + case BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE: > > + key_size = sizeof(struct bpf_cgroup_storage_key); > > + value_size = sizeof(__u64); > > + max_entries = 0; > > + break; > > + default: > > + return true; > > Given bpf_map_type_supported() is mainly called in the "unexpected" failure > case, it's probably okay to have this less restricted here. Also, ideally we > shouldn't need an explicit opt-in for every newly added map type to probe in > future. But presumably both limitation will be removed when using libbpf API. Yes, both of these problems should go away when converted to libbpf API. I wanted to have something simple and tailed to a particular usecase here. > > > + } > > + > > + fd = bpf_create_map(map_type, key_size, value_size, max_entries, 0); > > + if (fd < 0) > > + return false; > > + close(fd); > > + > > + return true; > > +} > > diff --git a/tools/testing/selftests/bpf/probe_helpers.h b/tools/testing/selftests/bpf/probe_helpers.h > > new file mode 100644 > > index 000000000000..9a107d6fe936 > > --- /dev/null > > +++ b/tools/testing/selftests/bpf/probe_helpers.h > > @@ -0,0 +1,10 @@ > > +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ > > +#ifndef __PROBE_HELPERS_H > > +#define __PROBE_HELPERS_H > > + > > +#include <linux/bpf.h> > > + > > +bool bpf_prog_type_supported(enum bpf_prog_type prog_type); > > +bool bpf_map_type_supported(enum bpf_map_type map_type); > > + > > +#endif > > >
diff --git a/tools/testing/selftests/bpf/probe_helpers.c b/tools/testing/selftests/bpf/probe_helpers.c new file mode 100644 index 000000000000..00467fdda813 --- /dev/null +++ b/tools/testing/selftests/bpf/probe_helpers.c @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +#include <unistd.h> +#include <bpf/bpf.h> + +#include "cgroup_helpers.h" +#include "bpf_util.h" +#include "../../../include/linux/filter.h" + +bool bpf_prog_type_supported(enum bpf_prog_type prog_type) +{ + struct bpf_load_program_attr attr; + struct bpf_insn insns[] = { + BPF_MOV64_IMM(BPF_REG_0, 0), + BPF_EXIT_INSN(), + }; + int ret; + + if (prog_type == BPF_PROG_TYPE_UNSPEC) + return true; + + memset(&attr, 0, sizeof(attr)); + attr.prog_type = prog_type; + attr.insns = insns; + attr.insns_cnt = ARRAY_SIZE(insns); + attr.license = "GPL"; + + ret = bpf_load_program_xattr(&attr, NULL, 0); + if (ret < 0) + return false; + close(ret); + + return true; +} + +bool bpf_map_type_supported(enum bpf_map_type map_type) +{ + int key_size, value_size, max_entries; + int fd; + + key_size = sizeof(__u32); + value_size = sizeof(__u32); + max_entries = 1; + + /* limited set of maps for test_verifier.c and test_maps.c */ + switch (map_type) { + case BPF_MAP_TYPE_SOCKMAP: + case BPF_MAP_TYPE_SOCKHASH: + case BPF_MAP_TYPE_XSKMAP: + break; + case BPF_MAP_TYPE_STACK_TRACE: + value_size = sizeof(__u64); + case BPF_MAP_TYPE_CGROUP_STORAGE: + case BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE: + key_size = sizeof(struct bpf_cgroup_storage_key); + value_size = sizeof(__u64); + max_entries = 0; + break; + default: + return true; + } + + fd = bpf_create_map(map_type, key_size, value_size, max_entries, 0); + if (fd < 0) + return false; + close(fd); + + return true; +} diff --git a/tools/testing/selftests/bpf/probe_helpers.h b/tools/testing/selftests/bpf/probe_helpers.h new file mode 100644 index 000000000000..9a107d6fe936 --- /dev/null +++ b/tools/testing/selftests/bpf/probe_helpers.h @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ +#ifndef __PROBE_HELPERS_H +#define __PROBE_HELPERS_H + +#include <linux/bpf.h> + +bool bpf_prog_type_supported(enum bpf_prog_type prog_type); +bool bpf_map_type_supported(enum bpf_map_type map_type); + +#endif
Export bpf_map_type_supported() and bpf_prog_type_supported() which return true/false to indicate kernel support for the appropriate program or map type. These helpers will be used in the next commits to selectively skip test_verifier/test_maps tests. bpf_map_type_supported() supports only limited set of maps for which we do fixups in the test_verifier, for unknown maps it falls back to 'supported'. Signed-off-by: Stanislav Fomichev <sdf@google.com> --- tools/testing/selftests/bpf/probe_helpers.c | 68 +++++++++++++++++++++ tools/testing/selftests/bpf/probe_helpers.h | 10 +++ 2 files changed, 78 insertions(+) create mode 100644 tools/testing/selftests/bpf/probe_helpers.c create mode 100644 tools/testing/selftests/bpf/probe_helpers.h