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