Source-Changes-HG archive

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

[src/thorpej-futex]: src/sys/compat/linux/common Re-factor the code that maps...



details:   https://anonhg.NetBSD.org/src/rev/c2c4e43a75db
branches:  thorpej-futex
changeset: 1024927:c2c4e43a75db
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Thu Dec 17 02:52:40 2020 +0000

description:
Re-factor the code that maps the clockid_t in timer_create() and
the flags in timerfd_settime() into separate functions.

diffstat:

 sys/compat/linux/common/linux_sched.h |   6 ++-
 sys/compat/linux/common/linux_time.c  |  70 +++++++++++++++++++++++++----------
 2 files changed, 55 insertions(+), 21 deletions(-)

diffs (141 lines):

diff -r 1242aea1ec8b -r c2c4e43a75db sys/compat/linux/common/linux_sched.h
--- a/sys/compat/linux/common/linux_sched.h     Wed Dec 16 03:08:01 2020 +0000
+++ b/sys/compat/linux/common/linux_sched.h     Thu Dec 17 02:52:40 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: linux_sched.h,v 1.8.64.1 2020/12/15 14:07:21 thorpej Exp $     */
+/*     $NetBSD: linux_sched.h,v 1.8.64.2 2020/12/17 02:52:40 thorpej Exp $     */
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -104,4 +104,8 @@
 void   linux_to_native_itimerspec(struct itimerspec *,
            const struct linux_itimerspec *);
 
+int    linux_to_native_timer_create_clockid(clockid_t *, clockid_t);
+
+int     linux_to_native_timerfd_settime_flags(int *, int);
+
 #endif /* _LINUX_SCHED_H */
diff -r 1242aea1ec8b -r c2c4e43a75db sys/compat/linux/common/linux_time.c
--- a/sys/compat/linux/common/linux_time.c      Wed Dec 16 03:08:01 2020 +0000
+++ b/sys/compat/linux/common/linux_time.c      Thu Dec 17 02:52:40 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: linux_time.c,v 1.39.16.1 2020/12/15 14:07:21 thorpej Exp $ */
+/*     $NetBSD: linux_time.c,v 1.39.16.2 2020/12/17 02:52:40 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2001, 2020 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_time.c,v 1.39.16.1 2020/12/15 14:07:21 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_time.c,v 1.39.16.2 2020/12/17 02:52:40 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/ucred.h>
@@ -319,18 +319,12 @@
 }
 
 int
-linux_sys_timer_create(struct lwp *l,
-    const struct linux_sys_timer_create_args *uap, register_t *retval)
+linux_to_native_timer_create_clockid(clockid_t *nid, clockid_t lid)
 {
-       /* {
-               syscallarg(clockid_t) clockid;
-               syscallarg(struct linux_sigevent *) evp;
-               syscallarg(timer_t *) timerid;
-       } */
        clockid_t id;
        int error;
 
-       error = linux_to_native_clockid(&id, SCARG(uap, clockid));
+       error = linux_to_native_clockid(&id, lid);
        if (error == 0) {
                /*
                 * We can't create a timer with every sort of clock ID
@@ -351,6 +345,26 @@
                default:
                        return ENOTSUP;
                }
+               *nid = id;
+       }
+
+       return error;
+}
+
+int
+linux_sys_timer_create(struct lwp *l,
+    const struct linux_sys_timer_create_args *uap, register_t *retval)
+{
+       /* {
+               syscallarg(clockid_t) clockid;
+               syscallarg(struct linux_sigevent *) evp;
+               syscallarg(timer_t *) timerid;
+       } */
+       clockid_t id;
+       int error;
+
+       error = linux_to_native_timer_create_clockid(&id, SCARG(uap, clockid));
+       if (error == 0) {
                error = timer_create1(SCARG(uap, timerid), id,
                    (void *)SCARG(uap, evp), linux_sigevent_copyin, l);
        }
@@ -483,6 +497,27 @@
 }
 
 int
+linux_to_native_timerfd_settime_flags(int *nflagsp, int lflags)
+{
+       int nflags = 0;
+
+       if (lflags & ~(LINUX_TFD_TIMER_ABSTIME |
+                      LINUX_TFD_TIMER_CANCEL_ON_SET)) {
+               return EINVAL;
+       }
+       if (lflags & LINUX_TFD_TIMER_ABSTIME) {
+               nflags |= TFD_TIMER_ABSTIME;
+       }
+       if (lflags & LINUX_TFD_TIMER_CANCEL_ON_SET) {
+               nflags |= TFD_TIMER_CANCEL_ON_SET;
+       }
+
+       *nflagsp = nflags;
+
+       return 0;
+}
+
+int
 linux_sys_timerfd_settime(struct lwp *l,
     const struct linux_sys_timerfd_settime_args *uap, register_t *retval)
 {
@@ -494,7 +529,7 @@
        } */
        struct itimerspec nits, oits, *oitsp = NULL;
        struct linux_itimerspec lits;
-       int nflags = 0;
+       int nflags;
        int error;
 
        error = copyin(SCARG(uap, new_value), &lits, sizeof(lits));
@@ -503,15 +538,10 @@
        }
        linux_to_native_itimerspec(&nits, &lits);
 
-       if (SCARG(uap, flags) & ~(LINUX_TFD_TIMER_ABSTIME |
-                                 LINUX_TFD_TIMER_CANCEL_ON_SET)) {
-               return EINVAL;
-       }
-       if (SCARG(uap, flags) & LINUX_TFD_TIMER_ABSTIME) {
-               nflags |= TFD_TIMER_ABSTIME;
-       }
-       if (SCARG(uap, flags) & LINUX_TFD_TIMER_CANCEL_ON_SET) {
-               nflags |= TFD_TIMER_CANCEL_ON_SET;
+       error = linux_to_native_timerfd_settime_flags(&nflags,
+           SCARG(uap, flags));
+       if (error) {
+               return error;
        }
 
        if (SCARG(uap, old_value)) {



Home | Main Index | Thread Index | Old Index