Message ID | 20231203235117.29677-1-wegao@suse.com |
---|---|
State | Changes Requested |
Headers | show |
Series | [v1] Futex_waitv: Convert 32bit timespec struct to 64bit version for 32bit compatibility mode | expand |
Hi! On 12/4/23 00:51, Wei Gao via ltp wrote: > Futex_waitv can not accept old_timespec32 struct, so userspace should > convert it from 32bit to 64bit before syscall in 32bit compatible mode. > > Detail info you can refer following email thread: > https://lkml.org/lkml/2023/11/23/13 > > Signed-off-by: Wei Gao <wegao@suse.com> > --- > testcases/kernel/syscalls/futex/futex2test.h | 16 ++++++++++++++++ > 1 file changed, 16 insertions(+) > > diff --git a/testcases/kernel/syscalls/futex/futex2test.h b/testcases/kernel/syscalls/futex/futex2test.h > index ce97f47c1..f9a031e11 100644 > --- a/testcases/kernel/syscalls/futex/futex2test.h > +++ b/testcases/kernel/syscalls/futex/futex2test.h > @@ -13,6 +13,13 @@ > #include "lapi/syscalls.h" > #include "futextest.h" > > +#if !defined(__LP64__) Here you can use "lapi/abisize.h" header. The TST_ABI32 definition is provided when we are running on a 32-bits system. > +struct timespec64 { > + int64_t tv_sec; > + int64_t tv_nsec; > +}; > +#endif > + > /** > * futex_waitv - Wait at multiple futexes, wake on any > * @waiters: Array of waiters > @@ -24,7 +31,16 @@ static inline int futex_waitv(volatile struct futex_waitv *waiters, > unsigned long nr_waiters, unsigned long flags, > struct timespec *timo, clockid_t clockid) > { > +#if !defined(__LP64__) > + struct timespec64 timo64 = {0}; > + > + timo64.tv_sec = timo->tv_sec; > + timo64.tv_nsec = timo->tv_nsec; > + return tst_syscall(__NR_futex_waitv, waiters, nr_waiters, flags, &timo64, clockid); > +#else > return tst_syscall(__NR_futex_waitv, waiters, nr_waiters, flags, timo, clockid); > + > +#endif > } > > #endif /* _FUTEX2TEST_H */ Regards, Andrea Cervesato
diff --git a/testcases/kernel/syscalls/futex/futex2test.h b/testcases/kernel/syscalls/futex/futex2test.h index ce97f47c1..f9a031e11 100644 --- a/testcases/kernel/syscalls/futex/futex2test.h +++ b/testcases/kernel/syscalls/futex/futex2test.h @@ -13,6 +13,13 @@ #include "lapi/syscalls.h" #include "futextest.h" +#if !defined(__LP64__) +struct timespec64 { + int64_t tv_sec; + int64_t tv_nsec; +}; +#endif + /** * futex_waitv - Wait at multiple futexes, wake on any * @waiters: Array of waiters @@ -24,7 +31,16 @@ static inline int futex_waitv(volatile struct futex_waitv *waiters, unsigned long nr_waiters, unsigned long flags, struct timespec *timo, clockid_t clockid) { +#if !defined(__LP64__) + struct timespec64 timo64 = {0}; + + timo64.tv_sec = timo->tv_sec; + timo64.tv_nsec = timo->tv_nsec; + return tst_syscall(__NR_futex_waitv, waiters, nr_waiters, flags, &timo64, clockid); +#else return tst_syscall(__NR_futex_waitv, waiters, nr_waiters, flags, timo, clockid); + +#endif } #endif /* _FUTEX2TEST_H */
Futex_waitv can not accept old_timespec32 struct, so userspace should convert it from 32bit to 64bit before syscall in 32bit compatible mode. Detail info you can refer following email thread: https://lkml.org/lkml/2023/11/23/13 Signed-off-by: Wei Gao <wegao@suse.com> --- testcases/kernel/syscalls/futex/futex2test.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)