Index: sys/crypto/aesni/aesni.h =================================================================== --- sys/crypto/aesni/aesni.h +++ sys/crypto/aesni/aesni.h @@ -66,8 +66,6 @@ int used; int auth_algo; int mlen; - uint32_t id; - TAILQ_ENTRY(aesni_session) next; }; /* Index: sys/crypto/aesni/aesni.c =================================================================== --- sys/crypto/aesni/aesni.c +++ sys/crypto/aesni/aesni.c @@ -42,7 +42,6 @@ #include #include #include -#include #include #include #include @@ -69,13 +68,9 @@ static struct fpu_kern_ctx **ctx_fpu; struct aesni_softc { - int dieing; int32_t cid; - uint32_t sid; bool has_aes; bool has_sha; - TAILQ_HEAD(aesni_sessions_head, aesni_session) sessions; - struct rwlock lock; }; #define ACQUIRE_CTX(i, ctx) \ @@ -91,10 +86,8 @@ (ctx) = NULL; \ } while (0) -static int aesni_newsession(device_t, uint32_t *sidp, struct cryptoini *cri); -static int aesni_freesession(device_t, uint64_t tid); -static void aesni_freesession_locked(struct aesni_softc *sc, - struct aesni_session *ses); +static int aesni_newsession(device_t, crypto_session_t cses, + struct cryptoini *cri); static int aesni_cipher_setup(struct aesni_session *ses, struct cryptoini *encini, struct cryptoini *authini); static int aesni_cipher_process(struct aesni_session *ses, @@ -172,12 +165,9 @@ int i; sc = device_get_softc(dev); - sc->dieing = 0; - TAILQ_INIT(&sc->sessions); - sc->sid = 1; - sc->cid = crypto_get_driverid(dev, CRYPTOCAP_F_HARDWARE | - CRYPTOCAP_F_SYNC); + sc->cid = crypto_get_driverid(dev, sizeof(struct aesni_session), + CRYPTOCAP_F_HARDWARE | CRYPTOCAP_F_SYNC); if (sc->cid < 0) { device_printf(dev, "Could not get crypto driver id.\n"); return (ENOMEM); @@ -193,8 +183,6 @@ mtx_init(&ctx_mtx[i], "anifpumtx", NULL, MTX_DEF|MTX_NEW); } - rw_init(&sc->lock, "aesni_lock"); - detect_cpu_features(&sc->has_aes, &sc->has_sha); if (sc->has_aes) { crypto_register(sc->cid, CRYPTO_AES_CBC, 0, 0); @@ -217,36 +205,18 @@ aesni_detach(device_t dev) { struct aesni_softc *sc; - struct aesni_session *ses; sc = device_get_softc(dev); - rw_wlock(&sc->lock); - TAILQ_FOREACH(ses, &sc->sessions, next) { - if (ses->used) { - rw_wunlock(&sc->lock); - device_printf(dev, - "Cannot detach, sessions still active.\n"); - return (EBUSY); - } - } - sc->dieing = 1; - while ((ses = TAILQ_FIRST(&sc->sessions)) != NULL) { - TAILQ_REMOVE(&sc->sessions, ses, next); - free(ses, M_AESNI); - } - rw_wunlock(&sc->lock); crypto_unregister_all(sc->cid); - rw_destroy(&sc->lock); - aesni_cleanctx(); return (0); } static int -aesni_newsession(device_t dev, uint32_t *sidp, struct cryptoini *cri) +aesni_newsession(device_t dev, crypto_session_t cses, struct cryptoini *cri) { struct aesni_softc *sc; struct aesni_session *ses; @@ -254,16 +224,16 @@ bool gcm_hash, gcm; int error; - if (sidp == NULL || cri == NULL) { - CRYPTDEB("no sidp or cri"); + KASSERT(cses != NULL, ("EDOOFUS")); + if (cri == NULL) { + CRYPTDEB("no cri"); return (EINVAL); } sc = device_get_softc(dev); - if (sc->dieing) - return (EINVAL); - ses = NULL; + ses = crypto_get_driver_session(cses); + authini = NULL; encini = NULL; gcm = false; @@ -321,30 +291,6 @@ if (gcm_hash != gcm) return (EINVAL); - rw_wlock(&sc->lock); - if (sc->dieing) { - rw_wunlock(&sc->lock); - return (EINVAL); - } - /* - * Free sessions are inserted at the head of the list. So if the first - * session is used, none are free and we must allocate a new one. - */ - ses = TAILQ_FIRST(&sc->sessions); - if (ses == NULL || ses->used) { - ses = malloc(sizeof(*ses), M_AESNI, M_NOWAIT | M_ZERO); - if (ses == NULL) { - rw_wunlock(&sc->lock); - return (ENOMEM); - } - ses->id = sc->sid++; - } else { - TAILQ_REMOVE(&sc->sessions, ses, next); - } - ses->used = 1; - TAILQ_INSERT_TAIL(&sc->sessions, ses, next); - rw_wunlock(&sc->lock); - if (encini != NULL) ses->algo = encini->cri_alg; if (authini != NULL) @@ -353,50 +299,9 @@ error = aesni_cipher_setup(ses, encini, authini); if (error != 0) { CRYPTDEB("setup failed"); - rw_wlock(&sc->lock); - aesni_freesession_locked(sc, ses); - rw_wunlock(&sc->lock); return (error); } - *sidp = ses->id; - return (0); -} - -static void -aesni_freesession_locked(struct aesni_softc *sc, struct aesni_session *ses) -{ - uint32_t sid; - - rw_assert(&sc->lock, RA_WLOCKED); - - sid = ses->id; - TAILQ_REMOVE(&sc->sessions, ses, next); - explicit_bzero(ses, sizeof(*ses)); - ses->id = sid; - TAILQ_INSERT_HEAD(&sc->sessions, ses, next); -} - -static int -aesni_freesession(device_t dev, uint64_t tid) -{ - struct aesni_softc *sc; - struct aesni_session *ses; - uint32_t sid; - - sc = device_get_softc(dev); - sid = ((uint32_t)tid) & 0xffffffff; - rw_wlock(&sc->lock); - TAILQ_FOREACH_REVERSE(ses, &sc->sessions, aesni_sessions_head, next) { - if (ses->id == sid) - break; - } - if (ses == NULL) { - rw_wunlock(&sc->lock); - return (EINVAL); - } - aesni_freesession_locked(sc, ses); - rw_wunlock(&sc->lock); return (0); } @@ -419,7 +324,8 @@ if (crp == NULL) return (EINVAL); - if (crp->crp_callback == NULL || crp->crp_desc == NULL) { + if (crp->crp_callback == NULL || crp->crp_desc == NULL || + crp->crp_session == NULL) { error = EINVAL; goto out; } @@ -472,16 +378,8 @@ goto out; } - rw_rlock(&sc->lock); - TAILQ_FOREACH_REVERSE(ses, &sc->sessions, aesni_sessions_head, next) { - if (ses->id == (crp->crp_sid & 0xffffffff)) - break; - } - rw_runlock(&sc->lock); - if (ses == NULL) { - error = EINVAL; - goto out; - } + ses = crypto_get_driver_session(crp->crp_session); + KASSERT(ses != NULL, ("EDOOFUS")); error = aesni_cipher_process(ses, enccrd, authcrd, crp); if (error != 0) @@ -537,7 +435,6 @@ DEVMETHOD(device_detach, aesni_detach), DEVMETHOD(cryptodev_newsession, aesni_newsession), - DEVMETHOD(cryptodev_freesession, aesni_freesession), DEVMETHOD(cryptodev_process, aesni_process), DEVMETHOD_END Index: sys/crypto/ccp/ccp.h =================================================================== --- sys/crypto/ccp/ccp.h +++ sys/crypto/ccp/ccp.h @@ -134,8 +134,6 @@ struct ccp_softc { device_t dev; int32_t cid; - struct ccp_session *sessions; - int nsessions; struct mtx lock; bool detaching; Index: sys/crypto/ccp/ccp.c =================================================================== --- sys/crypto/ccp/ccp.c +++ sys/crypto/ccp/ccp.c @@ -238,7 +238,8 @@ sc = device_get_softc(dev); sc->dev = dev; - sc->cid = crypto_get_driverid(dev, CRYPTOCAP_F_HARDWARE); + sc->cid = crypto_get_driverid(dev, sizeof(struct ccp_session), + CRYPTOCAP_F_HARDWARE); if (sc->cid < 0) { device_printf(dev, "could not get crypto driver id\n"); return (ENXIO); @@ -281,17 +282,10 @@ ccp_detach(device_t dev) { struct ccp_softc *sc; - int i; sc = device_get_softc(dev); mtx_lock(&sc->lock); - for (i = 0; i < sc->nsessions; i++) { - if (sc->sessions[i].active || sc->sessions[i].pending != 0) { - mtx_unlock(&sc->lock); - return (EBUSY); - } - } sc->detaching = true; mtx_unlock(&sc->lock); @@ -305,7 +299,6 @@ if (g_ccp_softc == sc) g_ccp_softc = NULL; - free(sc->sessions, M_CCP); mtx_destroy(&sc->lock); return (0); } @@ -393,7 +386,7 @@ } static int -ccp_newsession(device_t dev, uint32_t *sidp, struct cryptoini *cri) +ccp_newsession(device_t dev, crypto_session_t cses, struct cryptoini *cri) { struct ccp_softc *sc; struct ccp_session *s; @@ -403,12 +396,14 @@ unsigned auth_mode, iv_len; unsigned partial_digest_len; unsigned q; - int error, i, sess; + int error; bool gcm_hash; - if (sidp == NULL || cri == NULL) + if (cri == NULL) return (EINVAL); + s = crypto_get_driver_session(cses); + gcm_hash = false; cipher = NULL; hash = NULL; @@ -510,29 +505,6 @@ mtx_unlock(&sc->lock); return (ENXIO); } - sess = -1; - for (i = 0; i < sc->nsessions; i++) { - if (!sc->sessions[i].active && sc->sessions[i].pending == 0) { - sess = i; - break; - } - } - if (sess == -1) { - s = malloc(sizeof(*s) * (sc->nsessions + 1), M_CCP, - M_NOWAIT | M_ZERO); - if (s == NULL) { - mtx_unlock(&sc->lock); - return (ENOMEM); - } - if (sc->sessions != NULL) - memcpy(s, sc->sessions, sizeof(*s) * sc->nsessions); - sess = sc->nsessions; - free(sc->sessions, M_CCP); - sc->sessions = s; - sc->nsessions++; - } - - s = &sc->sessions[sess]; /* Just grab the first usable queue for now. */ for (q = 0; q < nitems(sc->queues); q++) @@ -581,32 +553,21 @@ s->active = true; mtx_unlock(&sc->lock); - *sidp = sess; return (0); } -static int -ccp_freesession(device_t dev, uint64_t tid) +static void +ccp_freesession(device_t dev, crypto_session_t cses) { - struct ccp_softc *sc; - uint32_t sid; - int error; + struct ccp_session *s; - sc = device_get_softc(dev); - sid = CRYPTO_SESID2LID(tid); - mtx_lock(&sc->lock); - if (sid >= sc->nsessions || !sc->sessions[sid].active) - error = EINVAL; - else { - if (sc->sessions[sid].pending != 0) - device_printf(dev, - "session %d freed with %d pending requests\n", sid, - sc->sessions[sid].pending); - sc->sessions[sid].active = false; - error = 0; - } - mtx_unlock(&sc->lock); - return (error); + s = crypto_get_driver_session(cses); + + if (s->pending != 0) + device_printf(dev, + "session %p freed with %d pending requests\n", s, + s->pending); + s->active = false; } static int @@ -616,7 +577,6 @@ struct ccp_queue *qp; struct ccp_session *s; struct cryptodesc *crd, *crda, *crde; - uint32_t sid; int error; bool qpheld; @@ -626,16 +586,9 @@ return (EINVAL); crd = crp->crp_desc; - sid = CRYPTO_SESID2LID(crp->crp_sid); + s = crypto_get_driver_session(crp->crp_session); sc = device_get_softc(dev); mtx_lock(&sc->lock); - if (sid >= sc->nsessions || !sc->sessions[sid].active) { - mtx_unlock(&sc->lock); - error = EINVAL; - goto out; - } - - s = &sc->sessions[sid]; qp = &sc->queues[s->queue]; mtx_unlock(&sc->lock); error = ccp_queue_acquire_reserve(qp, 1 /* placeholder */, M_NOWAIT); @@ -856,7 +809,6 @@ db_printf("ccp softc at %p\n", sc); db_printf(" cid: %d\n", (int)sc->cid); - db_printf(" nsessions: %d\n", sc->nsessions); db_printf(" lock: "); db_show_lock(&sc->lock);