summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/geom/eli/g_eli.c16
-rw-r--r--sys/geom/eli/g_eli.h1
2 files changed, 5 insertions, 12 deletions
diff --git a/sys/geom/eli/g_eli.c b/sys/geom/eli/g_eli.c
index b5e4f7b..874aa26 100644
--- a/sys/geom/eli/g_eli.c
+++ b/sys/geom/eli/g_eli.c
@@ -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, struct g_class *mp, struct g_provider *bpp,
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, struct g_class *mp, struct g_provider *bpp,
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;
}
/*
diff --git a/sys/geom/eli/g_eli.h b/sys/geom/eli/g_eli.h
index 0b48db2..a5aad8f 100644
--- a/sys/geom/eli/g_eli.h
+++ b/sys/geom/eli/g_eli.h
@@ -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;
OpenPOWER on IntegriCloud