Loading samples/bpf/test_maps.c +92 −0 Original line number Diff line number Diff line Loading @@ -236,6 +236,94 @@ static void test_arraymap_sanity(int i, void *data) close(map_fd); } static void test_percpu_arraymap_many_keys(void) { unsigned nr_cpus = sysconf(_SC_NPROCESSORS_CONF); unsigned nr_keys = 20000; long values[nr_cpus]; int key, map_fd, i; map_fd = bpf_create_map(BPF_MAP_TYPE_PERCPU_ARRAY, sizeof(key), sizeof(values[0]), nr_keys); if (map_fd < 0) { printf("failed to create per-cpu arraymap '%s'\n", strerror(errno)); exit(1); } for (i = 0; i < nr_cpus; i++) values[i] = i + 10; for (key = 0; key < nr_keys; key++) assert(bpf_update_elem(map_fd, &key, values, BPF_ANY) == 0); for (key = 0; key < nr_keys; key++) { for (i = 0; i < nr_cpus; i++) values[i] = 0; assert(bpf_lookup_elem(map_fd, &key, values) == 0); for (i = 0; i < nr_cpus; i++) assert(values[i] == i + 10); } close(map_fd); } static void test_percpu_arraymap_sanity(int i, void *data) { unsigned nr_cpus = sysconf(_SC_NPROCESSORS_CONF); long values[nr_cpus]; int key, next_key, map_fd; map_fd = bpf_create_map(BPF_MAP_TYPE_PERCPU_ARRAY, sizeof(key), sizeof(values[0]), 2); if (map_fd < 0) { printf("failed to create arraymap '%s'\n", strerror(errno)); exit(1); } for (i = 0; i < nr_cpus; i++) values[i] = i + 100; key = 1; /* insert key=1 element */ assert(bpf_update_elem(map_fd, &key, values, BPF_ANY) == 0); values[0] = 0; assert(bpf_update_elem(map_fd, &key, values, BPF_NOEXIST) == -1 && errno == EEXIST); /* check that key=1 can be found */ assert(bpf_lookup_elem(map_fd, &key, values) == 0 && values[0] == 100); key = 0; /* check that key=0 is also found and zero initialized */ assert(bpf_lookup_elem(map_fd, &key, values) == 0 && values[0] == 0 && values[nr_cpus - 1] == 0); /* check that key=2 cannot be inserted due to max_entries limit */ key = 2; assert(bpf_update_elem(map_fd, &key, values, BPF_EXIST) == -1 && errno == E2BIG); /* check that key = 2 doesn't exist */ assert(bpf_lookup_elem(map_fd, &key, values) == -1 && errno == ENOENT); /* iterate over two elements */ assert(bpf_get_next_key(map_fd, &key, &next_key) == 0 && next_key == 0); assert(bpf_get_next_key(map_fd, &next_key, &next_key) == 0 && next_key == 1); assert(bpf_get_next_key(map_fd, &next_key, &next_key) == -1 && errno == ENOENT); /* delete shouldn't succeed */ key = 1; assert(bpf_delete_elem(map_fd, &key) == -1 && errno == EINVAL); close(map_fd); } #define MAP_SIZE (32 * 1024) static void test_map_large(void) { Loading Loading @@ -305,6 +393,7 @@ static void test_map_stress(void) run_parallel(100, test_hashmap_sanity, NULL); run_parallel(100, test_percpu_hashmap_sanity, NULL); run_parallel(100, test_arraymap_sanity, NULL); run_parallel(100, test_percpu_arraymap_sanity, NULL); } #define TASKS 1024 Loading Loading @@ -379,6 +468,9 @@ int main(void) test_hashmap_sanity(0, NULL); test_percpu_hashmap_sanity(0, NULL); test_arraymap_sanity(0, NULL); test_percpu_arraymap_sanity(0, NULL); test_percpu_arraymap_many_keys(); test_map_large(); test_map_parallel(); test_map_stress(); Loading Loading
samples/bpf/test_maps.c +92 −0 Original line number Diff line number Diff line Loading @@ -236,6 +236,94 @@ static void test_arraymap_sanity(int i, void *data) close(map_fd); } static void test_percpu_arraymap_many_keys(void) { unsigned nr_cpus = sysconf(_SC_NPROCESSORS_CONF); unsigned nr_keys = 20000; long values[nr_cpus]; int key, map_fd, i; map_fd = bpf_create_map(BPF_MAP_TYPE_PERCPU_ARRAY, sizeof(key), sizeof(values[0]), nr_keys); if (map_fd < 0) { printf("failed to create per-cpu arraymap '%s'\n", strerror(errno)); exit(1); } for (i = 0; i < nr_cpus; i++) values[i] = i + 10; for (key = 0; key < nr_keys; key++) assert(bpf_update_elem(map_fd, &key, values, BPF_ANY) == 0); for (key = 0; key < nr_keys; key++) { for (i = 0; i < nr_cpus; i++) values[i] = 0; assert(bpf_lookup_elem(map_fd, &key, values) == 0); for (i = 0; i < nr_cpus; i++) assert(values[i] == i + 10); } close(map_fd); } static void test_percpu_arraymap_sanity(int i, void *data) { unsigned nr_cpus = sysconf(_SC_NPROCESSORS_CONF); long values[nr_cpus]; int key, next_key, map_fd; map_fd = bpf_create_map(BPF_MAP_TYPE_PERCPU_ARRAY, sizeof(key), sizeof(values[0]), 2); if (map_fd < 0) { printf("failed to create arraymap '%s'\n", strerror(errno)); exit(1); } for (i = 0; i < nr_cpus; i++) values[i] = i + 100; key = 1; /* insert key=1 element */ assert(bpf_update_elem(map_fd, &key, values, BPF_ANY) == 0); values[0] = 0; assert(bpf_update_elem(map_fd, &key, values, BPF_NOEXIST) == -1 && errno == EEXIST); /* check that key=1 can be found */ assert(bpf_lookup_elem(map_fd, &key, values) == 0 && values[0] == 100); key = 0; /* check that key=0 is also found and zero initialized */ assert(bpf_lookup_elem(map_fd, &key, values) == 0 && values[0] == 0 && values[nr_cpus - 1] == 0); /* check that key=2 cannot be inserted due to max_entries limit */ key = 2; assert(bpf_update_elem(map_fd, &key, values, BPF_EXIST) == -1 && errno == E2BIG); /* check that key = 2 doesn't exist */ assert(bpf_lookup_elem(map_fd, &key, values) == -1 && errno == ENOENT); /* iterate over two elements */ assert(bpf_get_next_key(map_fd, &key, &next_key) == 0 && next_key == 0); assert(bpf_get_next_key(map_fd, &next_key, &next_key) == 0 && next_key == 1); assert(bpf_get_next_key(map_fd, &next_key, &next_key) == -1 && errno == ENOENT); /* delete shouldn't succeed */ key = 1; assert(bpf_delete_elem(map_fd, &key) == -1 && errno == EINVAL); close(map_fd); } #define MAP_SIZE (32 * 1024) static void test_map_large(void) { Loading Loading @@ -305,6 +393,7 @@ static void test_map_stress(void) run_parallel(100, test_hashmap_sanity, NULL); run_parallel(100, test_percpu_hashmap_sanity, NULL); run_parallel(100, test_arraymap_sanity, NULL); run_parallel(100, test_percpu_arraymap_sanity, NULL); } #define TASKS 1024 Loading Loading @@ -379,6 +468,9 @@ int main(void) test_hashmap_sanity(0, NULL); test_percpu_hashmap_sanity(0, NULL); test_arraymap_sanity(0, NULL); test_percpu_arraymap_sanity(0, NULL); test_percpu_arraymap_many_keys(); test_map_large(); test_map_parallel(); test_map_stress(); Loading