From mboxrd@z Thu Jan 1 00:00:00 1970 From: Stanislav Fomichev Subject: [PATCH bpf-next v2 1/6] selftests/bpf: add map/prog type probe helpers Date: Mon, 17 Dec 2018 10:25:49 -0800 Message-ID: <20181217182554.52170-2-sdf@google.com> References: <20181217182554.52170-1-sdf@google.com> Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Cc: davem@davemloft.net, daniel@iogearbox.net, ecree@solarflare.com, quentin.monnet@netronome.com, Stanislav Fomichev To: netdev@vger.kernel.org, ast@kernel.org Return-path: Received: from mail-yb1-f202.google.com ([209.85.219.202]:54889 "EHLO mail-yb1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388930AbeLQS0V (ORCPT ); Mon, 17 Dec 2018 13:26:21 -0500 Received: by mail-yb1-f202.google.com with SMTP id a18so8087782ybg.21 for ; Mon, 17 Dec 2018 10:26:21 -0800 (PST) In-Reply-To: <20181217182554.52170-1-sdf@google.com> Sender: netdev-owner@vger.kernel.org List-ID: 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 --- 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 +#include + +#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 + +bool bpf_prog_type_supported(enum bpf_prog_type prog_type); +bool bpf_map_type_supported(enum bpf_map_type map_type); + +#endif -- 2.20.0.405.gbc1bbc6f85-goog