Commit d79924ca authored by Hou Tao's avatar Hou Tao Committed by Alexei Starovoitov
Browse files

selftests/bpf: Use value with enough-size when updating per-cpu map



When updating per-cpu map in map_percpu_stats test, patch_map_thread()
only passes 4-bytes-sized value to bpf_map_update_elem(). The expected
size of the value is 8 * num_possible_cpus(), so fix it by passing a
value with enough-size for per-cpu map update.

Signed-off-by: default avatarHou Tao <houtao1@huawei.com>
Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20231101032455.3808547-2-houtao@huaweicloud.com


Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent cd9c1270
Loading
Loading
Loading
Loading
+18 −3
Original line number Diff line number Diff line
@@ -131,6 +131,12 @@ static bool is_lru(__u32 map_type)
	       map_type == BPF_MAP_TYPE_LRU_PERCPU_HASH;
}

static bool is_percpu(__u32 map_type)
{
	return map_type == BPF_MAP_TYPE_PERCPU_HASH ||
	       map_type == BPF_MAP_TYPE_LRU_PERCPU_HASH;
}

struct upsert_opts {
	__u32 map_type;
	int map_fd;
@@ -150,17 +156,26 @@ static int create_small_hash(void)

static void *patch_map_thread(void *arg)
{
	/* 8KB is enough for 1024 CPUs. And it is shared between N_THREADS. */
	static __u8 blob[8 << 10];
	struct upsert_opts *opts = arg;
	void *val_ptr;
	int val;
	int ret;
	int i;

	for (i = 0; i < opts->n; i++) {
		if (opts->map_type == BPF_MAP_TYPE_HASH_OF_MAPS)
		if (opts->map_type == BPF_MAP_TYPE_HASH_OF_MAPS) {
			val = create_small_hash();
		else
			val_ptr = &val;
		} else if (is_percpu(opts->map_type)) {
			val_ptr = blob;
		} else {
			val = rand();
		ret = bpf_map_update_elem(opts->map_fd, &i, &val, 0);
			val_ptr = &val;
		}

		ret = bpf_map_update_elem(opts->map_fd, &i, val_ptr, 0);
		CHECK(ret < 0, "bpf_map_update_elem", "key=%d error: %s\n", i, strerror(errno));

		if (opts->map_type == BPF_MAP_TYPE_HASH_OF_MAPS)