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);
        }
 }
 
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to