selftests/bpf: Use value with enough-size when updating per-cpu map
authorHou Tao <houtao1@huawei.com>
Wed, 1 Nov 2023 03:24:53 +0000 (11:24 +0800)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 10 Nov 2023 02:58:40 +0000 (18:58 -0800)
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: Hou Tao <houtao1@huawei.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20231101032455.3808547-2-houtao@huaweicloud.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/map_tests/map_percpu_stats.c

index 8bf497a..a98d6b9 100644 (file)
@@ -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)