Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src Add a NetBSD native futex implementation, mostly written by ...



details:   https://anonhg.NetBSD.org/src/rev/f4ca71f9e254
branches:  trunk
changeset: 971520:f4ca71f9e254
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Sun Apr 26 18:53:31 2020 +0000

description:
Add a NetBSD native futex implementation, mostly written by riastradh@.
Map the COMPAT_LINUX futex calls to the native ones.

diffstat:

 distrib/sets/lists/comp/mi                    |     3 +-
 distrib/sets/lists/tests/mi                   |     4 +-
 lib/libc/include/futex_private.h              |    64 +
 sys/compat/linux/arch/alpha/syscalls.master   |    16 +-
 sys/compat/linux/arch/amd64/syscalls.master   |    16 +-
 sys/compat/linux/arch/arm/syscalls.master     |    16 +-
 sys/compat/linux/arch/i386/syscalls.master    |    11 +-
 sys/compat/linux/arch/m68k/syscalls.master    |    16 +-
 sys/compat/linux/arch/mips/syscalls.master    |    16 +-
 sys/compat/linux/arch/powerpc/syscalls.master |    16 +-
 sys/compat/linux/common/linux_emuldata.h      |     5 +-
 sys/compat/linux/common/linux_exec.c          |    34 +-
 sys/compat/linux/common/linux_futex.c         |   776 +---------
 sys/compat/linux/common/linux_futex.h         |    93 -
 sys/compat/linux/common/linux_mod.c           |     7 +-
 sys/compat/linux32/arch/amd64/syscalls.master |    15 +-
 sys/compat/linux32/common/linux32_misc.c      |    70 +-
 sys/compat/netbsd32/files.netbsd32            |     3 +-
 sys/compat/netbsd32/netbsd32_futex.c          |   134 +
 sys/compat/netbsd32/syscalls.master           |     9 +-
 sys/kern/files.kern                           |     3 +-
 sys/kern/init_main.c                          |     7 +-
 sys/kern/kern_lwp.c                           |    14 +-
 sys/kern/kern_proc.c                          |    11 +-
 sys/kern/sys_futex.c                          |  1977 +++++++++++++++++++++++++
 sys/kern/syscalls.master                      |     9 +-
 sys/sys/Makefile                              |     4 +-
 sys/sys/futex.h                               |   186 ++
 sys/sys/lwp.h                                 |     4 +-
 tests/lib/libc/sys/Makefile                   |     7 +-
 tests/lib/libc/sys/t_futex_ops.c              |  1294 ++++++++++++++++
 tests/lib/libc/sys/t_futex_robust.c           |   408 +++++
 32 files changed, 4257 insertions(+), 991 deletions(-)

diffs (truncated from 5810 to 300 lines):

diff -r b48e563ebe59 -r f4ca71f9e254 distrib/sets/lists/comp/mi
--- a/distrib/sets/lists/comp/mi        Sun Apr 26 17:00:31 2020 +0000
+++ b/distrib/sets/lists/comp/mi        Sun Apr 26 18:53:31 2020 +0000
@@ -1,4 +1,4 @@
-#      $NetBSD: mi,v 1.2321 2020/04/04 19:26:51 christos Exp $
+#      $NetBSD: mi,v 1.2322 2020/04/26 18:53:31 thorpej Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 ./etc/mtree/set.comp                           comp-sys-root
@@ -3059,6 +3059,7 @@
 ./usr/include/sys/float_ieee754.h              comp-c-include
 ./usr/include/sys/fnv_hash.h                   comp-obsolete           obsolete
 ./usr/include/sys/fstypes.h                    comp-c-include
+./usr/include/sys/futex.h                      comp-c-include
 ./usr/include/sys/gcq.h                                comp-c-include
 ./usr/include/sys/gmon.h                       comp-c-include
 ./usr/include/sys/gpio.h                       comp-c-include
diff -r b48e563ebe59 -r f4ca71f9e254 distrib/sets/lists/tests/mi
--- a/distrib/sets/lists/tests/mi       Sun Apr 26 17:00:31 2020 +0000
+++ b/distrib/sets/lists/tests/mi       Sun Apr 26 18:53:31 2020 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.836 2020/04/19 13:22:58 maxv Exp $
+# $NetBSD: mi,v 1.837 2020/04/26 18:53:32 thorpej Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 #
@@ -3120,6 +3120,8 @@
 ./usr/tests/lib/libc/sys/t_dup                 tests-lib-tests         compattestfile,atf
 ./usr/tests/lib/libc/sys/t_fork                        tests-lib-tests         compattestfile,atf
 ./usr/tests/lib/libc/sys/t_fsync               tests-lib-tests         compattestfile,atf
+./usr/tests/lib/libc/sys/t_futex_ops           tests-lib-tests         compattestfile,atf
+./usr/tests/lib/libc/sys/t_futex_robust                tests-lib-tests         compattestfile,atf
 ./usr/tests/lib/libc/sys/t_getcontext          tests-lib-tests         compattestfile,atf
 ./usr/tests/lib/libc/sys/t_getgroups           tests-lib-tests         compattestfile,atf
 ./usr/tests/lib/libc/sys/t_getitimer           tests-lib-tests         compattestfile,atf
diff -r b48e563ebe59 -r f4ca71f9e254 lib/libc/include/futex_private.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/libc/include/futex_private.h  Sun Apr 26 18:53:31 2020 +0000
@@ -0,0 +1,64 @@
+/*     $NetBSD: futex_private.h,v 1.1 2020/04/26 18:53:32 thorpej Exp $        */
+
+/*-
+ * Copyright (c) 2019 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __LIBC_FUTEX_PRIVATE
+#define __LIBC_FUTEX_PRIVATE
+
+#if defined(_LIBC)
+#include "namespace.h"
+#endif
+
+#include <sys/cdefs.h>
+#include <sys/syscall.h>
+#include <sys/futex.h>
+#include <unistd.h>
+
+static inline int __unused
+__futex(volatile int *uaddr, int op, int val, const struct timespec *timeout,
+       volatile int *uaddr2, int val2, int val3)
+{
+       return syscall(SYS___futex, uaddr, op, val, timeout, uaddr2,
+                       val2, val3);
+}
+
+static inline int __unused
+__futex_set_robust_list(void *head, size_t len)
+{
+       return syscall(SYS___futex_set_robust_list, head, len);
+}
+
+static inline int __unused
+__futex_get_robust_list(lwpid_t lwpid, void **headp, size_t *lenp)
+{
+       return syscall(SYS___futex_get_robust_list, lwpid, headp, lenp);
+}
+
+#endif /* __LIBC_FUTEX_PRIVATE */
diff -r b48e563ebe59 -r f4ca71f9e254 sys/compat/linux/arch/alpha/syscalls.master
--- a/sys/compat/linux/arch/alpha/syscalls.master       Sun Apr 26 17:00:31 2020 +0000
+++ b/sys/compat/linux/arch/alpha/syscalls.master       Sun Apr 26 18:53:31 2020 +0000
@@ -1,4 +1,4 @@
-       $NetBSD: syscalls.master,v 1.96 2019/11/09 23:44:31 jdolecek Exp $
+       $NetBSD: syscalls.master,v 1.97 2020/04/26 18:53:32 thorpej Exp $
 ;
 ;      @(#)syscalls.master     8.1 (Berkeley) 7/19/93
 
@@ -740,11 +740,15 @@
                            struct linux_timespec *timeout, \
                            linux_sigset_t *sigset); }
 465    UNIMPL          unshare
-466    STD             { int|linux_sys||set_robust_list( \
-                           struct linux_robust_list_head *head, size_t len); }
-467    STD             { int|linux_sys||get_robust_list(int pid, \
-                           struct linux_robust_list_head **head, \
-                           size_t *len); }
+                       ;
+                       ; The NetBSD native robust list calls have different
+                       ; argument names / types, but they are ABI-compatible
+                       ; with Linux.
+                       ;
+466    NOARGS          { int|sys||__futex_set_robust_list(void *head, \
+                           size_t len); }
+467    NOARGS          { int|sys||__futex_get_robust_list(lwpid_t lwpid, \
+                           void **headp, size_t *lenp); }
 468    UNIMPL          splice
 469    UNIMPL          sync_file_range
 470    UNIMPL          tee
diff -r b48e563ebe59 -r f4ca71f9e254 sys/compat/linux/arch/amd64/syscalls.master
--- a/sys/compat/linux/arch/amd64/syscalls.master       Sun Apr 26 17:00:31 2020 +0000
+++ b/sys/compat/linux/arch/amd64/syscalls.master       Sun Apr 26 18:53:31 2020 +0000
@@ -1,4 +1,4 @@
-       $NetBSD: syscalls.master,v 1.61 2019/11/09 23:44:31 jdolecek Exp $
+       $NetBSD: syscalls.master,v 1.62 2020/04/26 18:53:32 thorpej Exp $
 
 ;      @(#)syscalls.master     8.1 (Berkeley) 7/19/93
 
@@ -497,11 +497,15 @@
                            struct linux_timespec *timeout, \
                            linux_sigset_t *sigset); }
 272    UNIMPL          unshare
-273    STD             { int|linux_sys||set_robust_list( \
-                           struct linux_robust_list_head *head, size_t len); }
-274    STD             { int|linux_sys||get_robust_list(int pid, \
-                           struct linux_robust_list_head **head, \
-                           size_t *len); }
+                       ;
+                       ; The NetBSD native robust list calls have different
+                       ; argument names / types, but they are ABI-compatible
+                       ; with Linux.
+                       ;
+273    NOARGS          { int|sys||__futex_set_robust_list(void *head, \
+                           size_t len); }
+274    NOARGS          { int|sys||__futex_get_robust_list(lwpid_t lwpid, \
+                           void **headp, size_t *lenp); }
 275    UNIMPL          splice
 276    UNIMPL          tee
 277    UNIMPL          sync_file_range
diff -r b48e563ebe59 -r f4ca71f9e254 sys/compat/linux/arch/arm/syscalls.master
--- a/sys/compat/linux/arch/arm/syscalls.master Sun Apr 26 17:00:31 2020 +0000
+++ b/sys/compat/linux/arch/arm/syscalls.master Sun Apr 26 18:53:31 2020 +0000
@@ -1,4 +1,4 @@
-       $NetBSD: syscalls.master,v 1.68 2019/11/09 23:44:31 jdolecek Exp $
+       $NetBSD: syscalls.master,v 1.69 2020/04/26 18:53:32 thorpej Exp $
 
 ; Derived from sys/compat/linux/arch/*/syscalls.master
 ; and from Linux 2.4.12 arch/arm/kernel/calls.S
@@ -538,11 +538,15 @@
                            struct linux_timespec *timeout, \
                            linux_sigset_t *sigset); }
 337    UNIMPL          unshare
-338    STD             { int|linux_sys||set_robust_list( \
-                           struct linux_robust_list_head *head, size_t len); }
-339    STD             { int|linux_sys||get_robust_list(int pid, \
-                           struct linux_robust_list_head **head, \
-                           size_t *len); }
+                       ;
+                       ; The NetBSD native robust list calls have different
+                       ; argument names / types, but they are ABI-compatible
+                       ; with Linux.
+                       ;
+338    NOARGS          { int|sys||__futex_set_robust_list(void *head, \
+                           size_t len); }
+339    NOARGS          { int|sys||__futex_get_robust_list(lwpid_t lwpid, \
+                           void **headp, size_t *lenp); }
 340    UNIMPL          splice
 341    UNIMPL          sync_file_range2
 342    UNIMPL          tee
diff -r b48e563ebe59 -r f4ca71f9e254 sys/compat/linux/arch/i386/syscalls.master
--- a/sys/compat/linux/arch/i386/syscalls.master        Sun Apr 26 17:00:31 2020 +0000
+++ b/sys/compat/linux/arch/i386/syscalls.master        Sun Apr 26 18:53:31 2020 +0000
@@ -1,4 +1,4 @@
-       $NetBSD: syscalls.master,v 1.123 2019/11/09 23:44:32 jdolecek Exp $
+       $NetBSD: syscalls.master,v 1.124 2020/04/26 18:53:32 thorpej Exp $
 
 ;      @(#)syscalls.master     8.1 (Berkeley) 7/19/93
 
@@ -511,11 +511,10 @@
                            struct linux_timespec *timeout, \
                            linux_sigset_t *sigset); }
 310    UNIMPL          unshare
-311    STD             { int|linux_sys||set_robust_list( \
-                           struct linux_robust_list_head *head, size_t len); }
-312    STD             { int|linux_sys||get_robust_list(int pid, \
-                           struct linux_robust_list_head **head, \
-                           size_t *len); }
+311    NOARGS          { int|sys||__futex_set_robust_list(void *head, \
+                           size_t len); }
+312    NOARGS          { int|sys||__futex_get_robust_list(lwpid_t lwpid, \
+                           void **headp, size_t *lenp); }
 313    UNIMPL          splice
 314    UNIMPL          sync_file_range
 315    UNIMPL          tee
diff -r b48e563ebe59 -r f4ca71f9e254 sys/compat/linux/arch/m68k/syscalls.master
--- a/sys/compat/linux/arch/m68k/syscalls.master        Sun Apr 26 17:00:31 2020 +0000
+++ b/sys/compat/linux/arch/m68k/syscalls.master        Sun Apr 26 18:53:31 2020 +0000
@@ -1,4 +1,4 @@
-       $NetBSD: syscalls.master,v 1.94 2019/11/09 23:44:32 jdolecek Exp $
+       $NetBSD: syscalls.master,v 1.95 2020/04/26 18:53:32 thorpej Exp $
 
 ;      @(#)syscalls.master     8.1 (Berkeley) 7/19/93
 
@@ -519,11 +519,15 @@
                            struct linux_timespec *timeout, \
                            linux_sigset_t *sigset); }
 303    UNIMPL          unshare
-304    STD             { int|linux_sys||set_robust_list( \
-                           struct linux_robust_list_head *head, size_t len); }
-305    STD             { int|linux_sys||get_robust_list(int pid, \
-                           struct linux_robust_list_head **head, \
-                           size_t *len); }
+                       ;
+                       ; The NetBSD native robust list calls have different
+                       ; argument names / types, but they are ABI-compatible
+                       ; with Linux.
+                       ;
+304    NOARGS          { int|sys||__futex_set_robust_list(void *head, \
+                           size_t len); }
+305    NOARGS          { int|sys||__futex_get_robust_list(lwpid_t lwpid, \
+                           void **headp, size_t *lenp); }
 306    UNIMPL          splice
 307    UNIMPL          sync_file_range
 308    UNIMPL          tee
diff -r b48e563ebe59 -r f4ca71f9e254 sys/compat/linux/arch/mips/syscalls.master
--- a/sys/compat/linux/arch/mips/syscalls.master        Sun Apr 26 17:00:31 2020 +0000
+++ b/sys/compat/linux/arch/mips/syscalls.master        Sun Apr 26 18:53:31 2020 +0000
@@ -1,4 +1,4 @@
-       $NetBSD: syscalls.master,v 1.67 2019/11/09 23:44:32 jdolecek Exp $  
+       $NetBSD: syscalls.master,v 1.68 2020/04/26 18:53:32 thorpej Exp $  
 
 ;      @(#)syscalls.master     8.1 (Berkeley) 7/19/93
 
@@ -514,11 +514,15 @@
 306    UNIMPL          tee
 307    UNIMPL          vmsplice
 308    UNIMPL          move_pages
-309    STD             { int|linux_sys||set_robust_list( \
-                           struct linux_robust_list_head *head, size_t len); }
-310    STD             { int|linux_sys||get_robust_list(int pid, \
-                           struct linux_robust_list_head **head, \
-                           size_t *len); }
+                       ;
+                       ; The NetBSD native robust list calls have different
+                       ; argument names / types, but they are ABI-compatible
+                       ; with Linux.
+                       ;
+309    NOARGS          { int|sys||__futex_set_robust_list(void *head, \
+                           size_t len); }
+310    NOARGS          { int|sys||__futex_get_robust_list(lwpid_t lwpid, \
+                           void **headp, size_t *lenp); }
 311    UNIMPL          kexec_load
 312    UNIMPL          getcpu
 313    UNIMPL          epoll_pwait
diff -r b48e563ebe59 -r f4ca71f9e254 sys/compat/linux/arch/powerpc/syscalls.master
--- a/sys/compat/linux/arch/powerpc/syscalls.master     Sun Apr 26 17:00:31 2020 +0000
+++ b/sys/compat/linux/arch/powerpc/syscalls.master     Sun Apr 26 18:53:31 2020 +0000
@@ -1,4 +1,4 @@
-       $NetBSD: syscalls.master,v 1.73 2019/11/09 23:44:32 jdolecek Exp $  
+       $NetBSD: syscalls.master,v 1.74 2020/04/26 18:53:32 thorpej Exp $  
 
 ;      @(#)syscalls.master     8.1 (Berkeley) 7/19/93
 
@@ -514,11 +514,15 @@
                            linux_umode_t mode); }
 298    STD             { int|linux_sys||faccessat(int fd, const char *path, \
                            int amode); }
-299    STD             { int|linux_sys||set_robust_list( \
-                           struct linux_robust_list_head *head, size_t len); }
-300    STD             { int|linux_sys||get_robust_list(int pid, \
-                           struct linux_robust_list_head **head, \
-                           size_t *len); }
+                       ;
+                       ; The NetBSD native robust list calls have different
+                       ; argument names / types, but they are ABI-compatible
+                       ; with Linux.



Home | Main Index | Thread Index | Old Index