PERFORCE change 99078 for review

John Baldwin jhb at FreeBSD.org
Mon Jun 12 20:33:06 UTC 2006


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

Change 99078 by jhb at jhb_mutex on 2006/06/12 20:30:28

	Style fixes and close a race.

Affected files ...

.. //depot/projects/smpng/sys/kern/subr_firmware.c#9 edit

Differences ...

==== //depot/projects/smpng/sys/kern/subr_firmware.c#9 (text+ko) ====

@@ -96,11 +96,6 @@
 	return frp;
 }
 
-/*
- * Note that for a module loaded via kldload before it was asked for by
- * a consumer, fp->file will be NULL, so we won't try to unload the
- * module when the last reference is dropped.
- */
 static void
 clearentry(struct firmware *fp)
 {
@@ -226,8 +221,7 @@
 		if (fp == NULL)
 			break;
 		file = fp->file;
-		/* No longer explicitly loaded. */
-		fp->file = NULL;
+		clearentry(fp);
 		mtx_unlock(&firmware_mtx);
 
 		linker_release_module(NULL, NULL, file);
@@ -251,6 +245,8 @@
 	if (fp->refcnt == 0) {
 		if ((flags & FIRMWARE_UNLOAD) == 0)
 			fp->flags |= FIRMWAREFLAG_KEEPKLDREF;
+		else if (fp->file)
+			taskqueue_enqueue(taskqueue_thread, &firmware_task);
 	}
 	mtx_unlock(&firmware_mtx);
 }
@@ -261,6 +257,7 @@
 static int
 firmware_modevent(module_t mod, int type, void *unused)
 {
+	struct firmware *fp;
 	int i;
 
 	switch (type) {
@@ -269,7 +266,7 @@
 		return 0;
 	case MOD_UNLOAD:
 		for (i = 0; i < FIRMWARE_MAX; i++) {
-			struct firmware *fp = &firmware_table[i];
+			fp = &firmware_table[i];
 			fp->flags &= ~FIRMWAREFLAG_KEEPKLDREF;
 		}
 		taskqueue_enqueue(taskqueue_thread, &firmware_task);


More information about the p4-projects mailing list