Improve stability of find_vma BPF test

Remove unneeded spleep and increase length of dummy CPU
intensive computation to guarantee test process execution.
Also, complete aforemention computation as soon as
test success criteria is met

Signed-off-by: Mykola Lysenko <mykolal@fb.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Yonghong Song <yhs@fb.com>
Link: https://lore.kernel.org/bpf/20220308200449.1757478-4-mykolal@fb.com
This commit is contained in:
Mykola Lysenko 2022-03-08 12:04:49 -08:00 committed by Andrii Nakryiko
parent 1fd4986412
commit ba83af0591
1 changed files with 19 additions and 9 deletions

View File

@ -7,12 +7,14 @@
#include "find_vma_fail1.skel.h" #include "find_vma_fail1.skel.h"
#include "find_vma_fail2.skel.h" #include "find_vma_fail2.skel.h"
static void test_and_reset_skel(struct find_vma *skel, int expected_find_zero_ret) static void test_and_reset_skel(struct find_vma *skel, int expected_find_zero_ret, bool need_test)
{ {
if (need_test) {
ASSERT_EQ(skel->bss->found_vm_exec, 1, "found_vm_exec"); ASSERT_EQ(skel->bss->found_vm_exec, 1, "found_vm_exec");
ASSERT_EQ(skel->data->find_addr_ret, 0, "find_addr_ret"); ASSERT_EQ(skel->data->find_addr_ret, 0, "find_addr_ret");
ASSERT_EQ(skel->data->find_zero_ret, expected_find_zero_ret, "find_zero_ret"); ASSERT_EQ(skel->data->find_zero_ret, expected_find_zero_ret, "find_zero_ret");
ASSERT_OK_PTR(strstr(skel->bss->d_iname, "test_progs"), "find_test_progs"); ASSERT_OK_PTR(strstr(skel->bss->d_iname, "test_progs"), "find_test_progs");
}
skel->bss->found_vm_exec = 0; skel->bss->found_vm_exec = 0;
skel->data->find_addr_ret = -1; skel->data->find_addr_ret = -1;
@ -36,11 +38,20 @@ static int open_pe(void)
return pfd >= 0 ? pfd : -errno; return pfd >= 0 ? pfd : -errno;
} }
static bool find_vma_pe_condition(struct find_vma *skel)
{
return skel->bss->found_vm_exec == 0 ||
skel->data->find_addr_ret != 0 ||
skel->data->find_zero_ret == -1 ||
strcmp(skel->bss->d_iname, "test_progs") != 0;
}
static void test_find_vma_pe(struct find_vma *skel) static void test_find_vma_pe(struct find_vma *skel)
{ {
struct bpf_link *link = NULL; struct bpf_link *link = NULL;
volatile int j = 0; volatile int j = 0;
int pfd, i; int pfd, i;
const int one_bn = 1000000000;
pfd = open_pe(); pfd = open_pe();
if (pfd < 0) { if (pfd < 0) {
@ -57,10 +68,10 @@ static void test_find_vma_pe(struct find_vma *skel)
if (!ASSERT_OK_PTR(link, "attach_perf_event")) if (!ASSERT_OK_PTR(link, "attach_perf_event"))
goto cleanup; goto cleanup;
for (i = 0; i < 1000000; ++i) for (i = 0; i < one_bn && find_vma_pe_condition(skel); ++i)
++j; ++j;
test_and_reset_skel(skel, -EBUSY /* in nmi, irq_work is busy */); test_and_reset_skel(skel, -EBUSY /* in nmi, irq_work is busy */, i == one_bn);
cleanup: cleanup:
bpf_link__destroy(link); bpf_link__destroy(link);
close(pfd); close(pfd);
@ -75,7 +86,7 @@ static void test_find_vma_kprobe(struct find_vma *skel)
return; return;
getpgid(skel->bss->target_pid); getpgid(skel->bss->target_pid);
test_and_reset_skel(skel, -ENOENT /* could not find vma for ptr 0 */); test_and_reset_skel(skel, -ENOENT /* could not find vma for ptr 0 */, true);
} }
static void test_illegal_write_vma(void) static void test_illegal_write_vma(void)
@ -108,7 +119,6 @@ void serial_test_find_vma(void)
skel->bss->addr = (__u64)(uintptr_t)test_find_vma_pe; skel->bss->addr = (__u64)(uintptr_t)test_find_vma_pe;
test_find_vma_pe(skel); test_find_vma_pe(skel);
usleep(100000); /* allow the irq_work to finish */
test_find_vma_kprobe(skel); test_find_vma_kprobe(skel);
find_vma__destroy(skel); find_vma__destroy(skel);