selftests/bpf: Fix usleep() implementation
authorAndrii Nakryiko <andriin@fb.com>
Fri, 13 Mar 2020 06:18:37 +0000 (23:18 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 13 Mar 2020 19:49:52 +0000 (12:49 -0700)
nanosleep syscall expects pointer to struct timespec, not nanoseconds
directly. Current implementation fulfills its purpose of invoking nanosleep
syscall, but doesn't really provide sleeping capabilities, which can cause
flakiness for tests relying on usleep() to wait for something.

Fixes: ec12a57b822c ("selftests/bpf: Guarantee that useep() calls nanosleep() syscall")
Signed-off-by: Andrii Nakryiko <andriin@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20200313061837.3685572-1-andriin@fb.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/test_progs.c

index 2b0bc1171c9cc140697e1eae7e13d07890ee3f91..b6201dd82edfdb2c79ad0cd6c6e65e95cab3fdfa 100644 (file)
@@ -35,7 +35,16 @@ struct prog_test_def {
  */
 int usleep(useconds_t usec)
 {
-       return syscall(__NR_nanosleep, usec * 1000UL);
+       struct timespec ts;
+
+       if (usec > 999999) {
+               ts.tv_sec = usec / 1000000;
+               ts.tv_nsec = usec % 1000000;
+       } else {
+               ts.tv_sec = 0;
+               ts.tv_nsec = usec;
+       }
+       return nanosleep(&ts, NULL);
 }
 
 static bool should_run(struct test_selector *sel, int num, const char *name)