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), 
+		    &lts, sizeof(lts))) != 0) {
+			return error;
+		}
+		linux_to_native_timespec(&ts, &lts);
+		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);
 }

Reply via email to