svn commit: r263978 - head/sys/cam/ctl

Edward Tomasz Napierala trasz at FreeBSD.org
Mon Mar 31 20:49:33 UTC 2014


Author: trasz
Date: Mon Mar 31 20:49:33 2014
New Revision: 263978
URL: http://svnweb.freebsd.org/changeset/base/263978

Log:
  Make it possible to have multiple CTL worker threads.  Leave the default
  of 1 for now.
  
  Sponsored by:	The FreeBSD Foundation

Modified:
  head/sys/cam/ctl/ctl.c

Modified: head/sys/cam/ctl/ctl.c
==============================================================================
--- head/sys/cam/ctl/ctl.c	Mon Mar 31 19:58:08 2014	(r263977)
+++ head/sys/cam/ctl/ctl.c	Mon Mar 31 20:49:33 2014	(r263978)
@@ -60,6 +60,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/ioccom.h>
 #include <sys/queue.h>
 #include <sys/sbuf.h>
+#include <sys/smp.h>
 #include <sys/endian.h>
 #include <sys/sysctl.h>
 
@@ -320,6 +321,10 @@ static int     ctl_is_single = 1;
 static int     index_to_aps_page;
 
 SYSCTL_NODE(_kern_cam, OID_AUTO, ctl, CTLFLAG_RD, 0, "CAM Target Layer");
+static int worker_threads = 1;
+TUNABLE_INT("kern.cam.ctl.worker_threads", &worker_threads);
+SYSCTL_INT(_kern_cam_ctl, OID_AUTO, worker_threads, CTLFLAG_RDTUN,
+    &worker_threads, 1, "Number of worker threads");
 
 /*
  * Serial number (0x80), device id (0x83), and supported pages (0x00)
@@ -950,10 +955,7 @@ ctl_init(void)
 	struct ctl_frontend *fe;
 	struct ctl_lun *lun;
         uint8_t sc_id =0;
-#if 0
-	int i;
-#endif
-	int error, retval;
+	int i, error, retval;
 	//int isc_retval;
 
 	retval = 0;
@@ -1085,17 +1087,35 @@ ctl_init(void)
 	mtx_unlock(&softc->ctl_lock);
 #endif
 
-	error = kproc_create(ctl_work_thread, softc, &softc->work_thread, 0, 0,
-			 "ctl_thrd");
-	if (error != 0) {
-		printf("error creating CTL work thread!\n");
-		mtx_lock(&softc->ctl_lock);
-		ctl_free_lun(lun);
-		mtx_unlock(&softc->ctl_lock);
-		ctl_pool_free(internal_pool);
-		ctl_pool_free(emergency_pool);
-		ctl_pool_free(other_pool);
-		return (error);
+	if (worker_threads > MAXCPU || worker_threads == 0) {
+		printf("invalid kern.cam.ctl.worker_threads value; "
+		    "setting to 1");
+		worker_threads = 1;
+	} else if (worker_threads < 0) {
+		if (mp_ncpus > 2) {
+			/*
+			 * Using more than two worker threads actually hurts
+			 * performance due to lock contention.
+			 */
+			worker_threads = 2;
+		} else {
+			worker_threads = 1;
+		}
+	}
+
+	for (i = 0; i < worker_threads; i++) {
+		error = kproc_create(ctl_work_thread, softc, &softc->work_thread, 0, 0,
+				"ctl_thrd%d", i);
+		if (error != 0) {
+			printf("error creating CTL work thread!\n");
+			mtx_lock(&softc->ctl_lock);
+			ctl_free_lun(lun);
+			mtx_unlock(&softc->ctl_lock);
+			ctl_pool_free(internal_pool);
+			ctl_pool_free(emergency_pool);
+			ctl_pool_free(other_pool);
+			return (error);
+		}
 	}
 	if (bootverbose)
 		printf("ctl: CAM Target Layer loaded\n");
@@ -12991,7 +13011,11 @@ ctl_work_thread(void *arg)
 			if (io != NULL) {
 				STAILQ_REMOVE_HEAD(&softc->rtr_queue, links);
 				mtx_unlock(&softc->ctl_lock);
-				goto execute;
+				retval = ctl_scsiio(&io->scsiio);
+				if (retval != CTL_RETVAL_COMPLETE)
+					CTL_DEBUG_PRINT(("ctl_scsiio failed\n"));
+				mtx_lock(&softc->ctl_lock);
+				continue;
 			}
 		}
 		io = (union ctl_io *)STAILQ_FIRST(&softc->incoming_queue);
@@ -13022,19 +13046,6 @@ ctl_work_thread(void *arg)
 
 		/* Back to the top of the loop to see what woke us up. */
 		continue;
-
-execute:
-		retval = ctl_scsiio(&io->scsiio);
-		switch (retval) {
-		case CTL_RETVAL_COMPLETE:
-			break;
-		default:
-			/*
-			 * Probably need to make sure this doesn't happen.
-			 */
-			break;
-		}
-		mtx_lock(&softc->ctl_lock);
 	}
 }
 


More information about the svn-src-head mailing list