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);
}