On Fri, Mar 13, 2020 at 5:05 PM Martin KaFai Lau <kafai@xxxxxx> wrote: > > On Fri, Mar 13, 2020 at 04:35:35PM -0700, Andrii Nakryiko wrote: > > Amazingly, some libc implementations don't call __NR_nanosleep syscall from > > their nanosleep() APIs. Hammer it down with explicit syscall() call and never > > get back to it again. Also simplify code for timespec initialization. > > > > I verified that nanosleep is called w/ printk and in exactly same Linux image > > that is used in Travis CI. So it should both sleep and call correct syscall. > > > > Fixes: 4e1fd25d19e8 ("selftests/bpf: Fix usleep() implementation") > > Signed-off-by: Andrii Nakryiko <andriin@xxxxxx> > > --- > > tools/testing/selftests/bpf/test_progs.c | 16 ++++++---------- > > 1 file changed, 6 insertions(+), 10 deletions(-) > > > > diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c > > index f85a06512541..6956d722a463 100644 > > --- a/tools/testing/selftests/bpf/test_progs.c > > +++ b/tools/testing/selftests/bpf/test_progs.c > > @@ -35,16 +35,12 @@ struct prog_test_def { > > */ > > int usleep(useconds_t usec) > > { > > - 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); > > + struct timespec ts = { > > + .tv_sec = usec / 1000000, > > + .tv_nsec = usec % 1000000, > usec is in micro and tv_nsec is in nano? > Yes, this is implementation of usleep() (microsecond sleep), so usec is microseconds. We call nanosleep internally, though, which accepts seconds and nanoseconds units. Did I mess up math here? But either way, sending v2, there is another place we explicitly are calling nanosleep as well, fixing that one as well. > > + }; > > + > > + return syscall(__NR_nanosleep, &ts, NULL); > > } > >