svn commit: r226840 - head/sys/geom/eli

Pawel Jakub Dawidek pjd at FreeBSD.org
Thu Oct 27 16:12:26 UTC 2011


Author: pjd
Date: Thu Oct 27 16:12:25 2011
New Revision: 226840
URL: http://svn.freebsd.org/changeset/base/226840

Log:
  Before this change when GELI detected hardware crypto acceleration it will
  start only one worker thread. For software crypto it will start by default
  N worker threads where N is the number of available CPUs.
  
  This is not optimal if hardware crypto is AES-NI, which uses CPU for AES
  calculations.
  
  Change that to always start one worker thread for every available CPU.
  Number of worker threads per GELI provider can be easly reduced with
  kern.geom.eli.threads sysctl/tunable and even for software crypto it
  should be reduced when using more providers.
  
  While here, when number of threads exceeds number of CPUs avilable don't
  reduce this number, assume the user knows what he is doing.
  
  Reported by:	Yuri Karaban <dev at dev97.com>
  MFC after:	3 days

Modified:
  head/sys/geom/eli/g_eli.c
  head/sys/geom/eli/g_eli.h

Modified: head/sys/geom/eli/g_eli.c
==============================================================================
--- head/sys/geom/eli/g_eli.c	Thu Oct 27 14:15:26 2011	(r226839)
+++ head/sys/geom/eli/g_eli.c	Thu Oct 27 16:12:25 2011	(r226840)
@@ -443,16 +443,15 @@ g_eli_worker(void *arg)
 	sc = wr->w_softc;
 #ifdef SMP
 	/* Before sched_bind() to a CPU, wait for all CPUs to go on-line. */
-	if (mp_ncpus > 1 && sc->sc_crypto == G_ELI_CRYPTO_SW &&
-	    g_eli_threads == 0) {
+	if (sc->sc_cpubind) {
 		while (!smp_started)
 			tsleep(wr, 0, "geli:smp", hz / 4);
 	}
 #endif
 	thread_lock(curthread);
 	sched_prio(curthread, PUSER);
-	if (sc->sc_crypto == G_ELI_CRYPTO_SW && g_eli_threads == 0)
-		sched_bind(curthread, wr->w_number);
+	if (sc->sc_cpubind)
+		sched_bind(curthread, wr->w_number % mp_ncpus);
 	thread_unlock(curthread);
 
 	G_ELI_DEBUG(1, "Thread %s started.", curthread->td_proc->p_comm);
@@ -813,11 +812,7 @@ g_eli_create(struct gctl_req *req, struc
 	threads = g_eli_threads;
 	if (threads == 0)
 		threads = mp_ncpus;
-	else if (threads > mp_ncpus) {
-		/* There is really no need for too many worker threads. */
-		threads = mp_ncpus;
-		G_ELI_DEBUG(0, "Reducing number of threads to %u.", threads);
-	}
+	sc->sc_cpubind = (mp_ncpus > 1 && threads == mp_ncpus);
 	for (i = 0; i < threads; i++) {
 		if (g_eli_cpu_is_disabled(i)) {
 			G_ELI_DEBUG(1, "%s: CPU %u disabled, skipping.",
@@ -857,9 +852,6 @@ g_eli_create(struct gctl_req *req, struc
 			goto failed;
 		}
 		LIST_INSERT_HEAD(&sc->sc_workers, wr, w_next);
-		/* If we have hardware support, one thread is enough. */
-		if (sc->sc_crypto == G_ELI_CRYPTO_HW)
-			break;
 	}
 
 	/*

Modified: head/sys/geom/eli/g_eli.h
==============================================================================
--- head/sys/geom/eli/g_eli.h	Thu Oct 27 14:15:26 2011	(r226839)
+++ head/sys/geom/eli/g_eli.h	Thu Oct 27 16:12:25 2011	(r226840)
@@ -192,6 +192,7 @@ struct g_eli_softc {
 	size_t		 sc_sectorsize;
 	u_int		 sc_bytes_per_sector;
 	u_int		 sc_data_per_sector;
+	boolean_t	 sc_cpubind;
 
 	/* Only for software cryptography. */
 	struct bio_queue_head sc_queue;


More information about the svn-src-head mailing list