forked from Minki/linux
bpftool: Refactor misc. feature probe
There is currently a single miscellaneous feature probe, HAVE_LARGE_INSN_LIMIT, to check for the 1M instructions limit in the verifier. Subsequent patches will add additional miscellaneous probes, which follow the same pattern at the existing probe. This patch therefore refactors the probe to avoid code duplication in subsequent patches. The BPF program type and the checked error numbers in the HAVE_LARGE_INSN_LIMIT probe are changed to better generalize to other probes. The feature probe retains its current behavior despite those changes. Signed-off-by: Paul Chaignon <paul@isovalent.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Reviewed-by: Quentin Monnet <quentin@isovalent.com> Link: https://lore.kernel.org/bpf/956c9329a932c75941194f91790d01f31dfbe01b.1641314075.git.paul@isovalent.com
This commit is contained in:
parent
c5bcdd8228
commit
b22bf1b997
@ -642,6 +642,30 @@ probe_helpers_for_progtype(enum bpf_prog_type prog_type, bool supported_type,
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
static void
|
||||
probe_misc_feature(struct bpf_insn *insns, size_t len,
|
||||
const char *define_prefix, __u32 ifindex,
|
||||
const char *feat_name, const char *plain_name,
|
||||
const char *define_name)
|
||||
{
|
||||
LIBBPF_OPTS(bpf_prog_load_opts, opts,
|
||||
.prog_ifindex = ifindex,
|
||||
);
|
||||
bool res;
|
||||
int fd;
|
||||
|
||||
errno = 0;
|
||||
fd = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, NULL, "GPL",
|
||||
insns, len, &opts);
|
||||
res = fd >= 0 || !errno;
|
||||
|
||||
if (fd >= 0)
|
||||
close(fd);
|
||||
|
||||
print_bool_feature(feat_name, plain_name, define_name, res,
|
||||
define_prefix);
|
||||
}
|
||||
|
||||
/*
|
||||
* Probe for availability of kernel commit (5.3):
|
||||
*
|
||||
@ -649,29 +673,18 @@ probe_helpers_for_progtype(enum bpf_prog_type prog_type, bool supported_type,
|
||||
*/
|
||||
static void probe_large_insn_limit(const char *define_prefix, __u32 ifindex)
|
||||
{
|
||||
LIBBPF_OPTS(bpf_prog_load_opts, opts,
|
||||
.prog_ifindex = ifindex,
|
||||
);
|
||||
struct bpf_insn insns[BPF_MAXINSNS + 1];
|
||||
bool res;
|
||||
int i, fd;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < BPF_MAXINSNS; i++)
|
||||
insns[i] = BPF_MOV64_IMM(BPF_REG_0, 1);
|
||||
insns[BPF_MAXINSNS] = BPF_EXIT_INSN();
|
||||
|
||||
errno = 0;
|
||||
fd = bpf_prog_load(BPF_PROG_TYPE_SCHED_CLS, NULL, "GPL",
|
||||
insns, ARRAY_SIZE(insns), &opts);
|
||||
res = fd >= 0 || (errno != E2BIG && errno != EINVAL);
|
||||
|
||||
if (fd >= 0)
|
||||
close(fd);
|
||||
|
||||
print_bool_feature("have_large_insn_limit",
|
||||
probe_misc_feature(insns, ARRAY_SIZE(insns),
|
||||
define_prefix, ifindex,
|
||||
"have_large_insn_limit",
|
||||
"Large program size limit",
|
||||
"LARGE_INSN_LIMIT",
|
||||
res, define_prefix);
|
||||
"LARGE_INSN_LIMIT");
|
||||
}
|
||||
|
||||
static void
|
||||
|
Loading…
Reference in New Issue
Block a user