PERFORCE change 1202863 for review
John-Mark Gurney
jmg at FreeBSD.org
Sun Nov 16 04:00:57 UTC 2014
http://p4web.freebsd.org/@@1202863?ac=10
Change 1202863 by jmg at jmg_carbon2 on 2014/11/16 04:00:03
add a lock to protect aesni session state... This will need to
be figured out how to handle this better for now.. but we can't
share cpu context between sessions...
I'm not really sure how the code on HEAD works w/o this without
hitting the same issue...
Sponsored by: FreeBSD Foundation
Sponsored by: Netgate
Affected files ...
.. //depot/projects/opencrypto/sys/crypto/aesni/aesni.c#14 edit
.. //depot/projects/opencrypto/sys/crypto/aesni/aesni.h#4 edit
Differences ...
==== //depot/projects/opencrypto/sys/crypto/aesni/aesni.c#14 (text+ko) ====
@@ -39,6 +39,7 @@
#include <sys/kobj.h>
#include <sys/libkern.h>
#include <sys/lock.h>
+#include <sys/mutex.h>
#include <sys/module.h>
#include <sys/malloc.h>
#include <sys/rwlock.h>
@@ -140,6 +141,7 @@
while ((ses = TAILQ_FIRST(&sc->sessions)) != NULL) {
TAILQ_REMOVE(&sc->sessions, ses, next);
fpu_kern_free_ctx(ses->fpu_ctx);
+ mtx_destroy(&ses->lck);
free(ses, M_AESNI);
}
rw_wunlock(&sc->lock);
@@ -213,6 +215,7 @@
rw_wunlock(&sc->lock);
return (ENOMEM);
}
+ mtx_init(&ses->lck, "aesni session", NULL, MTX_DEF);
ses->id = sc->sid++;
} else {
TAILQ_REMOVE(&sc->sessions, ses, next);
@@ -240,13 +243,16 @@
{
struct fpu_kern_ctx *ctx;
uint32_t sid;
+ struct mtx lck;
sid = ses->id;
+ lck = ses->lck;
TAILQ_REMOVE(&sc->sessions, ses, next);
ctx = ses->fpu_ctx;
- bzero(ses, sizeof(*ses));
+ *ses = (struct aesni_session){};
ses->id = sid;
ses->fpu_ctx = ctx;
+ ses->lck = lck;
TAILQ_INSERT_HEAD(&sc->sessions, ses, next);
}
@@ -433,13 +439,17 @@
int error;
td = curthread;
+ mtx_lock(&ses->lck);
error = fpu_kern_enter(td, ses->fpu_ctx, FPU_KERN_NORMAL |
FPU_KERN_KTHR);
- if (error != 0)
+ if (error != 0) {
+ mtx_unlock(&ses->lck);
return (error);
+ }
error = aesni_cipher_setup_common(ses, encini->cri_key,
encini->cri_klen);
fpu_kern_leave(td, ses->fpu_ctx);
+ mtx_unlock(&ses->lck);
return (error);
}
@@ -478,6 +488,7 @@
}
td = curthread;
+ mtx_lock(&ses->lck);
error = fpu_kern_enter(td, ses->fpu_ctx, FPU_KERN_NORMAL |
FPU_KERN_KTHR);
if (error != 0)
@@ -585,6 +596,7 @@
out:
fpu_kern_leave(td, ses->fpu_ctx);
+ mtx_unlock(&ses->lck);
out1:
if (allocated) {
bzero(buf, enccrd->crd_len);
==== //depot/projects/opencrypto/sys/crypto/aesni/aesni.h#4 (text+ko) ====
@@ -66,6 +66,7 @@
uint32_t id;
TAILQ_ENTRY(aesni_session) next;
struct fpu_kern_ctx *fpu_ctx;
+ struct mtx lck;
};
/*
More information about the p4-projects
mailing list