PERFORCE change 101582 for review

John Baldwin jhb at FreeBSD.org
Fri Jul 14 18:49:17 UTC 2006


http://perforce.freebsd.org/chv.cgi?CH=101582

Change 101582 by jhb at jhb_mutex on 2006/07/14 18:48:39

	Assume that the only entry that's going to be removed while running
	the list of handlers is the current one.

Affected files ...

.. //depot/projects/smpng/sys/kern/subr_autoconf.c#8 edit

Differences ...

==== //depot/projects/smpng/sys/kern/subr_autoconf.c#8 (text+ko) ====

@@ -55,14 +55,6 @@
 	TAILQ_HEAD_INITIALIZER(intr_config_hook_list);
 static struct mtx intr_config_hook_lock;
 MTX_SYSINIT(intr_config_hook, &intr_config_hook_lock, "intr config", MTX_DEF);
-static struct sx intr_config_run_lock;
-SX_SYSINIT(intr_config_run, &intr_config_run_lock, "intr config run");
-
-/*
- * The current location in the list when a thread is executing the current
- * hooks.  If this hook is removed we advance it to the next entry.
- */
-static struct intr_config_hook *next_entry;
 
 /* ARGSUSED */
 static void run_interrupt_driven_config_hooks(void *dummy);
@@ -71,18 +63,11 @@
 run_interrupt_driven_config_hooks(dummy)
 	void *dummy;
 {
-	struct intr_config_hook *hook_entry;
+	struct intr_config_hook *hook_entry, *next_entry;
 
-	/*
-	 * Because of the special care for next_entry, we can only allow one
-	 * thread at a time to run through the list.
-	 */
-	sx_xlock(&intr_config_run_lock);
-
 	mtx_lock(&intr_config_hook_lock);
-	for (hook_entry = TAILQ_FIRST(&intr_config_hook_list);
-	     hook_entry != NULL;
-	     hook_entry = next_entry) {
+	TAILQ_FOREACH_SAFE(hook_entry, &intr_config_hook_list, ich_links,
+	    next_entry) {
 		next_entry = TAILQ_NEXT(hook_entry, ich_links);
 		mtx_unlock(&intr_config_hook_lock);
 		(*hook_entry->ich_func)(hook_entry->ich_arg);
@@ -94,8 +79,6 @@
 		    "conifhk", 0);
 	}
 	mtx_unlock(&intr_config_hook_lock);
-
-	sx_xunlock(&intr_config_run_lock);
 }
 SYSINIT(intr_config_hooks, SI_SUB_INT_CONFIG_HOOKS, SI_ORDER_FIRST,
 	run_interrupt_driven_config_hooks, NULL)
@@ -143,12 +126,6 @@
 		panic("config_intrhook_disestablish: disestablishing an "
 		      "unestablished hook");
 
-	/*
-	 * If a thread is going to run this hook next, advance it's next
-	 * pointer.
-	 */
-	if (hook == next_entry)
-		next_entry = TAILQ_NEXT(next_entry, ich_links);
 	TAILQ_REMOVE(&intr_config_hook_list, hook, ich_links);
 
 	/* Wakeup anyone watching the list */


More information about the p4-projects mailing list