svn commit: r255747 - head/sys/kern

Davide Italiano davide at FreeBSD.org
Fri Sep 20 23:16:16 UTC 2013


Author: davide
Date: Fri Sep 20 23:16:15 2013
New Revision: 255747
URL: http://svnweb.freebsd.org/changeset/base/255747

Log:
  Fix callout_init_rm() in the shared case, allocating storage for 'struct
  rm_priotracker' directly in the softclock thread. Now consumers can
  pass CALLOUT_SHAREDLOCK flag to callout initialization routine safely.
  The choice of the already existing flags  instead of special casing
  shared rmlocks is done to prevent consumer footshooting.
  
  Suggested by:	jhb
  Reviewed by:	jhb
  Approved by:	re (delphij)

Modified:
  head/sys/kern/kern_timeout.c

Modified: head/sys/kern/kern_timeout.c
==============================================================================
--- head/sys/kern/kern_timeout.c	Fri Sep 20 23:10:52 2013	(r255746)
+++ head/sys/kern/kern_timeout.c	Fri Sep 20 23:16:15 2013	(r255747)
@@ -597,11 +597,13 @@ softclock_call_cc(struct callout *c, str
 #endif
     int direct)
 {
+	struct rm_priotracker tracker;
 	void (*c_func)(void *);
 	void *c_arg;
 	struct lock_class *class;
 	struct lock_object *c_lock;
-	int c_flags, sharedlock;
+	uintptr_t lock_status;
+	int c_flags;
 #ifdef SMP
 	struct callout_cpu *new_cc;
 	void (*new_func)(void *);
@@ -620,7 +622,13 @@ softclock_call_cc(struct callout *c, str
 	    (CALLOUT_PENDING | CALLOUT_ACTIVE),
 	    ("softclock_call_cc: pend|act %p %x", c, c->c_flags));
 	class = (c->c_lock != NULL) ? LOCK_CLASS(c->c_lock) : NULL;
-	sharedlock = (c->c_flags & CALLOUT_SHAREDLOCK) ? 0 : 1;
+	lock_status = 0;
+	if (c->c_flags & CALLOUT_SHAREDLOCK) {
+		if (class == &lock_class_rm)
+			lock_status = (uintptr_t)&tracker;
+		else
+			lock_status = 1;
+	}
 	c_lock = c->c_lock;
 	c_func = c->c_func;
 	c_arg = c->c_arg;
@@ -633,7 +641,7 @@ softclock_call_cc(struct callout *c, str
 	cc->cc_exec_entity[direct].cc_cancel = false;
 	CC_UNLOCK(cc);
 	if (c_lock != NULL) {
-		class->lc_lock(c_lock, sharedlock);
+		class->lc_lock(c_lock, lock_status);
 		/*
 		 * The callout may have been cancelled
 		 * while we switched locks.


More information about the svn-src-all mailing list