Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 3 Jul 2020 14:54:46 +0000 (UTC)
From:      Conrad Meyer <cem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r362913 - in head/sys: amd64/amd64 amd64/include crypto/aesni crypto/blake2
Message-ID:  <202007031454.063EskxA049004@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 	}
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202007031454.063EskxA049004>