mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 17:47:41 +02:00
selftests/bpf: Add tests to verify map create failure log
Add tests to verify that the kernel reports the expected error messages and correct log_true_size when map creation fails. Signed-off-by: Leon Hwang <leon.hwang@linux.dev> Link: https://lore.kernel.org/r/20260512153157.28382-9-leon.hwang@linux.dev Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
702259006f
commit
f675483cac
|
|
@ -212,3 +212,169 @@ void test_map_init(void)
|
|||
if (test__start_subtest("pcpu_lru_map_init"))
|
||||
test_pcpu_lru_map_init();
|
||||
}
|
||||
|
||||
static void test_map_create(enum bpf_map_type map_type, const char *map_name,
|
||||
struct bpf_map_create_opts *opts, const char *exp_msg)
|
||||
{
|
||||
const int key_size = 4, value_size = 4, max_entries = 1;
|
||||
char log_buf[128];
|
||||
int fd;
|
||||
LIBBPF_OPTS(bpf_log_opts, log_opts);
|
||||
|
||||
log_buf[0] = '\0';
|
||||
log_opts.buf = log_buf;
|
||||
log_opts.size = sizeof(log_buf);
|
||||
log_opts.level = 1;
|
||||
opts->log_opts = &log_opts;
|
||||
fd = bpf_map_create(map_type, map_name, key_size, value_size, max_entries, opts);
|
||||
if (!ASSERT_LT(fd, 0, "bpf_map_create")) {
|
||||
close(fd);
|
||||
return;
|
||||
}
|
||||
|
||||
ASSERT_STREQ(log_buf, exp_msg, "log_buf");
|
||||
ASSERT_EQ(log_opts.true_size, strlen(exp_msg) + 1, "true_size");
|
||||
}
|
||||
|
||||
static void test_map_create_array(struct bpf_map_create_opts *opts, const char *exp_msg)
|
||||
{
|
||||
test_map_create(BPF_MAP_TYPE_ARRAY, "test_map_create", opts, exp_msg);
|
||||
}
|
||||
|
||||
static void test_invalid_vmlinux_value_type_id_struct_ops(void)
|
||||
{
|
||||
const char *msg = "btf_vmlinux_value_type_id can only be used with struct_ops maps.\n";
|
||||
LIBBPF_OPTS(bpf_map_create_opts, opts,
|
||||
.btf_vmlinux_value_type_id = 1,
|
||||
);
|
||||
|
||||
test_map_create_array(&opts, msg);
|
||||
}
|
||||
|
||||
static void test_invalid_vmlinux_value_type_id_kv_type_id(void)
|
||||
{
|
||||
const char *msg = "btf_vmlinux_value_type_id is mutually exclusive with btf_key_type_id and btf_value_type_id.\n";
|
||||
LIBBPF_OPTS(bpf_map_create_opts, opts,
|
||||
.btf_vmlinux_value_type_id = 1,
|
||||
.btf_key_type_id = 1,
|
||||
);
|
||||
|
||||
test_map_create(BPF_MAP_TYPE_STRUCT_OPS, "test_map_create", &opts, msg);
|
||||
}
|
||||
|
||||
static void test_invalid_value_type_id(void)
|
||||
{
|
||||
const char *msg = "Invalid btf_value_type_id.\n";
|
||||
LIBBPF_OPTS(bpf_map_create_opts, opts,
|
||||
.btf_key_type_id = 1,
|
||||
);
|
||||
|
||||
test_map_create_array(&opts, msg);
|
||||
}
|
||||
|
||||
static void test_invalid_map_extra(void)
|
||||
{
|
||||
const char *msg = "Invalid map_extra.\n";
|
||||
LIBBPF_OPTS(bpf_map_create_opts, opts,
|
||||
.map_extra = 1,
|
||||
);
|
||||
|
||||
test_map_create_array(&opts, msg);
|
||||
}
|
||||
|
||||
static void test_invalid_numa_node(void)
|
||||
{
|
||||
const char *msg = "Invalid numa_node.\n";
|
||||
LIBBPF_OPTS(bpf_map_create_opts, opts,
|
||||
.map_flags = BPF_F_NUMA_NODE,
|
||||
.numa_node = 0xFF,
|
||||
);
|
||||
|
||||
test_map_create_array(&opts, msg);
|
||||
}
|
||||
|
||||
static void test_invalid_map_type(void)
|
||||
{
|
||||
const char *msg = "Invalid map_type.\n";
|
||||
LIBBPF_OPTS(bpf_map_create_opts, opts);
|
||||
|
||||
test_map_create(__MAX_BPF_MAP_TYPE, "test_map_create", &opts, msg);
|
||||
}
|
||||
|
||||
static void test_invalid_token_fd(void)
|
||||
{
|
||||
const char *msg = "Invalid map_token_fd.\n";
|
||||
LIBBPF_OPTS(bpf_map_create_opts, opts,
|
||||
.map_flags = BPF_F_TOKEN_FD,
|
||||
.token_fd = 0xFF,
|
||||
);
|
||||
|
||||
test_map_create_array(&opts, msg);
|
||||
}
|
||||
|
||||
static void test_invalid_map_name(void)
|
||||
{
|
||||
const char *msg = "Invalid map_name.\n";
|
||||
LIBBPF_OPTS(bpf_map_create_opts, opts);
|
||||
|
||||
test_map_create(BPF_MAP_TYPE_ARRAY, "test-!@#", &opts, msg);
|
||||
}
|
||||
|
||||
static void test_invalid_btf_fd(void)
|
||||
{
|
||||
const char *msg = "Invalid btf_fd.\n";
|
||||
LIBBPF_OPTS(bpf_map_create_opts, opts,
|
||||
.btf_fd = -1,
|
||||
.btf_key_type_id = 1,
|
||||
.btf_value_type_id = 1,
|
||||
);
|
||||
|
||||
test_map_create_array(&opts, msg);
|
||||
}
|
||||
|
||||
static void test_excl_prog_hash_size_1(void)
|
||||
{
|
||||
const char *msg = "Invalid excl_prog_hash_size.\n";
|
||||
const char *hash = "DEADCODE";
|
||||
LIBBPF_OPTS(bpf_map_create_opts, opts,
|
||||
.excl_prog_hash = hash,
|
||||
);
|
||||
|
||||
test_map_create_array(&opts, msg);
|
||||
}
|
||||
|
||||
static void test_excl_prog_hash_size_2(void)
|
||||
{
|
||||
const char *msg = "Invalid excl_prog_hash_size.\n";
|
||||
LIBBPF_OPTS(bpf_map_create_opts, opts,
|
||||
.excl_prog_hash_size = 1,
|
||||
);
|
||||
|
||||
test_map_create_array(&opts, msg);
|
||||
}
|
||||
|
||||
void test_map_create_failure(void)
|
||||
{
|
||||
if (test__start_subtest("invalid_vmlinux_value_type_id_struct_ops"))
|
||||
test_invalid_vmlinux_value_type_id_struct_ops();
|
||||
if (test__start_subtest("invalid_vmlinux_value_type_id_kv_type_id"))
|
||||
test_invalid_vmlinux_value_type_id_kv_type_id();
|
||||
if (test__start_subtest("invalid_value_type_id"))
|
||||
test_invalid_value_type_id();
|
||||
if (test__start_subtest("invalid_map_extra"))
|
||||
test_invalid_map_extra();
|
||||
if (test__start_subtest("invalid_numa_node"))
|
||||
test_invalid_numa_node();
|
||||
if (test__start_subtest("invalid_map_type"))
|
||||
test_invalid_map_type();
|
||||
if (test__start_subtest("invalid_token_fd"))
|
||||
test_invalid_token_fd();
|
||||
if (test__start_subtest("invalid_map_name"))
|
||||
test_invalid_map_name();
|
||||
if (test__start_subtest("invalid_btf_fd"))
|
||||
test_invalid_btf_fd();
|
||||
if (test__start_subtest("invalid_excl_prog_hash_size_1"))
|
||||
test_excl_prog_hash_size_1();
|
||||
if (test__start_subtest("invalid_excl_prog_hash_size_2"))
|
||||
test_excl_prog_hash_size_2();
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user