Author: cem
Date: Fri Jul  3 14:54:46 2020
New Revision: 362913
URL: https://svnweb.freebsd.org/changeset/base/362913

Log:
  Add domain policy allocation for amd64 fpu_kern_ctx
  
  Like other types of allocation, fpu_kern_ctx are frequently allocated per-cpu.
  Provide the API and sketch some example consumers.
  
  fpu_kern_alloc_ctx_domain() preferentially allocates memory from the
  provided domain, and falls back to other domains if that one is empty
  (DOMAINSET_PREF(domain) policy).
  
  Maybe it makes more sense to just shove one of these in the DPCPU area
  sooner or later -- left for future work.
  
  Reviewed by:  markj
  Differential Revision:        https://reviews.freebsd.org/D22053

Modified:
  head/sys/amd64/amd64/fpu.c
  head/sys/amd64/include/fpu.h
  head/sys/crypto/aesni/aesni.c
  head/sys/crypto/blake2/blake2_cryptodev.c

Modified: head/sys/amd64/amd64/fpu.c
==============================================================================
--- head/sys/amd64/amd64/fpu.c  Fri Jul  3 11:46:42 2020        (r362912)
+++ head/sys/amd64/amd64/fpu.c  Fri Jul  3 14:54:46 2020        (r362913)
@@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/bus.h>
+#include <sys/domainset.h>
 #include <sys/kernel.h>
 #include <sys/lock.h>
 #include <sys/malloc.h>
@@ -1030,17 +1031,31 @@ struct fpu_kern_ctx {
        char hwstate1[];
 };
 
+static inline size_t __pure2
+fpu_kern_alloc_sz(u_int max_est)
+{
+       return (sizeof(struct fpu_kern_ctx) + XSAVE_AREA_ALIGN + max_est);
+}
+
+static inline int __pure2
+fpu_kern_malloc_flags(u_int fpflags)
+{
+       return (((fpflags & FPU_KERN_NOWAIT) ? M_NOWAIT : M_WAITOK) | M_ZERO);
+}
+
 struct fpu_kern_ctx *
-fpu_kern_alloc_ctx(u_int flags)
+fpu_kern_alloc_ctx_domain(int domain, u_int flags)
 {
-       struct fpu_kern_ctx *res;
-       size_t sz;
+       return (malloc_domainset(fpu_kern_alloc_sz(cpu_max_ext_state_size),
+           M_FPUKERN_CTX, DOMAINSET_PREF(domain),
+           fpu_kern_malloc_flags(flags)));
+}
 
-       sz = sizeof(struct fpu_kern_ctx) + XSAVE_AREA_ALIGN +
-           cpu_max_ext_state_size;
-       res = malloc(sz, M_FPUKERN_CTX, ((flags & FPU_KERN_NOWAIT) ?
-           M_NOWAIT : M_WAITOK) | M_ZERO);
-       return (res);
+struct fpu_kern_ctx *
+fpu_kern_alloc_ctx(u_int flags)
+{
+       return (malloc(fpu_kern_alloc_sz(cpu_max_ext_state_size),
+           M_FPUKERN_CTX, fpu_kern_malloc_flags(flags)));
 }
 
 void

Modified: head/sys/amd64/include/fpu.h
==============================================================================
--- head/sys/amd64/include/fpu.h        Fri Jul  3 11:46:42 2020        
(r362912)
+++ head/sys/amd64/include/fpu.h        Fri Jul  3 14:54:46 2020        
(r362913)
@@ -71,6 +71,7 @@ int   fputrap_sse(void);
 int    fputrap_x87(void);
 void   fpuuserinited(struct thread *td);
 struct fpu_kern_ctx *fpu_kern_alloc_ctx(u_int flags);
+struct fpu_kern_ctx *fpu_kern_alloc_ctx_domain(int domain, u_int flags);
 void   fpu_kern_free_ctx(struct fpu_kern_ctx *ctx);
 void   fpu_kern_enter(struct thread *td, struct fpu_kern_ctx *ctx,
            u_int flags);

Modified: head/sys/crypto/aesni/aesni.c
==============================================================================
--- head/sys/crypto/aesni/aesni.c       Fri Jul  3 11:46:42 2020        
(r362912)
+++ head/sys/crypto/aesni/aesni.c       Fri Jul  3 14:54:46 2020        
(r362913)
@@ -180,7 +180,12 @@ aesni_attach(device_t dev)
            M_WAITOK|M_ZERO);
 
        CPU_FOREACH(i) {
-               ctx_fpu[i] = fpu_kern_alloc_ctx(0);
+#ifdef __amd64__
+               ctx_fpu[i] = fpu_kern_alloc_ctx_domain(
+                   pcpu_find(i)->pc_domain, FPU_KERN_NORMAL);
+#else
+               ctx_fpu[i] = fpu_kern_alloc_ctx(FPU_KERN_NORMAL);
+#endif
                mtx_init(&ctx_mtx[i], "anifpumtx", NULL, MTX_DEF|MTX_NEW);
        }
 

Modified: head/sys/crypto/blake2/blake2_cryptodev.c
==============================================================================
--- head/sys/crypto/blake2/blake2_cryptodev.c   Fri Jul  3 11:46:42 2020        
(r362912)
+++ head/sys/crypto/blake2/blake2_cryptodev.c   Fri Jul  3 14:54:46 2020        
(r362913)
@@ -142,7 +142,12 @@ blake2_attach(device_t dev)
            M_WAITOK | M_ZERO);
 
        CPU_FOREACH(i) {
-               ctx_fpu[i] = fpu_kern_alloc_ctx(0);
+#ifdef __amd64__
+               ctx_fpu[i] = fpu_kern_alloc_ctx_domain(
+                   pcpu_find(i)->pc_domain, FPU_KERN_NORMAL);
+#else
+               ctx_fpu[i] = fpu_kern_alloc_ctx(FPU_KERN_NORMAL);
+#endif
                mtx_init(&ctx_mtx[i], "bl2fpumtx", NULL, MTX_DEF | MTX_NEW);
        }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to