svn commit: r215338 - head/sys/compat/linux

Alexander Leidinger netchild at FreeBSD.org
Mon Nov 15 13:03:37 UTC 2010


Author: netchild
Date: Mon Nov 15 13:03:35 2010
New Revision: 215338
URL: http://svn.freebsd.org/changeset/base/215338

Log:
  - 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:
  head/sys/compat/linux/linux_futex.c
  head/sys/compat/linux/linux_futex.h

Modified: head/sys/compat/linux/linux_futex.c
==============================================================================
--- head/sys/compat/linux/linux_futex.c	Mon Nov 15 09:41:46 2010	(r215337)
+++ head/sys/compat/linux/linux_futex.c	Mon Nov 15 13:03:35 2010	(r215338)
@@ -416,7 +416,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 = NULL;
@@ -429,7 +429,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:
@@ -612,14 +624,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:
@@ -632,15 +653,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: head/sys/compat/linux/linux_futex.h
==============================================================================
--- head/sys/compat/linux/linux_futex.h	Mon Nov 15 09:41:46 2010	(r215337)
+++ head/sys/compat/linux/linux_futex.h	Mon Nov 15 13:03:35 2010	(r215338)
@@ -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; */


More information about the svn-src-all mailing list