Author: kib
Date: Wed Nov 17 16:17:15 2010
New Revision: 215427
URL: http://svn.freebsd.org/changeset/base/215427

Log:
  Only save FPU context when not executing in the context of the crypto
  thread.
  
  Tested by:    Mike Tancsa

Modified:
  head/sys/crypto/aesni/aesni_wrap.c

Modified: head/sys/crypto/aesni/aesni_wrap.c
==============================================================================
--- head/sys/crypto/aesni/aesni_wrap.c  Wed Nov 17 15:42:47 2010        
(r215426)
+++ head/sys/crypto/aesni/aesni_wrap.c  Wed Nov 17 16:17:15 2010        
(r215427)
@@ -246,14 +246,21 @@ int
 aesni_cipher_setup(struct aesni_session *ses, struct cryptoini *encini)
 {
        struct thread *td;
-       int error;
+       int error, saved_ctx;
 
        td = curthread;
-       error = fpu_kern_enter(td, &ses->fpu_ctx, FPU_KERN_NORMAL);
+       if (!is_fpu_kern_thread(0)) {
+               error = fpu_kern_enter(td, &ses->fpu_ctx, FPU_KERN_NORMAL);
+               saved_ctx = 1;
+       } else {
+               error = 0;
+               saved_ctx = 0;
+       }
        if (error == 0) {
                error = aesni_cipher_setup_common(ses, encini->cri_key,
                    encini->cri_klen);
-               fpu_kern_leave(td, &ses->fpu_ctx);
+               if (saved_ctx)
+                       fpu_kern_leave(td, &ses->fpu_ctx);
        }
        return (error);
 }
@@ -264,16 +271,22 @@ aesni_cipher_process(struct aesni_sessio
 {
        struct thread *td;
        uint8_t *buf;
-       int error, allocated;
+       int error, allocated, saved_ctx;
 
        buf = aesni_cipher_alloc(enccrd, crp, &allocated);
        if (buf == NULL)
                return (ENOMEM);
 
        td = curthread;
-       error = fpu_kern_enter(td, &ses->fpu_ctx, FPU_KERN_NORMAL);
-       if (error != 0)
-               goto out;
+       if (!is_fpu_kern_thread(0)) {
+               error = fpu_kern_enter(td, &ses->fpu_ctx, FPU_KERN_NORMAL);
+               if (error != 0)
+                       goto out;
+               saved_ctx = 1;
+       } else {
+               saved_ctx = 0;
+               error = 0;
+       }
 
        if ((enccrd->crd_flags & CRD_F_KEY_EXPLICIT) != 0) {
                error = aesni_cipher_setup_common(ses, enccrd->crd_key,
@@ -311,7 +324,8 @@ aesni_cipher_process(struct aesni_sessio
                            ses->iv);
                }
        }
-       fpu_kern_leave(td, &ses->fpu_ctx);
+       if (saved_ctx)
+               fpu_kern_leave(td, &ses->fpu_ctx);
        if (allocated)
                crypto_copyback(crp->crp_flags, crp->crp_buf, enccrd->crd_skip,
                    enccrd->crd_len, buf);
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to