Index: sys/opencrypto/cryptosoft.h =================================================================== --- sys/opencrypto/cryptosoft.h +++ sys/opencrypto/cryptosoft.h @@ -58,6 +58,7 @@ }; struct swcr_session { + struct mtx swcr_lock; struct swcr_data swcr_algorithms[2]; unsigned swcr_nalgs; }; Index: sys/opencrypto/cryptosoft.c =================================================================== --- sys/opencrypto/cryptosoft.c +++ sys/opencrypto/cryptosoft.c @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -765,7 +766,8 @@ return EINVAL; ses = crypto_get_driver_session(cses); - + mtx_init(&ses->swcr_lock, "swcr session lock", NULL, MTX_DEF); + for (i = 0; cri != NULL && i < nitems(ses->swcr_algorithms); i++) { swd = &ses->swcr_algorithms[i]; @@ -1022,6 +1024,7 @@ ses = crypto_get_driver_session(cses); + mtx_destroy(&ses->swcr_lock); for (i = 0; i < nitems(ses->swcr_algorithms); i++) { swd = &ses->swcr_algorithms[i]; @@ -1109,7 +1112,7 @@ static int swcr_process(device_t dev, struct cryptop *crp, int hint) { - struct swcr_session *ses; + struct swcr_session *ses = NULL; struct cryptodesc *crd; struct swcr_data *sw; size_t i; @@ -1124,6 +1127,7 @@ } ses = crypto_get_driver_session(crp->crp_session); + mtx_lock(&ses->swcr_lock); /* Go through crypto descriptors, processing as we go */ for (crd = crp->crp_desc; crd; crd = crd->crd_next) { @@ -1214,6 +1218,8 @@ done: crypto_done(crp); + if (ses) + mtx_unlock(&ses->swcr_lock); return 0; }