| // SPDX-License-Identifier: GPL-2.0 |
| |
| #include <sys/types.h> |
| #include <sys/stat.h> |
| #include <unistd.h> |
| #include <test_progs.h> |
| |
| |
| #include "test_pinning_devmap.skel.h" |
| |
| void test_pinning_devmap_reuse(void) |
| { |
| const char *pinpath1 = "/sys/fs/bpf/pinmap1"; |
| const char *pinpath2 = "/sys/fs/bpf/pinmap2"; |
| struct test_pinning_devmap *skel1 = NULL, *skel2 = NULL; |
| int err; |
| DECLARE_LIBBPF_OPTS(bpf_object_open_opts, opts); |
| |
| /* load the object a first time */ |
| skel1 = test_pinning_devmap__open_and_load(); |
| if (!ASSERT_OK_PTR(skel1, "skel_load1")) |
| goto out; |
| |
| /* load the object a second time, re-using the pinned map */ |
| skel2 = test_pinning_devmap__open_and_load(); |
| if (!ASSERT_OK_PTR(skel2, "skel_load2")) |
| goto out; |
| |
| /* we can close the reference safely without |
| * the map's refcount falling to 0 |
| */ |
| test_pinning_devmap__destroy(skel1); |
| skel1 = NULL; |
| |
| /* now, swap the pins */ |
| err = renameat2(0, pinpath1, 0, pinpath2, RENAME_EXCHANGE); |
| if (!ASSERT_OK(err, "swap pins")) |
| goto out; |
| |
| /* load the object again, this time the re-use should fail */ |
| skel1 = test_pinning_devmap__open_and_load(); |
| if (!ASSERT_ERR_PTR(skel1, "skel_load3")) |
| goto out; |
| |
| out: |
| unlink(pinpath1); |
| unlink(pinpath2); |
| test_pinning_devmap__destroy(skel1); |
| test_pinning_devmap__destroy(skel2); |
| } |