[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20181218233520.GE20955@mini-arch.hsd1.ca.comcast.net>
Date: Tue, 18 Dec 2018 15:35:20 -0800
From: Stanislav Fomichev <sdf@...ichev.me>
To: Daniel Borkmann <daniel@...earbox.net>
Cc: Stanislav Fomichev <sdf@...gle.com>, netdev@...r.kernel.org,
ast@...nel.org, davem@...emloft.net, ecree@...arflare.com,
quentin.monnet@...ronome.com
Subject: Re: [PATCH bpf-next v2 1/6] selftests/bpf: add map/prog type probe
helpers
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@...gle.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
> >
>
Powered by blists - more mailing lists