Author: netchild
Date: Mon Nov 22 08:21:58 2010
New Revision: 215661
URL: http://svn.freebsd.org/changeset/base/215661

Log:
  MFC r215338:
    - print out the PID and program name of the program trying to use an
      unsupported futex operation
    - for those futex operations which are known to be not supported,
      print out which futex operation it is
    - shortcut the error return of the unsupported FUTEX_CLOCK_REALTIME in
      some cases:
        FUTEX_CLOCK_REALTIME can be used to tell linux to use
        CLOCK_REALTIME instead of CLOCK_MONOTONIC. FUTEX_CLOCK_REALTIME
        however must only be set, if either FUTEX_WAIT_BITSET or
        FUTEX_WAIT_REQUEUE_PI are set too. If that's not the case
        we can die with ENOSYS right at the beginning.
  
    Submitted by:       arundel
    Reviewed by:        rdivacky (earlier iteration of the patch)
    MFC after:  1 week

Modified:
  stable/8/sys/compat/linux/linux_futex.c
  stable/8/sys/compat/linux/linux_futex.h
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/sys/compat/linux/linux_futex.c
==============================================================================
--- stable/8/sys/compat/linux/linux_futex.c     Mon Nov 22 08:19:18 2010        
(r215660)
+++ stable/8/sys/compat/linux/linux_futex.c     Mon Nov 22 08:21:58 2010        
(r215661)
@@ -428,7 +428,7 @@ futex_atomic_op(struct thread *td, int e
 int
 linux_sys_futex(struct thread *td, struct linux_sys_futex_args *args)
 {
-       int op_ret, val, ret, nrwake;
+       int clockrt, nrwake, op_ret, ret, val;
        struct linux_emuldata *em;
        struct waiting_proc *wp;
        struct futex *f, *f2;
@@ -441,7 +441,19 @@ linux_sys_futex(struct thread *td, struc
         * in most cases (ie. when futexes are not shared on file descriptor
         * or between different processes.).
         */
-       args->op = (args->op & ~LINUX_FUTEX_PRIVATE_FLAG);
+       args->op = args->op & ~LINUX_FUTEX_PRIVATE_FLAG;
+
+       /*
+        * Currently support for switching between CLOCK_MONOTONIC and
+        * CLOCK_REALTIME is not present. However Linux forbids the use of
+        * FUTEX_CLOCK_REALTIME with any op except FUTEX_WAIT_BITSET and
+        * FUTEX_WAIT_REQUEUE_PI.
+        */
+       clockrt = args->op & LINUX_FUTEX_CLOCK_REALTIME;
+       args->op = args->op & ~LINUX_FUTEX_CLOCK_REALTIME;
+       if (clockrt && args->op != LINUX_FUTEX_WAIT_BITSET &&
+               args->op != LINUX_FUTEX_WAIT_REQUEUE_PI)
+               return (ENOSYS);
 
        switch (args->op) {
        case LINUX_FUTEX_WAIT:
@@ -624,14 +636,23 @@ linux_sys_futex(struct thread *td, struc
 
        case LINUX_FUTEX_LOCK_PI:
                /* not yet implemented */
+               linux_msg(td,
+                         "linux_sys_futex: "
+                         "op LINUX_FUTEX_LOCK_PI not implemented.\n");
                return (ENOSYS);
 
        case LINUX_FUTEX_UNLOCK_PI:
                /* not yet implemented */
+               linux_msg(td,
+                         "linux_sys_futex: "
+                         "op LINUX_FUTEX_UNLOCK_PI not implemented.\n");
                return (ENOSYS);
 
        case LINUX_FUTEX_TRYLOCK_PI:
                /* not yet implemented */
+               linux_msg(td,
+                         "linux_sys_futex: "
+                         "op LINUX_FUTEX_TRYLOCK_PI not implemented.\n");
                return (ENOSYS);
 
        case LINUX_FUTEX_REQUEUE:
@@ -644,15 +665,30 @@ linux_sys_futex(struct thread *td, struc
                 */
                em = em_find(td->td_proc, EMUL_DONTLOCK);
                if (em->used_requeue == 0) {
-                       printf("linux(%s (%d)) sys_futex: "
-                       "unsupported futex_requeue op\n",
-                       td->td_proc->p_comm, td->td_proc->p_pid);
+                       linux_msg(td,
+                                 "linux_sys_futex: "
+                                 "unsupported futex_requeue op\n");
                                em->used_requeue = 1;
                }
                return (EINVAL);
 
+       case LINUX_FUTEX_WAIT_BITSET:
+               /* not yet implemented */
+               linux_msg(td,
+                         "linux_sys_futex: "
+                         "op FUTEX_WAIT_BITSET not implemented.\n");
+               return (ENOSYS);
+
+       case LINUX_FUTEX_WAIT_REQUEUE_PI:
+               /* not yet implemented */
+               linux_msg(td,
+                         "linux_sys_futex: "
+                         "op FUTEX_WAIT_REQUEUE_PI not implemented.\n");
+               return (ENOSYS);
+
        default:
-               printf("linux_sys_futex: unknown op %d\n", args->op);
+               linux_msg(td,
+                         "linux_sys_futex: unknown op %d\n", args->op);
                return (ENOSYS);
        }
 

Modified: stable/8/sys/compat/linux/linux_futex.h
==============================================================================
--- stable/8/sys/compat/linux/linux_futex.h     Mon Nov 22 08:19:18 2010        
(r215660)
+++ stable/8/sys/compat/linux/linux_futex.h     Mon Nov 22 08:21:58 2010        
(r215661)
@@ -39,17 +39,20 @@
 extern LIST_HEAD(futex_list, futex) futex_list;
 extern struct mtx futex_mtx;
 
-#define LINUX_FUTEX_WAIT       0
-#define LINUX_FUTEX_WAKE       1
-#define LINUX_FUTEX_FD         2       /* unused */
-#define LINUX_FUTEX_REQUEUE    3
-#define LINUX_FUTEX_CMP_REQUEUE        4
-#define LINUX_FUTEX_WAKE_OP    5
-#define LINUX_FUTEX_LOCK_PI    6
-#define LINUX_FUTEX_UNLOCK_PI  7
-#define LINUX_FUTEX_TRYLOCK_PI 8
+#define LINUX_FUTEX_WAIT                0
+#define LINUX_FUTEX_WAKE                1
+#define LINUX_FUTEX_FD                  2      /* unused */
+#define LINUX_FUTEX_REQUEUE             3
+#define LINUX_FUTEX_CMP_REQUEUE                 4
+#define LINUX_FUTEX_WAKE_OP             5
+#define LINUX_FUTEX_LOCK_PI             6
+#define LINUX_FUTEX_UNLOCK_PI           7
+#define LINUX_FUTEX_TRYLOCK_PI          8
+#define LINUX_FUTEX_WAIT_BITSET                 9
+#define LINUX_FUTEX_WAIT_REQUEUE_PI    11
 
 #define LINUX_FUTEX_PRIVATE_FLAG       128
+#define LINUX_FUTEX_CLOCK_REALTIME     256
 
 #define FUTEX_OP_SET            0      /* *(int *)UADDR2 = OPARG; */
 #define FUTEX_OP_ADD            1      /* *(int *)UADDR2 += OPARG; */
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to