1 // SPDX-License-Identifier: GPL-2.0 2 /* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */ 3 #include <test_progs.h> 4 #include <sys/mman.h> 5 #include "mmap_inner_array.skel.h" 6 7 void test_mmap_inner_array(void) 8 { 9 const long page_size = sysconf(_SC_PAGE_SIZE); 10 struct mmap_inner_array *skel; 11 int inner_array_fd, err; 12 void *tmp; 13 __u64 *val; 14 15 skel = mmap_inner_array__open_and_load(); 16 17 if (!ASSERT_OK_PTR(skel, "open_and_load")) 18 return; 19 20 inner_array_fd = bpf_map__fd(skel->maps.inner_array); 21 tmp = mmap(NULL, page_size, PROT_READ | PROT_WRITE, MAP_SHARED, inner_array_fd, 0); 22 if (!ASSERT_OK_PTR(tmp, "inner array mmap")) 23 goto out; 24 val = (void *)tmp; 25 26 err = mmap_inner_array__attach(skel); 27 if (!ASSERT_OK(err, "attach")) 28 goto out_unmap; 29 30 skel->bss->pid = getpid(); 31 usleep(1); 32 33 /* pid is set, pid_match == true and outer_map_match == false */ 34 ASSERT_TRUE(skel->bss->pid_match, "pid match 1"); 35 ASSERT_FALSE(skel->bss->outer_map_match, "outer map match 1"); 36 ASSERT_FALSE(skel->bss->done, "done 1"); 37 ASSERT_EQ(*val, 0, "value match 1"); 38 39 err = bpf_map__update_elem(skel->maps.outer_map, 40 &skel->bss->pid, sizeof(skel->bss->pid), 41 &inner_array_fd, sizeof(inner_array_fd), 42 BPF_ANY); 43 if (!ASSERT_OK(err, "update elem")) 44 goto out_unmap; 45 usleep(1); 46 47 /* outer map key is set, outer_map_match == true */ 48 ASSERT_TRUE(skel->bss->pid_match, "pid match 2"); 49 ASSERT_TRUE(skel->bss->outer_map_match, "outer map match 2"); 50 ASSERT_TRUE(skel->bss->done, "done 2"); 51 ASSERT_EQ(*val, skel->data->match_value, "value match 2"); 52 53 out_unmap: 54 munmap(tmp, page_size); 55 out: 56 mmap_inner_array__destroy(skel); 57 } 58