Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F156919981
D16219.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
10 KB
Referenced Files
None
Subscribers
None
D16219.id.diff
View Options
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 <sys/lock.h>
#include <sys/module.h>
#include <sys/malloc.h>
-#include <sys/rwlock.h>
#include <sys/bus.h>
#include <sys/uio.h>
#include <sys/mbuf.h>
@@ -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);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, May 18, 9:00 AM (14 h, 26 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33241020
Default Alt Text
D16219.id.diff (10 KB)
Attached To
Mode
D16219: Adapt ccp(4) and aesni(4) drivers to pointer OCF interface
Attached
Detach File
Event Timeline
Log In to Comment