* [PATCH v1] futex: Add compat_sys_futex_waitv for 32bit compatibility
@ 2023-11-23 5:31 Wei Gao
2023-11-23 16:09 ` André Almeida
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Wei Gao @ 2023-11-23 5:31 UTC (permalink / raw)
To: tglx, mingo, peterz, dvhart, dave, andrealmeid, linux-kernel; +Cc: wei gao
From: wei gao <wegao@suse.com>
Current implementation lead LTP test case futex_waitv failed when compiled with
-m32. This patch add new compat_sys_futex_waitv to handle m32 mode syscall.
The failure reason is futex_waitv in m32 mode will deliver kernel with struct
old_timespec32 timeout, but this struct type can not directly used by current
sys_futex_waitv implementation.
The new function copy main logic of current sys_futex_waitv, just update parameter
type from "struct __kernel_timespec __user *" to "struct old_timespec32 __user *,"
and use get_old_timespec32 within the new function to get timeout value.
Signed-off-by: wei gao <wegao@suse.com>
---
arch/x86/entry/syscalls/syscall_32.tbl | 2 +-
kernel/futex/syscalls.c | 61 ++++++++++++++++++++++++++
2 files changed, 62 insertions(+), 1 deletion(-)
diff --git a/arch/x86/entry/syscalls/syscall_32.tbl b/arch/x86/entry/syscalls/syscall_32.tbl
index c8fac5205803..11bd927dd417 100644
--- a/arch/x86/entry/syscalls/syscall_32.tbl
+++ b/arch/x86/entry/syscalls/syscall_32.tbl
@@ -453,7 +453,7 @@
446 i386 landlock_restrict_self sys_landlock_restrict_self
447 i386 memfd_secret sys_memfd_secret
448 i386 process_mrelease sys_process_mrelease
-449 i386 futex_waitv sys_futex_waitv
+449 i386 futex_waitv sys_futex_waitv compat_sys_futex_waitv
450 i386 set_mempolicy_home_node sys_set_mempolicy_home_node
451 i386 cachestat sys_cachestat
452 i386 fchmodat2 sys_fchmodat2
diff --git a/kernel/futex/syscalls.c b/kernel/futex/syscalls.c
index 4b6da9116aa6..62d69f8ec34c 100644
--- a/kernel/futex/syscalls.c
+++ b/kernel/futex/syscalls.c
@@ -486,6 +486,67 @@ COMPAT_SYSCALL_DEFINE3(get_robust_list, int, pid,
return ret;
}
+
+COMPAT_SYSCALL_DEFINE5(futex_waitv, struct futex_waitv __user *, waiters,
+ unsigned int, nr_futexes, unsigned int, flags,
+ struct old_timespec32 __user *, timeout, clockid_t, clockid)
+{
+ struct hrtimer_sleeper to;
+ struct futex_vector *futexv;
+ struct timespec64 ts;
+ ktime_t time;
+ int ret;
+
+ /* This syscall supports no flags for now */
+ if (flags)
+ return -EINVAL;
+
+ if (!nr_futexes || nr_futexes > FUTEX_WAITV_MAX || !waiters)
+ return -EINVAL;
+
+ if (timeout) {
+ int flag_clkid = 0, flag_init = 0;
+
+ if (clockid == CLOCK_REALTIME) {
+ flag_clkid = FLAGS_CLOCKRT;
+ flag_init = FUTEX_CLOCK_REALTIME;
+ }
+
+ if (clockid != CLOCK_REALTIME && clockid != CLOCK_MONOTONIC)
+ return -EINVAL;
+
+ if (get_old_timespec32(&ts, timeout))
+ return -EFAULT;
+
+ /*
+ * Since there's no opcode for futex_waitv, use
+ * FUTEX_WAIT_BITSET that uses absolute timeout as well
+ */
+ ret = futex_init_timeout(FUTEX_WAIT_BITSET, flag_init, &ts, &time);
+ if (ret)
+ return ret;
+
+ futex_setup_timer(&time, &to, flag_clkid, 0);
+ }
+
+ futexv = kcalloc(nr_futexes, sizeof(*futexv), GFP_KERNEL);
+ if (!futexv) {
+ ret = -ENOMEM;
+ goto destroy_timer;
+ }
+
+ ret = futex_parse_waitv(futexv, waiters, nr_futexes, futex_wake_mark,
+ NULL);
+ if (!ret)
+ ret = futex_wait_multiple(futexv, nr_futexes, timeout ? &to : NULL);
+
+ kfree(futexv);
+
+destroy_timer:
+ if (timeout)
+ futex2_destroy_timeout(&to);
+ return ret;
+}
#endif /* CONFIG_COMPAT */
#ifdef CONFIG_COMPAT_32BIT_TIME
--
2.34.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v1] futex: Add compat_sys_futex_waitv for 32bit compatibility
2023-11-23 5:31 [PATCH v1] futex: Add compat_sys_futex_waitv for 32bit compatibility Wei Gao
@ 2023-11-23 16:09 ` André Almeida
2023-11-27 12:15 ` Wei Gao
2023-11-24 13:19 ` kernel test robot
2023-11-29 20:54 ` Thomas Gleixner
2 siblings, 1 reply; 8+ messages in thread
From: André Almeida @ 2023-11-23 16:09 UTC (permalink / raw)
To: Wei Gao; +Cc: tglx, dvhart, linux-kernel, dave, mingo, peterz, Arnd Bergmann
[+CC Arnd]
Hi Wei,
Em 23/11/2023 02:31, Wei Gao escreveu:
> From: wei gao <wegao@suse.com>
>
> Current implementation lead LTP test case futex_waitv failed when compiled with
> -m32. This patch add new compat_sys_futex_waitv to handle m32 mode syscall.
>
> The failure reason is futex_waitv in m32 mode will deliver kernel with struct
> old_timespec32 timeout, but this struct type can not directly used by current
> sys_futex_waitv implementation.
>
> The new function copy main logic of current sys_futex_waitv, just update parameter
> type from "struct __kernel_timespec __user *" to "struct old_timespec32 __user *,"
> and use get_old_timespec32 within the new function to get timeout value.
>
From, what I recall, we don't want to add new syscalls with
old_timespec32, giving that they will have a limited lifetime. Instead,
userspace should be able to come up with a 64-bit timespec
implementation for -m32.
Thanks,
André
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v1] futex: Add compat_sys_futex_waitv for 32bit compatibility
2023-11-23 5:31 [PATCH v1] futex: Add compat_sys_futex_waitv for 32bit compatibility Wei Gao
2023-11-23 16:09 ` André Almeida
@ 2023-11-24 13:19 ` kernel test robot
2023-11-29 20:54 ` Thomas Gleixner
2 siblings, 0 replies; 8+ messages in thread
From: kernel test robot @ 2023-11-24 13:19 UTC (permalink / raw)
To: Wei Gao, tglx, mingo, peterz, dvhart, dave, andrealmeid, linux-kernel
Cc: oe-kbuild-all, wei gao
Hi Wei,
kernel test robot noticed the following build errors:
[auto build test ERROR on tip/x86/asm]
[also build test ERROR on tip/locking/core linus/master v6.7-rc2 next-20231124]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Wei-Gao/futex-Add-compat_sys_futex_waitv-for-32bit-compatibility/20231123-133427
base: tip/x86/asm
patch link: https://lore.kernel.org/r/20231123053140.16062-1-wegao%40suse.com
patch subject: [PATCH v1] futex: Add compat_sys_futex_waitv for 32bit compatibility
config: x86_64-buildonly-randconfig-005-20231123 (https://download.01.org/0day-ci/archive/20231124/202311241440.BxBAsQ2i-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231124/202311241440.BxBAsQ2i-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202311241440.BxBAsQ2i-lkp@intel.com/
All errors (new ones prefixed by >>):
>> ld: arch/x86/entry/syscall_32.o:(.rodata+0xe08): undefined reference to `__ia32_compat_sys_futex_waitv'
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v1] futex: Add compat_sys_futex_waitv for 32bit compatibility
2023-11-23 16:09 ` André Almeida
@ 2023-11-27 12:15 ` Wei Gao
2023-11-29 18:56 ` André Almeida
0 siblings, 1 reply; 8+ messages in thread
From: Wei Gao @ 2023-11-27 12:15 UTC (permalink / raw)
To: André Almeida
Cc: tglx, dvhart, linux-kernel, dave, mingo, peterz, Arnd Bergmann
On Thu, Nov 23, 2023 at 01:09:55PM -0300, André Almeida wrote:
> [+CC Arnd]
>
> Hi Wei,
>
> Em 23/11/2023 02:31, Wei Gao escreveu:
> > From: wei gao <wegao@suse.com>
> >
> > Current implementation lead LTP test case futex_waitv failed when compiled with
> > -m32. This patch add new compat_sys_futex_waitv to handle m32 mode syscall.
> >
> > The failure reason is futex_waitv in m32 mode will deliver kernel with struct
> > old_timespec32 timeout, but this struct type can not directly used by current
> > sys_futex_waitv implementation.
> >
> > The new function copy main logic of current sys_futex_waitv, just update parameter
> > type from "struct __kernel_timespec __user *" to "struct old_timespec32 __user *,"
> > and use get_old_timespec32 within the new function to get timeout value.
> >
>
> From, what I recall, we don't want to add new syscalls with old_timespec32,
> giving that they will have a limited lifetime. Instead, userspace should be
> able to come up with a 64-bit timespec implementation for -m32.
>
> Thanks,
> André
Just a comment, I have checked the glibc latest code but do not see any implemention(*.c) on
futex_waitv syscall. So normally you have to do syscall directly with __NR_futex_waitv from
userspace. So i guess glibc-side can not covert this struct correctly currently. Correct me if
any misunderstanding.
Thanks
Wei Gao
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v1] futex: Add compat_sys_futex_waitv for 32bit compatibility
2023-11-27 12:15 ` Wei Gao
@ 2023-11-29 18:56 ` André Almeida
2023-12-01 6:39 ` Wei Gao
0 siblings, 1 reply; 8+ messages in thread
From: André Almeida @ 2023-11-29 18:56 UTC (permalink / raw)
To: Wei Gao; +Cc: tglx, dvhart, linux-kernel, dave, mingo, peterz, Arnd Bergmann
Hi Wei,
Em 27/11/2023 09:15, Wei Gao escreveu:
> On Thu, Nov 23, 2023 at 01:09:55PM -0300, André Almeida wrote:
>> [+CC Arnd]
>>
>> Hi Wei,
>>
>> Em 23/11/2023 02:31, Wei Gao escreveu:
>>> From: wei gao <wegao@suse.com>
>>>
>>> Current implementation lead LTP test case futex_waitv failed when compiled with
>>> -m32. This patch add new compat_sys_futex_waitv to handle m32 mode syscall.
>>>
>>> The failure reason is futex_waitv in m32 mode will deliver kernel with struct
>>> old_timespec32 timeout, but this struct type can not directly used by current
>>> sys_futex_waitv implementation.
>>>
>>> The new function copy main logic of current sys_futex_waitv, just update parameter
>>> type from "struct __kernel_timespec __user *" to "struct old_timespec32 __user *,"
>>> and use get_old_timespec32 within the new function to get timeout value.
>>>
>>
>> From, what I recall, we don't want to add new syscalls with old_timespec32,
>> giving that they will have a limited lifetime. Instead, userspace should be
>> able to come up with a 64-bit timespec implementation for -m32.
>>
>> Thanks,
>> André
>
> Just a comment, I have checked the glibc latest code but do not see any implemention(*.c) on
> futex_waitv syscall. So normally you have to do syscall directly with __NR_futex_waitv from
> userspace. So i guess glibc-side can not covert this struct correctly currently. Correct me if
> any misunderstanding.
>
futex() has no syscall wrappers in glibc. Userspace needs to figure out
everything by themselves, including which struct they should use, and I
don't think that glibc does any conversion. If you create manually a
timespec64 that works in -m32, and pass this to sycall(__NR_futex_waitv,
..., &timeout, ...), it should work correctly. You can read more about
how glibc is planning to deal with this at [1]. Please let me know if
now it's more clear :)
[1] https://sourceware.org/glibc/wiki/Y2038ProofnessDesign
> Thanks
> Wei Gao
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v1] futex: Add compat_sys_futex_waitv for 32bit compatibility
2023-11-23 5:31 [PATCH v1] futex: Add compat_sys_futex_waitv for 32bit compatibility Wei Gao
2023-11-23 16:09 ` André Almeida
2023-11-24 13:19 ` kernel test robot
@ 2023-11-29 20:54 ` Thomas Gleixner
2023-12-01 6:49 ` Wei Gao
2 siblings, 1 reply; 8+ messages in thread
From: Thomas Gleixner @ 2023-11-29 20:54 UTC (permalink / raw)
To: Wei Gao, mingo, peterz, dvhart, dave, andrealmeid, linux-kernel; +Cc: wei gao
On Thu, Nov 23 2023 at 00:31, Wei Gao wrote:
> The new function copy main logic of current sys_futex_waitv, just update parameter
> type from "struct __kernel_timespec __user *" to "struct old_timespec32 __user *,"
> and use get_old_timespec32 within the new function to get timeout
> value.
That's not how it works.
struct __kernel_timespec is the same on 64bit and 32bit syscalls.
User space has to use the proper type when invoking a syscall and and
not just decide that it can use something arbitrary.
All new syscalls which deal with time use the Y2038 aware data types and
do not have compat fallbacks because there is no requirement to have
them.
If user space want's to use struct timespec on 32bit nevertheless in the
programm for a new syscall, which is obviously stupid in the context of
Y2038, then it's a user space problem to convert back and forth between
the two data types.
Fix LTP to be Y2038 safe instead.
Thanks,
tglx
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v1] futex: Add compat_sys_futex_waitv for 32bit compatibility
2023-11-29 18:56 ` André Almeida
@ 2023-12-01 6:39 ` Wei Gao
0 siblings, 0 replies; 8+ messages in thread
From: Wei Gao @ 2023-12-01 6:39 UTC (permalink / raw)
To: André Almeida
Cc: tglx, dvhart, linux-kernel, dave, mingo, peterz, Arnd Bergmann
On Wed, Nov 29, 2023 at 03:56:12PM -0300, André Almeida wrote:
> Hi Wei,
>
> Em 27/11/2023 09:15, Wei Gao escreveu:
> > On Thu, Nov 23, 2023 at 01:09:55PM -0300, André Almeida wrote:
> > > [+CC Arnd]
> > >
> > > Hi Wei,
> > >
> > > Em 23/11/2023 02:31, Wei Gao escreveu:
> > > > From: wei gao <wegao@suse.com>
> > > >
> > > > Current implementation lead LTP test case futex_waitv failed when compiled with
> > > > -m32. This patch add new compat_sys_futex_waitv to handle m32 mode syscall.
> > > >
> > > > The failure reason is futex_waitv in m32 mode will deliver kernel with struct
> > > > old_timespec32 timeout, but this struct type can not directly used by current
> > > > sys_futex_waitv implementation.
> > > >
> > > > The new function copy main logic of current sys_futex_waitv, just update parameter
> > > > type from "struct __kernel_timespec __user *" to "struct old_timespec32 __user *,"
> > > > and use get_old_timespec32 within the new function to get timeout value.
> > > >
> > >
> > > From, what I recall, we don't want to add new syscalls with old_timespec32,
> > > giving that they will have a limited lifetime. Instead, userspace should be
> > > able to come up with a 64-bit timespec implementation for -m32.
> > >
> > > Thanks,
> > > André
> >
> > Just a comment, I have checked the glibc latest code but do not see any implemention(*.c) on
> > futex_waitv syscall. So normally you have to do syscall directly with __NR_futex_waitv from
> > userspace. So i guess glibc-side can not covert this struct correctly currently. Correct me if
> > any misunderstanding.
> >
>
> futex() has no syscall wrappers in glibc. Userspace needs to figure out
> everything by themselves, including which struct they should use, and I
> don't think that glibc does any conversion. If you create manually a
> timespec64 that works in -m32, and pass this to sycall(__NR_futex_waitv,
> ..., &timeout, ...), it should work correctly. You can read more about how
> glibc is planning to deal with this at [1]. Please let me know if now it's
> more clear :)
>
> [1] https://sourceware.org/glibc/wiki/Y2038ProofnessDesign
Thanks a lot for your detail explaination and good learning link, it's more clear to me now : )
>
> > Thanks
> > Wei Gao
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v1] futex: Add compat_sys_futex_waitv for 32bit compatibility
2023-11-29 20:54 ` Thomas Gleixner
@ 2023-12-01 6:49 ` Wei Gao
0 siblings, 0 replies; 8+ messages in thread
From: Wei Gao @ 2023-12-01 6:49 UTC (permalink / raw)
To: Thomas Gleixner; +Cc: mingo, peterz, dvhart, dave, andrealmeid, linux-kernel
On Wed, Nov 29, 2023 at 09:54:56PM +0100, Thomas Gleixner wrote:
> On Thu, Nov 23 2023 at 00:31, Wei Gao wrote:
> > The new function copy main logic of current sys_futex_waitv, just update parameter
> > type from "struct __kernel_timespec __user *" to "struct old_timespec32 __user *,"
> > and use get_old_timespec32 within the new function to get timeout
> > value.
>
> That's not how it works.
>
> struct __kernel_timespec is the same on 64bit and 32bit syscalls.
>
> User space has to use the proper type when invoking a syscall and and
> not just decide that it can use something arbitrary.
>
> All new syscalls which deal with time use the Y2038 aware data types and
> do not have compat fallbacks because there is no requirement to have
> them.
>
> If user space want's to use struct timespec on 32bit nevertheless in the
> programm for a new syscall, which is obviously stupid in the context of
> Y2038, then it's a user space problem to convert back and forth between
> the two data types.
>
> Fix LTP to be Y2038 safe instead.
Thanks a lot for your suggestion, will check it.
>
> Thanks,
>
> tglx
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2023-12-01 6:49 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-23 5:31 [PATCH v1] futex: Add compat_sys_futex_waitv for 32bit compatibility Wei Gao
2023-11-23 16:09 ` André Almeida
2023-11-27 12:15 ` Wei Gao
2023-11-29 18:56 ` André Almeida
2023-12-01 6:39 ` Wei Gao
2023-11-24 13:19 ` kernel test robot
2023-11-29 20:54 ` Thomas Gleixner
2023-12-01 6:49 ` Wei Gao
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.