Index: sys/geom/eli/g_eli.h =================================================================== --- sys/geom/eli/g_eli.h +++ sys/geom/eli/g_eli.h @@ -164,9 +164,7 @@ struct g_eli_worker { struct g_eli_softc *w_softc; struct proc *w_proc; - void *w_first_key; u_int w_number; - crypto_session_t w_sid; boolean_t w_active; LIST_ENTRY(g_eli_worker) w_next; }; @@ -201,6 +199,8 @@ off_t sc_provsize; u_int sc_bytes_per_sector; u_int sc_data_per_sector; + crypto_session_t sc_sid; + void *sc_first_key; #ifndef _KERNEL int sc_cpubind; #else /* _KERNEL */ Index: sys/geom/eli/g_eli.c =================================================================== --- sys/geom/eli/g_eli.c +++ sys/geom/eli/g_eli.c @@ -205,9 +205,9 @@ } KASSERT(wr != NULL, ("Invalid worker (%u).", bp->bio_pflags)); G_ELI_DEBUG(1, "Rerunning crypto %s request (sid: %p -> %p).", - bp->bio_cmd == BIO_READ ? "READ" : "WRITE", wr->w_sid, + bp->bio_cmd == BIO_READ ? "READ" : "WRITE", sc->sc_sid, crp->crp_session); - wr->w_sid = crp->crp_session; + sc->sc_sid = crp->crp_session; crp->crp_etype = 0; error = crypto_dispatch(crp); if (error == 0) @@ -482,16 +482,13 @@ } static int -g_eli_newsession(struct g_eli_worker *wr) +g_eli_newsession(struct g_eli_softc *sc) { - struct g_eli_softc *sc; struct crypto_session_params csp; uint32_t caps; int error, new_crypto; void *key; - sc = wr->w_softc; - memset(&csp, 0, sizeof(csp)); csp.csp_mode = CSP_MODE_CIPHER; csp.csp_cipher_alg = sc->sc_ealgo; @@ -516,18 +513,18 @@ switch (sc->sc_crypto) { case G_ELI_CRYPTO_SW_ACCEL: case G_ELI_CRYPTO_SW: - error = crypto_newsession(&wr->w_sid, &csp, + error = crypto_newsession(&sc->sc_sid, &csp, CRYPTOCAP_F_SOFTWARE); break; case G_ELI_CRYPTO_HW: - error = crypto_newsession(&wr->w_sid, &csp, + error = crypto_newsession(&sc->sc_sid, &csp, CRYPTOCAP_F_HARDWARE); break; case G_ELI_CRYPTO_UNKNOWN: - error = crypto_newsession(&wr->w_sid, &csp, + error = crypto_newsession(&sc->sc_sid, &csp, CRYPTOCAP_F_HARDWARE | CRYPTOCAP_F_SOFTWARE); if (error == 0) { - caps = crypto_ses2caps(wr->w_sid); + caps = crypto_ses2caps(sc->sc_sid); if (caps & CRYPTOCAP_F_HARDWARE) new_crypto = G_ELI_CRYPTO_HW; else if (caps & CRYPTOCAP_F_ACCEL_SOFTWARE) @@ -548,22 +545,19 @@ if (error) g_eli_key_drop(sc, key); else - wr->w_first_key = key; + sc->sc_first_key = key; } return (error); } static void -g_eli_freesession(struct g_eli_worker *wr) +g_eli_freesession(struct g_eli_softc *sc) { - struct g_eli_softc *sc; - - crypto_freesession(wr->w_sid); - if (wr->w_first_key != NULL) { - sc = wr->w_softc; - g_eli_key_drop(sc, wr->w_first_key); - wr->w_first_key = NULL; + crypto_freesession(sc->sc_sid); + if (sc->sc_first_key != NULL) { + g_eli_key_drop(sc, sc->sc_first_key); + sc->sc_first_key = NULL; } } @@ -614,7 +608,6 @@ struct g_eli_softc *sc; struct g_eli_worker *wr; struct bio *bp; - int error; wr = arg; sc = wr->w_softc; @@ -643,7 +636,6 @@ if (sc->sc_flags & G_ELI_FLAG_DESTROY) { g_eli_cancel(sc); LIST_REMOVE(wr, w_next); - g_eli_freesession(wr); free(wr, M_ELI); G_ELI_DEBUG(1, "Thread %s exiting.", curthread->td_proc->p_comm); @@ -667,19 +659,13 @@ * Suspend requested, mark the worker as * suspended and go to sleep. */ - if (wr->w_active) { - g_eli_freesession(wr); + if (wr->w_active) wr->w_active = FALSE; - } wakeup(&sc->sc_workers); msleep(sc, &sc->sc_queue_mtx, PRIBIO, "geli:suspend", 0); if (!wr->w_active && !(sc->sc_flags & G_ELI_FLAG_SUSPEND)) { - error = g_eli_newsession(wr); - KASSERT(error == 0, - ("g_eli_newsession() failed on resume (error=%d)", - error)); wr->w_active = TRUE; } goto again; @@ -926,6 +912,18 @@ if (threads == 0) threads = mp_ncpus; sc->sc_cpubind = (mp_ncpus > 1 && threads == mp_ncpus); + error = g_eli_newsession(sc); + if (error != 0) { + if (req != NULL) { + gctl_error(req, "Cannot set up crypto session " + "for %s (error=%d).", bpp->name, error); + } else { + G_ELI_DEBUG(1, "Cannot set up crypto session " + "for %s (error=%d).", bpp->name, error); + } + goto failed; + } + for (i = 0; i < threads; i++) { if (g_eli_cpu_is_disabled(i)) { G_ELI_DEBUG(1, "%s: CPU %u disabled, skipping.", @@ -937,23 +935,9 @@ wr->w_number = i; wr->w_active = TRUE; - error = g_eli_newsession(wr); - if (error != 0) { - free(wr, M_ELI); - if (req != NULL) { - gctl_error(req, "Cannot set up crypto session " - "for %s (error=%d).", bpp->name, error); - } else { - G_ELI_DEBUG(1, "Cannot set up crypto session " - "for %s (error=%d).", bpp->name, error); - } - goto failed; - } - error = kproc_create(g_eli_worker, wr, &wr->w_proc, 0, 0, "g_eli[%u] %s", i, bpp->name); if (error != 0) { - g_eli_freesession(wr); free(wr, M_ELI); if (req != NULL) { gctl_error(req, "Cannot create kernel thread " @@ -999,6 +983,7 @@ msleep(&sc->sc_workers, &sc->sc_queue_mtx, PRIBIO, "geli:destroy", 0); } + g_eli_freesession(sc); mtx_destroy(&sc->sc_queue_mtx); if (cp->provider != NULL) { if (cp->acr == 1) @@ -1048,6 +1033,7 @@ msleep(&sc->sc_workers, &sc->sc_queue_mtx, PRIBIO, "geli:destroy", 0); } + g_eli_freesession(sc); mtx_destroy(&sc->sc_queue_mtx); gp->softc = NULL; g_eli_key_destroy(sc); Index: sys/geom/eli/g_eli_integrity.c =================================================================== --- sys/geom/eli/g_eli_integrity.c +++ sys/geom/eli/g_eli_integrity.c @@ -497,7 +497,7 @@ #endif for (i = 1; i <= nsec; i++, dstoff += encr_secsize) { - crp = crypto_getreq(wr->w_sid, M_WAITOK); + crp = crypto_getreq(sc->sc_sid, M_WAITOK); authkey = (u_char *)p; p += G_ELI_AUTH_SECKEYLEN; data_secsize = sc->sc_data_per_sector; Index: sys/geom/eli/g_eli_privacy.c =================================================================== --- sys/geom/eli/g_eli_privacy.c +++ sys/geom/eli/g_eli_privacy.c @@ -263,7 +263,7 @@ data = bp->bio_data; for (i = 0, dstoff = bp->bio_offset; i < nsec; i++, dstoff += secsize) { - crp = crypto_getreq(wr->w_sid, M_WAITOK); + crp = crypto_getreq(sc->sc_sid, M_WAITOK); crypto_use_buf(crp, data, secsize); crp->crp_opaque = (void *)bp;