Module Name: src Committed By: thorpej Date: Sun May 3 01:06:56 UTC 2020
Modified Files: src/sys/compat/linux/arch/alpha: files.linux_alpha src/sys/compat/linux/arch/amd64: linux_commons.c src/sys/compat/linux/arch/arm: linux_commons.c src/sys/compat/linux/arch/i386: linux_commons.c src/sys/compat/linux/arch/m68k: files.linux_m68k src/sys/compat/linux/arch/mips: files.linux_mips src/sys/compat/linux/arch/powerpc: files.linux_powerpc src/sys/compat/linux/common: linux_exec.c linux_misc.c linux_misc.h src/sys/compat/linux32/common: linux32_misc.c Removed Files: src/sys/compat/linux/common: linux_futex.c Log Message: Always clear FUTEX_PRIVATE_FLAG for Linux processes. NetBSD-native futexes exist in different namespace depending on FUTEX_PRIVATE_FLAG. This appears not to be the case in Linux, and some futex users will mix private and non- private ops on the same futex object. Provide a convenience wrapper that puts this logic in one place witn a comment explaining why. While here, move the Linux futex wrapper out of its own file and plop it in linux_misc.c, which is where it lives in the linux32 module. To generate a diff of this commit: cvs rdiff -u -r1.10 -r1.11 src/sys/compat/linux/arch/alpha/files.linux_alpha cvs rdiff -u -r1.11 -r1.12 src/sys/compat/linux/arch/amd64/linux_commons.c cvs rdiff -u -r1.12 -r1.13 src/sys/compat/linux/arch/arm/linux_commons.c cvs rdiff -u -r1.16 -r1.17 src/sys/compat/linux/arch/i386/linux_commons.c cvs rdiff -u -r1.7 -r1.8 src/sys/compat/linux/arch/m68k/files.linux_m68k cvs rdiff -u -r1.7 -r1.8 src/sys/compat/linux/arch/mips/files.linux_mips cvs rdiff -u -r1.11 -r1.12 \ src/sys/compat/linux/arch/powerpc/files.linux_powerpc cvs rdiff -u -r1.123 -r1.124 src/sys/compat/linux/common/linux_exec.c cvs rdiff -u -r1.40 -r0 src/sys/compat/linux/common/linux_futex.c cvs rdiff -u -r1.248 -r1.249 src/sys/compat/linux/common/linux_misc.c cvs rdiff -u -r1.25 -r1.26 src/sys/compat/linux/common/linux_misc.h cvs rdiff -u -r1.29 -r1.30 src/sys/compat/linux32/common/linux32_misc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/compat/linux/arch/alpha/files.linux_alpha diff -u src/sys/compat/linux/arch/alpha/files.linux_alpha:1.10 src/sys/compat/linux/arch/alpha/files.linux_alpha:1.11 --- src/sys/compat/linux/arch/alpha/files.linux_alpha:1.10 Sun Mar 24 16:24:19 2019 +++ src/sys/compat/linux/arch/alpha/files.linux_alpha Sun May 3 01:06:55 2020 @@ -1,4 +1,4 @@ -# $NetBSD: files.linux_alpha,v 1.10 2019/03/24 16:24:19 maxv Exp $ +# $NetBSD: files.linux_alpha,v 1.11 2020/05/03 01:06:55 thorpej Exp $ # # Config file description for alpha-dependent Linux compat code. @@ -9,6 +9,5 @@ file compat/linux/arch/alpha/linux_sysca file compat/linux/arch/alpha/linux_sysent.c compat_linux file compat/linux/common/linux_fadvise64.c compat_linux file compat/linux/common/linux_file64.c compat_linux -file compat/linux/common/linux_futex.c compat_linux file compat/linux/common/linux_olduname.c compat_linux file compat/linux/common/linux_sigaction.c compat_linux Index: src/sys/compat/linux/arch/amd64/linux_commons.c diff -u src/sys/compat/linux/arch/amd64/linux_commons.c:1.11 src/sys/compat/linux/arch/amd64/linux_commons.c:1.12 --- src/sys/compat/linux/arch/amd64/linux_commons.c:1.11 Mon May 30 17:50:31 2011 +++ src/sys/compat/linux/arch/amd64/linux_commons.c Sun May 3 01:06:55 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_commons.c,v 1.11 2011/05/30 17:50:31 alnsn Exp $ */ +/* $NetBSD: linux_commons.c,v 1.12 2020/05/03 01:06:55 thorpej Exp $ */ /* * This file includes C files from the common @@ -13,7 +13,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: linux_commons.c,v 1.11 2011/05/30 17:50:31 alnsn Exp $"); +__KERNEL_RCSID(1, "$NetBSD: linux_commons.c,v 1.12 2020/05/03 01:06:55 thorpej Exp $"); #if defined(_KERNEL_OPT) #include "opt_sysv.h" @@ -35,5 +35,4 @@ __KERNEL_RCSID(1, "$NetBSD: linux_common #include "../../common/linux_file64.c" #include "../../common/linux_misc_notalpha.c" #include "../../common/linux_sig_notalpha.c" -#include "../../common/linux_futex.c" #include "../../common/linux_fadvise64.c" Index: src/sys/compat/linux/arch/arm/linux_commons.c diff -u src/sys/compat/linux/arch/arm/linux_commons.c:1.12 src/sys/compat/linux/arch/arm/linux_commons.c:1.13 --- src/sys/compat/linux/arch/arm/linux_commons.c:1.12 Tue May 31 22:35:22 2011 +++ src/sys/compat/linux/arch/arm/linux_commons.c Sun May 3 01:06:55 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_commons.c,v 1.12 2011/05/31 22:35:22 njoly Exp $ */ +/* $NetBSD: linux_commons.c,v 1.13 2020/05/03 01:06:55 thorpej Exp $ */ /* * This file includes C files from the common @@ -13,7 +13,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: linux_commons.c,v 1.12 2011/05/31 22:35:22 njoly Exp $"); +__KERNEL_RCSID(1, "$NetBSD: linux_commons.c,v 1.13 2020/05/03 01:06:55 thorpej Exp $"); #if defined(_KERNEL_OPT) #include "opt_sysv.h" @@ -38,5 +38,4 @@ __KERNEL_RCSID(1, "$NetBSD: linux_common #include "../../common/linux_olduname.c" #include "../../common/linux_oldolduname.c" #include "../../common/linux_uid16.c" -#include "../../common/linux_futex.c" #include "../../common/linux_fadvise64_64.c" Index: src/sys/compat/linux/arch/i386/linux_commons.c diff -u src/sys/compat/linux/arch/i386/linux_commons.c:1.16 src/sys/compat/linux/arch/i386/linux_commons.c:1.17 --- src/sys/compat/linux/arch/i386/linux_commons.c:1.16 Tue May 31 22:35:22 2011 +++ src/sys/compat/linux/arch/i386/linux_commons.c Sun May 3 01:06:56 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_commons.c,v 1.16 2011/05/31 22:35:22 njoly Exp $ */ +/* $NetBSD: linux_commons.c,v 1.17 2020/05/03 01:06:56 thorpej Exp $ */ /* * This file includes C files from the common @@ -13,7 +13,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: linux_commons.c,v 1.16 2011/05/31 22:35:22 njoly Exp $"); +__KERNEL_RCSID(1, "$NetBSD: linux_commons.c,v 1.17 2020/05/03 01:06:56 thorpej Exp $"); #if defined(_KERNEL_OPT) #include "opt_sysv.h" @@ -25,7 +25,6 @@ __KERNEL_RCSID(1, "$NetBSD: linux_common #include <sys/syscallargs.h> #include "../../common/linux_pipe.c" -#include "../../common/linux_futex.c" #include "../../common/linux_file64.c" #include "../../common/linux_fcntl64.c" #include "../../common/linux_ipccall.c" Index: src/sys/compat/linux/arch/m68k/files.linux_m68k diff -u src/sys/compat/linux/arch/m68k/files.linux_m68k:1.7 src/sys/compat/linux/arch/m68k/files.linux_m68k:1.8 --- src/sys/compat/linux/arch/m68k/files.linux_m68k:1.7 Tue Dec 24 13:41:25 2013 +++ src/sys/compat/linux/arch/m68k/files.linux_m68k Sun May 3 01:06:56 2020 @@ -1,4 +1,4 @@ -# $NetBSD: files.linux_m68k,v 1.7 2013/12/24 13:41:25 njoly Exp $ +# $NetBSD: files.linux_m68k,v 1.8 2020/05/03 01:06:56 thorpej Exp $ # # Config file description for m68k-dependent Linux compat code. @@ -18,7 +18,6 @@ file compat/linux/common/linux_llseek.c file compat/linux/common/linux_oldmmap.c compat_linux file compat/linux/common/linux_oldselect.c compat_linux file compat/linux/common/linux_uid16.c compat_linux -file compat/linux/common/linux_futex.c compat_linux file compat/linux/common/linux_fadvise64.c compat_linux file compat/linux/common/linux_fadvise64_64.c compat_linux file compat/linux/common/linux_fcntl64.c compat_linux Index: src/sys/compat/linux/arch/mips/files.linux_mips diff -u src/sys/compat/linux/arch/mips/files.linux_mips:1.7 src/sys/compat/linux/arch/mips/files.linux_mips:1.8 --- src/sys/compat/linux/arch/mips/files.linux_mips:1.7 Mon May 30 17:50:32 2011 +++ src/sys/compat/linux/arch/mips/files.linux_mips Sun May 3 01:06:56 2020 @@ -1,4 +1,4 @@ -# $NetBSD: files.linux_mips,v 1.7 2011/05/30 17:50:32 alnsn Exp $ +# $NetBSD: files.linux_mips,v 1.8 2020/05/03 01:06:56 thorpej Exp $ # # Config file description for mips-dependent Linux compat code. @@ -17,5 +17,4 @@ file compat/linux/common/linux_llseek.c file compat/linux/common/linux_olduname.c compat_linux file compat/linux/common/linux_file64.c compat_linux file compat/linux/common/linux_fcntl64.c compat_linux -file compat/linux/common/linux_futex.c compat_linux file compat/linux/common/linux_fadvise64.c compat_linux Index: src/sys/compat/linux/arch/powerpc/files.linux_powerpc diff -u src/sys/compat/linux/arch/powerpc/files.linux_powerpc:1.11 src/sys/compat/linux/arch/powerpc/files.linux_powerpc:1.12 --- src/sys/compat/linux/arch/powerpc/files.linux_powerpc:1.11 Mon May 30 17:50:32 2011 +++ src/sys/compat/linux/arch/powerpc/files.linux_powerpc Sun May 3 01:06:56 2020 @@ -1,4 +1,4 @@ -# $NetBSD: files.linux_powerpc,v 1.11 2011/05/30 17:50:32 alnsn Exp $ +# $NetBSD: files.linux_powerpc,v 1.12 2020/05/03 01:06:56 thorpej Exp $ # # Config file description for powerpc-dependent Linux compat code. @@ -18,6 +18,5 @@ file compat/linux/common/linux_llseek.c file compat/linux/common/linux_olduname.c compat_linux file compat/linux/common/linux_file64.c compat_linux file compat/linux/common/linux_fcntl64.c compat_linux -file compat/linux/common/linux_futex.c compat_linux file compat/linux/common/linux_fadvise64.c compat_linux file compat/linux/common/linux_fadvise64_64.c compat_linux Index: src/sys/compat/linux/common/linux_exec.c diff -u src/sys/compat/linux/common/linux_exec.c:1.123 src/sys/compat/linux/common/linux_exec.c:1.124 --- src/sys/compat/linux/common/linux_exec.c:1.123 Sun Apr 26 18:53:33 2020 +++ src/sys/compat/linux/common/linux_exec.c Sun May 3 01:06:56 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_exec.c,v 1.123 2020/04/26 18:53:33 thorpej Exp $ */ +/* $NetBSD: linux_exec.c,v 1.124 2020/05/03 01:06:56 thorpej Exp $ */ /*- * Copyright (c) 1994, 1995, 1998, 2000, 2007, 2008, 2020 @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_exec.c,v 1.123 2020/04/26 18:53:33 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_exec.c,v 1.124 2020/05/03 01:06:56 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -61,6 +61,7 @@ __KERNEL_RCSID(0, "$NetBSD: linux_exec.c #include <compat/linux/common/linux_util.h> #include <compat/linux/common/linux_sched.h> #include <compat/linux/common/linux_machdep.h> +#include <compat/linux/common/linux_misc.h> #include <compat/linux/common/linux_exec.h> #include <compat/linux/common/linux_ipc.h> #include <compat/linux/common/linux_sem.h> @@ -181,7 +182,7 @@ linux_e_lwp_exit(struct lwp *l) printf("%s: cannot clear TID\n", __func__); #endif - error = do_futex((int *)led->led_clear_tid, FUTEX_WAKE, + error = linux_do_futex((int *)led->led_clear_tid, FUTEX_WAKE, INT_MAX, NULL, NULL, 0, 0, &retval); if (error) printf("%s: linux_sys_futex failed\n", __func__); Index: src/sys/compat/linux/common/linux_misc.c diff -u src/sys/compat/linux/common/linux_misc.c:1.248 src/sys/compat/linux/common/linux_misc.c:1.249 --- src/sys/compat/linux/common/linux_misc.c:1.248 Sun Apr 19 20:31:59 2020 +++ src/sys/compat/linux/common/linux_misc.c Sun May 3 01:06:56 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_misc.c,v 1.248 2020/04/19 20:31:59 thorpej Exp $ */ +/* $NetBSD: linux_misc.c,v 1.249 2020/05/03 01:06:56 thorpej Exp $ */ /*- * Copyright (c) 1995, 1998, 1999, 2008 The NetBSD Foundation, Inc. @@ -57,7 +57,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.248 2020/04/19 20:31:59 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.249 2020/05/03 01:06:56 thorpej Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -93,6 +93,7 @@ __KERNEL_RCSID(0, "$NetBSD: linux_misc.c #include <sys/swap.h> /* for SWAP_ON */ #include <sys/sysctl.h> /* for KERN_DOMAINNAME */ #include <sys/kauth.h> +#include <sys/futex.h> #include <sys/ptrace.h> #include <machine/ptrace.h> @@ -1517,3 +1518,59 @@ linux_sys_utimensat(struct lwp *l, const return linux_do_sys_utimensat(l, SCARG(uap, fd), SCARG(uap, path), tsp, SCARG(uap, flag), retval); } + +int +linux_sys_futex(struct lwp *l, const struct linux_sys_futex_args *uap, + register_t *retval) +{ + /* { + syscallarg(int *) uaddr; + syscallarg(int) op; + syscallarg(int) val; + syscallarg(const struct linux_timespec *) timeout; + syscallarg(int *) uaddr2; + syscallarg(int) val3; + } */ + struct linux_timespec lts; + struct timespec ts, *tsp = NULL; + int val2 = 0; + int error; + + /* + * Linux overlays the "timeout" field and the "val2" field. + * "timeout" is only valid for FUTEX_WAIT and FUTEX_WAIT_BITSET + * on Linux. + */ + const int op = (SCARG(uap, op) & FUTEX_CMD_MASK); + if ((op == FUTEX_WAIT || op == FUTEX_WAIT_BITSET) && + SCARG(uap, timeout) != NULL) { + if ((error = copyin(SCARG(uap, timeout), + <s, sizeof(lts))) != 0) { + return error; + } + linux_to_native_timespec(&ts, <s); + tsp = &ts; + } else { + val2 = (int)(uintptr_t)SCARG(uap, timeout); + } + + return linux_do_futex(SCARG(uap, uaddr), SCARG(uap, op), + SCARG(uap, val), tsp, SCARG(uap, uaddr2), val2, + SCARG(uap, val3), retval); +} + +int +linux_do_futex(int *uaddr, int op, int val, struct timespec *timeout, + int *uaddr2, int val2, int val3, register_t *retval) +{ + /* + * Always clear FUTEX_PRIVATE_FLAG for Linux processes. + * NetBSD-native futexes exist in different namespace + * depending on FUTEX_PRIVATE_FLAG. This appears not + * to be the case in Linux, and some futex users will + * mix private and non-private ops on the same futex + * object. + */ + return do_futex(uaddr, op & ~FUTEX_PRIVATE_FLAG, + val, timeout, uaddr2, val2, val3, retval); +} Index: src/sys/compat/linux/common/linux_misc.h diff -u src/sys/compat/linux/common/linux_misc.h:1.25 src/sys/compat/linux/common/linux_misc.h:1.26 --- src/sys/compat/linux/common/linux_misc.h:1.25 Wed Aug 31 08:12:44 2016 +++ src/sys/compat/linux/common/linux_misc.h Sun May 3 01:06:56 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_misc.h,v 1.25 2016/08/31 08:12:44 njoly Exp $ */ +/* $NetBSD: linux_misc.h,v 1.26 2020/05/03 01:06:56 thorpej Exp $ */ /*- * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -148,6 +148,8 @@ int linux_select1(struct lwp *, register fd_set *, struct linux_timeval *); int linux_do_sys_utimensat(struct lwp *, int, const char *, struct timespec *, int, register_t *); +int linux_do_futex(int *, int, int, struct timespec *, int *, int, int, + register_t *); __END_DECLS #endif /* !_KERNEL */ Index: src/sys/compat/linux32/common/linux32_misc.c diff -u src/sys/compat/linux32/common/linux32_misc.c:1.29 src/sys/compat/linux32/common/linux32_misc.c:1.30 --- src/sys/compat/linux32/common/linux32_misc.c:1.29 Wed Apr 29 01:44:03 2020 +++ src/sys/compat/linux32/common/linux32_misc.c Sun May 3 01:06:56 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: linux32_misc.c,v 1.29 2020/04/29 01:44:03 thorpej Exp $ */ +/* $NetBSD: linux32_misc.c,v 1.30 2020/05/03 01:06:56 thorpej Exp $ */ /*- * Copyright (c) 1995, 1998, 1999 The NetBSD Foundation, Inc. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: linux32_misc.c,v 1.29 2020/04/29 01:44:03 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux32_misc.c,v 1.30 2020/05/03 01:06:56 thorpej Exp $"); #include <sys/param.h> #include <sys/proc.h> @@ -266,7 +266,7 @@ linux32_sys_futex(struct lwp *l, val2 = (int)(uintptr_t)SCARG_P32(uap, timeout); } - return do_futex(SCARG_P32(uap, uaddr), SCARG(uap, op), + return linux_do_futex(SCARG_P32(uap, uaddr), SCARG(uap, op), SCARG(uap, val), tsp, SCARG_P32(uap, uaddr2), val2, SCARG(uap, val3), retval); }