mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	OpenZFS restructuring - move platform specific headers
Move platform specific Linux headers under include/os/linux/. Update the build system accordingly to detect the platform. This lays some of the initial groundwork to supporting building for other platforms. As part of this change it was necessary to create both a user and kernel space sys/simd.h header which can be included in either context. No functional change, the source has been refactored and the relevant #include's updated. Reviewed-by: Jorgen Lundman <lundman@lundman.net> Reviewed-by: Igor Kozhukhov <igor@dilos.org> Signed-off-by: Matthew Macy <mmacy@FreeBSD.org> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #9198
This commit is contained in:
		
							parent
							
								
									d02186ee2b
								
							
						
					
					
						commit
						006e9a4088
					
				
							
								
								
									
										26
									
								
								config/always-system.m4
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								config/always-system.m4
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | |||||||
|  | dnl # | ||||||
|  | dnl # Set the target system | ||||||
|  | dnl # | ||||||
|  | AC_DEFUN([ZFS_AC_CONFIG_ALWAYS_SYSTEM], [ | ||||||
|  | 	AC_MSG_CHECKING([for system type ($host_os)]) | ||||||
|  | 	case $host_os in | ||||||
|  | 		*linux*) | ||||||
|  | 			AC_DEFINE([SYSTEM_LINUX], [1], | ||||||
|  | 				[True if ZFS is to be compiled for a Linux system]) | ||||||
|  | 			ac_system="Linux" | ||||||
|  | 			;; | ||||||
|  | 		*freebsd*) | ||||||
|  | 			AC_DEFINE([SYSTEM_FREEBSD], [1], | ||||||
|  | 				[True if ZFS is to be compiled for a FreeBSD system]) | ||||||
|  | 			ac_system="FreeBSD" | ||||||
|  | 			;; | ||||||
|  | 		*) | ||||||
|  | 			ac_system="unknown" | ||||||
|  | 			;; | ||||||
|  | 	esac | ||||||
|  | 	AC_MSG_RESULT([$ac_system]) | ||||||
|  | 	AC_SUBST([ac_system]) | ||||||
|  | 
 | ||||||
|  | 	AM_CONDITIONAL([BUILD_LINUX], [test "x$ac_system" = "xLinux"]) | ||||||
|  | 	AM_CONDITIONAL([BUILD_FREEBSD], [test "x$ac_system" = "xFreeBSD"]) | ||||||
|  | ]) | ||||||
| @ -160,6 +160,7 @@ AC_DEFUN([ZFS_AC_CONFIG_ALWAYS], [ | |||||||
| 	ZFS_AC_CONFIG_ALWAYS_CC_NO_OMIT_FRAME_POINTER | 	ZFS_AC_CONFIG_ALWAYS_CC_NO_OMIT_FRAME_POINTER | ||||||
| 	ZFS_AC_CONFIG_ALWAYS_CC_ASAN | 	ZFS_AC_CONFIG_ALWAYS_CC_ASAN | ||||||
| 	ZFS_AC_CONFIG_ALWAYS_TOOLCHAIN_SIMD | 	ZFS_AC_CONFIG_ALWAYS_TOOLCHAIN_SIMD | ||||||
|  | 	ZFS_AC_CONFIG_ALWAYS_SYSTEM | ||||||
| 	ZFS_AC_CONFIG_ALWAYS_ARCH | 	ZFS_AC_CONFIG_ALWAYS_ARCH | ||||||
| 	ZFS_AC_CONFIG_ALWAYS_PYTHON | 	ZFS_AC_CONFIG_ALWAYS_PYTHON | ||||||
| 	ZFS_AC_CONFIG_ALWAYS_PYZFS | 	ZFS_AC_CONFIG_ALWAYS_PYZFS | ||||||
|  | |||||||
							
								
								
									
										13
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								configure.ac
									
									
									
									
									
								
							| @ -146,10 +146,15 @@ AC_CONFIG_FILES([ | |||||||
| 	module/icp/Makefile | 	module/icp/Makefile | ||||||
| 	module/spl/Makefile | 	module/spl/Makefile | ||||||
| 	include/Makefile | 	include/Makefile | ||||||
| 	include/linux/Makefile | 	include/os/Makefile | ||||||
| 	include/spl/Makefile | 	include/os/linux/Makefile | ||||||
| 	include/spl/rpc/Makefile | 	include/os/linux/kernel/Makefile | ||||||
| 	include/spl/sys/Makefile | 	include/os/linux/kernel/linux/Makefile | ||||||
|  | 	include/os/linux/spl/Makefile | ||||||
|  | 	include/os/linux/spl/rpc/Makefile | ||||||
|  | 	include/os/linux/spl/sys/Makefile | ||||||
|  | 	include/os/linux/zfs/Makefile | ||||||
|  | 	include/os/linux/zfs/sys/Makefile | ||||||
| 	include/sys/Makefile | 	include/sys/Makefile | ||||||
| 	include/sys/fs/Makefile | 	include/sys/fs/Makefile | ||||||
| 	include/sys/fm/Makefile | 	include/sys/fm/Makefile | ||||||
|  | |||||||
| @ -62,7 +62,9 @@ EOF | |||||||
| { | { | ||||||
| 	cat <<-"EOF" | 	cat <<-"EOF" | ||||||
| 	ZFS_MODULE_CFLAGS  = -I$(srctree)/include/zfs | 	ZFS_MODULE_CFLAGS  = -I$(srctree)/include/zfs | ||||||
| 	ZFS_MODULE_CFLAGS += -I$(srctree)/include/zfs/spl | 	ZFS_MODULE_CFLAGS += -I$(srctree)/include/zfs/os/linux/spl | ||||||
|  | 	ZFS_MODULE_CFLAGS += -I$(srctree)/include/zfs/os/linux/zfs | ||||||
|  | 	ZFS_MODULE_CFLAGS += -I$(srctree)/include/zfs/os/linux/kernel | ||||||
| 	ZFS_MODULE_CFLAGS += -include $(srctree)/include/zfs/zfs_config.h | 	ZFS_MODULE_CFLAGS += -include $(srctree)/include/zfs/zfs_config.h | ||||||
| 	ZFS_MODULE_CFLAGS += -std=gnu99 -Wno-declaration-after-statement | 	ZFS_MODULE_CFLAGS += -std=gnu99 -Wno-declaration-after-statement | ||||||
| 	ZFS_MODULE_CPPFLAGS  = -D_KERNEL | 	ZFS_MODULE_CPPFLAGS  = -D_KERNEL | ||||||
|  | |||||||
							
								
								
									
										1
									
								
								include/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								include/.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1 +1,2 @@ | |||||||
| /zfs_gitrev.h | /zfs_gitrev.h | ||||||
|  | /spl | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| SUBDIRS = linux spl sys | SUBDIRS = sys os | ||||||
| 
 | 
 | ||||||
| COMMON_H = \
 | COMMON_H = \
 | ||||||
| 	$(top_srcdir)/include/zfeature_common.h \
 | 	$(top_srcdir)/include/zfeature_common.h \
 | ||||||
|  | |||||||
| @ -1,29 +0,0 @@ | |||||||
| COMMON_H = |  | ||||||
| 
 |  | ||||||
| KERNEL_H = \
 |  | ||||||
| 	$(top_srcdir)/include/linux/dcache_compat.h \
 |  | ||||||
| 	$(top_srcdir)/include/linux/xattr_compat.h \
 |  | ||||||
| 	$(top_srcdir)/include/linux/vfs_compat.h \
 |  | ||||||
| 	$(top_srcdir)/include/linux/blkdev_compat.h \
 |  | ||||||
| 	$(top_srcdir)/include/linux/utsname_compat.h \
 |  | ||||||
| 	$(top_srcdir)/include/linux/kmap_compat.h \
 |  | ||||||
| 	$(top_srcdir)/include/linux/simd.h \
 |  | ||||||
| 	$(top_srcdir)/include/linux/simd_x86.h \
 |  | ||||||
| 	$(top_srcdir)/include/linux/simd_aarch64.h \
 |  | ||||||
| 	$(top_srcdir)/include/linux/mod_compat.h \
 |  | ||||||
| 	$(top_srcdir)/include/linux/page_compat.h \
 |  | ||||||
| 	$(top_srcdir)/include/linux/compiler_compat.h |  | ||||||
| 
 |  | ||||||
| USER_H = |  | ||||||
| 
 |  | ||||||
| EXTRA_DIST = $(COMMON_H) $(KERNEL_H) $(USER_H) |  | ||||||
| 
 |  | ||||||
| if CONFIG_USER |  | ||||||
| libzfsdir = $(includedir)/libzfs/linux |  | ||||||
| libzfs_HEADERS = $(COMMON_H) $(USER_H) |  | ||||||
| endif |  | ||||||
| 
 |  | ||||||
| if CONFIG_KERNEL |  | ||||||
| kerneldir = @prefix@/src/zfs-$(VERSION)/include/linux |  | ||||||
| kernel_HEADERS = $(COMMON_H) $(KERNEL_H) |  | ||||||
| endif |  | ||||||
							
								
								
									
										3
									
								
								include/os/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								include/os/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | |||||||
|  | if BUILD_LINUX | ||||||
|  | SUBDIRS = linux | ||||||
|  | endif | ||||||
							
								
								
									
										1
									
								
								include/os/linux/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								include/os/linux/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | SUBDIRS = kernel spl zfs | ||||||
							
								
								
									
										1
									
								
								include/os/linux/kernel/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								include/os/linux/kernel/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | SUBDIRS = linux | ||||||
							
								
								
									
										29
									
								
								include/os/linux/kernel/linux/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								include/os/linux/kernel/linux/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | |||||||
|  | COMMON_H = | ||||||
|  | 
 | ||||||
|  | KERNEL_H = \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/kernel/linux/dcache_compat.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/kernel/linux/xattr_compat.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/kernel/linux/vfs_compat.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/kernel/linux/blkdev_compat.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/kernel/linux/utsname_compat.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/kernel/linux/kmap_compat.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/kernel/linux/simd.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/kernel/linux/simd_x86.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/kernel/linux/simd_aarch64.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/kernel/linux/mod_compat.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/kernel/linux/page_compat.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/kernel/linux/compiler_compat.h | ||||||
|  | 
 | ||||||
|  | USER_H = | ||||||
|  | 
 | ||||||
|  | EXTRA_DIST = $(COMMON_H) $(KERNEL_H) $(USER_H) | ||||||
|  | 
 | ||||||
|  | if CONFIG_USER | ||||||
|  | libzfsdir = $(includedir)/libzfs/linux | ||||||
|  | libzfs_HEADERS = $(COMMON_H) $(USER_H) | ||||||
|  | endif | ||||||
|  | 
 | ||||||
|  | if CONFIG_KERNEL | ||||||
|  | kerneldir = @prefix@/src/zfs-$(VERSION)/include/linux | ||||||
|  | kernel_HEADERS = $(COMMON_H) $(KERNEL_H) | ||||||
|  | endif | ||||||
| @ -22,8 +22,8 @@ | |||||||
|  * Copyright (C) 2019 Lawrence Livermore National Security, LLC. |  * Copyright (C) 2019 Lawrence Livermore National Security, LLC. | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #ifndef _SIMD_H | #ifndef _LINUX_SIMD_H | ||||||
| #define	_SIMD_H | #define	_LINUX_SIMD_H | ||||||
| 
 | 
 | ||||||
| #if defined(__x86) | #if defined(__x86) | ||||||
| #include <linux/simd_x86.h> | #include <linux/simd_x86.h> | ||||||
| @ -32,10 +32,10 @@ | |||||||
| #include <linux/simd_aarch64.h> | #include <linux/simd_aarch64.h> | ||||||
| #else | #else | ||||||
| 
 | 
 | ||||||
| #define	kfpu_allowed()		1 | #define	kfpu_allowed()		0 | ||||||
| #define	kfpu_initialize(tsk)	do {} while (0) | #define	kfpu_initialize(tsk)	do {} while (0) | ||||||
| #define	kfpu_begin()		do {} while (0) | #define	kfpu_begin()		do {} while (0) | ||||||
| #define	kfpu_end()		do {} while (0) | #define	kfpu_end()		do {} while (0) | ||||||
| 
 | 
 | ||||||
| #endif | #endif | ||||||
| #endif /* _SIMD_H */ | #endif /* _LINUX_SIMD_H */ | ||||||
| @ -32,31 +32,21 @@ | |||||||
|  *	kfpu_end() |  *	kfpu_end() | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #ifndef _SIMD_AARCH64_H | #ifndef _LINUX_SIMD_AARCH64_H | ||||||
| #define	_SIMD_AARCH64_H | #define	_LINUX_SIMD_AARCH64_H | ||||||
| 
 | 
 | ||||||
| #include <sys/isa_defs.h> | #include <sys/isa_defs.h> | ||||||
| 
 | 
 | ||||||
| #if defined(__aarch64__) | #if defined(__aarch64__) | ||||||
| 
 | 
 | ||||||
| #include <sys/types.h> | #include <sys/types.h> | ||||||
| 
 |  | ||||||
| #if defined(_KERNEL) |  | ||||||
| #include <asm/neon.h> | #include <asm/neon.h> | ||||||
|  | 
 | ||||||
| #define	kfpu_allowed()		1 | #define	kfpu_allowed()		1 | ||||||
| #define	kfpu_initialize(tsk)	do {} while (0) | #define	kfpu_initialize(tsk)	do {} while (0) | ||||||
| #define	kfpu_begin()		kernel_neon_begin() | #define	kfpu_begin()		kernel_neon_begin() | ||||||
| #define	kfpu_end()		kernel_neon_end() | #define	kfpu_end()		kernel_neon_end() | ||||||
| #else |  | ||||||
| /*
 |  | ||||||
|  * fpu dummy methods for userspace |  | ||||||
|  */ |  | ||||||
| #define	kfpu_allowed()		1 |  | ||||||
| #define	kfpu_initialize(tsk)	do {} while (0) |  | ||||||
| #define	kfpu_begin()		do {} while (0) |  | ||||||
| #define	kfpu_end()		do {} while (0) |  | ||||||
| #endif /* defined(_KERNEL) */ |  | ||||||
| 
 | 
 | ||||||
| #endif /* __aarch64__ */ | #endif /* __aarch64__ */ | ||||||
| 
 | 
 | ||||||
| #endif /* _SIMD_AARCH64_H */ | #endif /* _LINUX_SIMD_AARCH64_H */ | ||||||
| @ -66,23 +66,14 @@ | |||||||
|  *			also add zfs_avx512vl_available() to feature check. |  *			also add zfs_avx512vl_available() to feature check. | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #ifndef _SIMD_X86_H | #ifndef _LINUX_SIMD_X86_H | ||||||
| #define	_SIMD_X86_H | #define	_LINUX_SIMD_X86_H | ||||||
| 
 |  | ||||||
| #include <sys/isa_defs.h> |  | ||||||
| 
 | 
 | ||||||
| /* only for __x86 */ | /* only for __x86 */ | ||||||
| #if defined(__x86) | #if defined(__x86) | ||||||
| 
 | 
 | ||||||
| #include <sys/types.h> | #include <sys/types.h> | ||||||
| 
 |  | ||||||
| #if defined(_KERNEL) |  | ||||||
| #include <asm/cpufeature.h> | #include <asm/cpufeature.h> | ||||||
| #else |  | ||||||
| #include <cpuid.h> |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| #if defined(_KERNEL) |  | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Disable the WARN_ON_FPU() macro to prevent additional dependencies |  * Disable the WARN_ON_FPU() macro to prevent additional dependencies | ||||||
| @ -222,185 +213,9 @@ kfpu_end(void) | |||||||
| } | } | ||||||
| #endif /* defined(HAVE_KERNEL_FPU) */ | #endif /* defined(HAVE_KERNEL_FPU) */ | ||||||
| 
 | 
 | ||||||
| #else /* defined(_KERNEL) */ |  | ||||||
| /*
 | /*
 | ||||||
|  * FPU dummy methods for user space. |  * Linux kernel provides an interface for CPU feature testing. | ||||||
|  */ |  */ | ||||||
| #define	kfpu_allowed()		1 |  | ||||||
| #define	kfpu_initialize(tsk)	do {} while (0) |  | ||||||
| #define	kfpu_begin()		do {} while (0) |  | ||||||
| #define	kfpu_end()		do {} while (0) |  | ||||||
| #endif /* defined(_KERNEL) */ |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * CPUID feature tests for user-space. Linux kernel provides an interface for |  | ||||||
|  * CPU feature testing. |  | ||||||
|  */ |  | ||||||
| #if !defined(_KERNEL) |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * x86 registers used implicitly by CPUID |  | ||||||
|  */ |  | ||||||
| typedef enum cpuid_regs { |  | ||||||
| 	EAX = 0, |  | ||||||
| 	EBX, |  | ||||||
| 	ECX, |  | ||||||
| 	EDX, |  | ||||||
| 	CPUID_REG_CNT = 4 |  | ||||||
| } cpuid_regs_t; |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * List of instruction sets identified by CPUID |  | ||||||
|  */ |  | ||||||
| typedef enum cpuid_inst_sets { |  | ||||||
| 	SSE = 0, |  | ||||||
| 	SSE2, |  | ||||||
| 	SSE3, |  | ||||||
| 	SSSE3, |  | ||||||
| 	SSE4_1, |  | ||||||
| 	SSE4_2, |  | ||||||
| 	OSXSAVE, |  | ||||||
| 	AVX, |  | ||||||
| 	AVX2, |  | ||||||
| 	BMI1, |  | ||||||
| 	BMI2, |  | ||||||
| 	AVX512F, |  | ||||||
| 	AVX512CD, |  | ||||||
| 	AVX512DQ, |  | ||||||
| 	AVX512BW, |  | ||||||
| 	AVX512IFMA, |  | ||||||
| 	AVX512VBMI, |  | ||||||
| 	AVX512PF, |  | ||||||
| 	AVX512ER, |  | ||||||
| 	AVX512VL, |  | ||||||
| 	AES, |  | ||||||
| 	PCLMULQDQ |  | ||||||
| } cpuid_inst_sets_t; |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * Instruction set descriptor. |  | ||||||
|  */ |  | ||||||
| typedef struct cpuid_feature_desc { |  | ||||||
| 	uint32_t leaf;		/* CPUID leaf */ |  | ||||||
| 	uint32_t subleaf;	/* CPUID sub-leaf */ |  | ||||||
| 	uint32_t flag;		/* bit mask of the feature */ |  | ||||||
| 	cpuid_regs_t reg;	/* which CPUID return register to test */ |  | ||||||
| } cpuid_feature_desc_t; |  | ||||||
| 
 |  | ||||||
| #define	_AVX512F_BIT		(1U << 16) |  | ||||||
| #define	_AVX512CD_BIT		(_AVX512F_BIT | (1U << 28)) |  | ||||||
| #define	_AVX512DQ_BIT		(_AVX512F_BIT | (1U << 17)) |  | ||||||
| #define	_AVX512BW_BIT		(_AVX512F_BIT | (1U << 30)) |  | ||||||
| #define	_AVX512IFMA_BIT		(_AVX512F_BIT | (1U << 21)) |  | ||||||
| #define	_AVX512VBMI_BIT		(1U << 1) /* AVX512F_BIT is on another leaf  */ |  | ||||||
| #define	_AVX512PF_BIT		(_AVX512F_BIT | (1U << 26)) |  | ||||||
| #define	_AVX512ER_BIT		(_AVX512F_BIT | (1U << 27)) |  | ||||||
| #define	_AVX512VL_BIT		(1U << 31) /* if used also check other levels */ |  | ||||||
| #define	_AES_BIT		(1U << 25) |  | ||||||
| #define	_PCLMULQDQ_BIT		(1U << 1) |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * Descriptions of supported instruction sets |  | ||||||
|  */ |  | ||||||
| static const cpuid_feature_desc_t cpuid_features[] = { |  | ||||||
| 	[SSE]		= {1U, 0U,	1U << 25,	EDX	}, |  | ||||||
| 	[SSE2]		= {1U, 0U,	1U << 26,	EDX	}, |  | ||||||
| 	[SSE3]		= {1U, 0U,	1U << 0,	ECX	}, |  | ||||||
| 	[SSSE3]		= {1U, 0U,	1U << 9,	ECX	}, |  | ||||||
| 	[SSE4_1]	= {1U, 0U,	1U << 19,	ECX	}, |  | ||||||
| 	[SSE4_2]	= {1U, 0U,	1U << 20,	ECX	}, |  | ||||||
| 	[OSXSAVE]	= {1U, 0U,	1U << 27,	ECX	}, |  | ||||||
| 	[AVX]		= {1U, 0U,	1U << 28,	ECX	}, |  | ||||||
| 	[AVX2]		= {7U, 0U,	1U << 5,	EBX	}, |  | ||||||
| 	[BMI1]		= {7U, 0U,	1U << 3,	EBX	}, |  | ||||||
| 	[BMI2]		= {7U, 0U,	1U << 8,	EBX	}, |  | ||||||
| 	[AVX512F]	= {7U, 0U, _AVX512F_BIT,	EBX	}, |  | ||||||
| 	[AVX512CD]	= {7U, 0U, _AVX512CD_BIT,	EBX	}, |  | ||||||
| 	[AVX512DQ]	= {7U, 0U, _AVX512DQ_BIT,	EBX	}, |  | ||||||
| 	[AVX512BW]	= {7U, 0U, _AVX512BW_BIT,	EBX	}, |  | ||||||
| 	[AVX512IFMA]	= {7U, 0U, _AVX512IFMA_BIT,	EBX	}, |  | ||||||
| 	[AVX512VBMI]	= {7U, 0U, _AVX512VBMI_BIT,	ECX	}, |  | ||||||
| 	[AVX512PF]	= {7U, 0U, _AVX512PF_BIT,	EBX	}, |  | ||||||
| 	[AVX512ER]	= {7U, 0U, _AVX512ER_BIT,	EBX	}, |  | ||||||
| 	[AVX512VL]	= {7U, 0U, _AVX512ER_BIT,	EBX	}, |  | ||||||
| 	[AES]		= {1U, 0U, _AES_BIT,		ECX	}, |  | ||||||
| 	[PCLMULQDQ]	= {1U, 0U, _PCLMULQDQ_BIT,	ECX	}, |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * Check if OS supports AVX and AVX2 by checking XCR0 |  | ||||||
|  * Only call this function if CPUID indicates that AVX feature is |  | ||||||
|  * supported by the CPU, otherwise it might be an illegal instruction. |  | ||||||
|  */ |  | ||||||
| static inline uint64_t |  | ||||||
| xgetbv(uint32_t index) |  | ||||||
| { |  | ||||||
| 	uint32_t eax, edx; |  | ||||||
| 	/* xgetbv - instruction byte code */ |  | ||||||
| 	__asm__ __volatile__(".byte 0x0f; .byte 0x01; .byte 0xd0" |  | ||||||
| 	    : "=a" (eax), "=d" (edx) |  | ||||||
| 	    : "c" (index)); |  | ||||||
| 
 |  | ||||||
| 	return ((((uint64_t)edx)<<32) | (uint64_t)eax); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * Check if CPU supports a feature |  | ||||||
|  */ |  | ||||||
| static inline boolean_t |  | ||||||
| __cpuid_check_feature(const cpuid_feature_desc_t *desc) |  | ||||||
| { |  | ||||||
| 	uint32_t r[CPUID_REG_CNT]; |  | ||||||
| 
 |  | ||||||
| 	if (__get_cpuid_max(0, NULL) >= desc->leaf) { |  | ||||||
| 		/*
 |  | ||||||
| 		 * __cpuid_count is needed to properly check |  | ||||||
| 		 * for AVX2. It is a macro, so return parameters |  | ||||||
| 		 * are passed by value. |  | ||||||
| 		 */ |  | ||||||
| 		__cpuid_count(desc->leaf, desc->subleaf, |  | ||||||
| 		    r[EAX], r[EBX], r[ECX], r[EDX]); |  | ||||||
| 		return ((r[desc->reg] & desc->flag) == desc->flag); |  | ||||||
| 	} |  | ||||||
| 	return (B_FALSE); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #define	CPUID_FEATURE_CHECK(name, id)				\ |  | ||||||
| static inline boolean_t						\ |  | ||||||
| __cpuid_has_ ## name(void)					\ |  | ||||||
| {								\ |  | ||||||
| 	return (__cpuid_check_feature(&cpuid_features[id]));	\ |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * Define functions for user-space CPUID features testing |  | ||||||
|  */ |  | ||||||
| CPUID_FEATURE_CHECK(sse, SSE); |  | ||||||
| CPUID_FEATURE_CHECK(sse2, SSE2); |  | ||||||
| CPUID_FEATURE_CHECK(sse3, SSE3); |  | ||||||
| CPUID_FEATURE_CHECK(ssse3, SSSE3); |  | ||||||
| CPUID_FEATURE_CHECK(sse4_1, SSE4_1); |  | ||||||
| CPUID_FEATURE_CHECK(sse4_2, SSE4_2); |  | ||||||
| CPUID_FEATURE_CHECK(avx, AVX); |  | ||||||
| CPUID_FEATURE_CHECK(avx2, AVX2); |  | ||||||
| CPUID_FEATURE_CHECK(osxsave, OSXSAVE); |  | ||||||
| CPUID_FEATURE_CHECK(bmi1, BMI1); |  | ||||||
| CPUID_FEATURE_CHECK(bmi2, BMI2); |  | ||||||
| CPUID_FEATURE_CHECK(avx512f, AVX512F); |  | ||||||
| CPUID_FEATURE_CHECK(avx512cd, AVX512CD); |  | ||||||
| CPUID_FEATURE_CHECK(avx512dq, AVX512DQ); |  | ||||||
| CPUID_FEATURE_CHECK(avx512bw, AVX512BW); |  | ||||||
| CPUID_FEATURE_CHECK(avx512ifma, AVX512IFMA); |  | ||||||
| CPUID_FEATURE_CHECK(avx512vbmi, AVX512VBMI); |  | ||||||
| CPUID_FEATURE_CHECK(avx512pf, AVX512PF); |  | ||||||
| CPUID_FEATURE_CHECK(avx512er, AVX512ER); |  | ||||||
| CPUID_FEATURE_CHECK(avx512vl, AVX512VL); |  | ||||||
| CPUID_FEATURE_CHECK(aes, AES); |  | ||||||
| CPUID_FEATURE_CHECK(pclmulqdq, PCLMULQDQ); |  | ||||||
| 
 |  | ||||||
| #endif /* !defined(_KERNEL) */ |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| /*
 | /*
 | ||||||
|  * Detect register set support |  * Detect register set support | ||||||
|  */ |  */ | ||||||
| @ -410,16 +225,11 @@ __simd_state_enabled(const uint64_t state) | |||||||
| 	boolean_t has_osxsave; | 	boolean_t has_osxsave; | ||||||
| 	uint64_t xcr0; | 	uint64_t xcr0; | ||||||
| 
 | 
 | ||||||
| #if defined(_KERNEL) |  | ||||||
| #if defined(X86_FEATURE_OSXSAVE) | #if defined(X86_FEATURE_OSXSAVE) | ||||||
| 	has_osxsave = !!boot_cpu_has(X86_FEATURE_OSXSAVE); | 	has_osxsave = !!boot_cpu_has(X86_FEATURE_OSXSAVE); | ||||||
| #else | #else | ||||||
| 	has_osxsave = B_FALSE; | 	has_osxsave = B_FALSE; | ||||||
| #endif | #endif | ||||||
| #elif !defined(_KERNEL) |  | ||||||
| 	has_osxsave = __cpuid_has_osxsave(); |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| 	if (!has_osxsave) | 	if (!has_osxsave) | ||||||
| 		return (B_FALSE); | 		return (B_FALSE); | ||||||
| 
 | 
 | ||||||
| @ -433,18 +243,13 @@ __simd_state_enabled(const uint64_t state) | |||||||
| #define	__ymm_enabled() __simd_state_enabled(_XSTATE_SSE_AVX) | #define	__ymm_enabled() __simd_state_enabled(_XSTATE_SSE_AVX) | ||||||
| #define	__zmm_enabled() __simd_state_enabled(_XSTATE_AVX512) | #define	__zmm_enabled() __simd_state_enabled(_XSTATE_AVX512) | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| /*
 | /*
 | ||||||
|  * Check if SSE instruction set is available |  * Check if SSE instruction set is available | ||||||
|  */ |  */ | ||||||
| static inline boolean_t | static inline boolean_t | ||||||
| zfs_sse_available(void) | zfs_sse_available(void) | ||||||
| { | { | ||||||
| #if defined(_KERNEL) |  | ||||||
| 	return (!!boot_cpu_has(X86_FEATURE_XMM)); | 	return (!!boot_cpu_has(X86_FEATURE_XMM)); | ||||||
| #elif !defined(_KERNEL) |  | ||||||
| 	return (__cpuid_has_sse()); |  | ||||||
| #endif |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
| @ -453,11 +258,7 @@ zfs_sse_available(void) | |||||||
| static inline boolean_t | static inline boolean_t | ||||||
| zfs_sse2_available(void) | zfs_sse2_available(void) | ||||||
| { | { | ||||||
| #if defined(_KERNEL) |  | ||||||
| 	return (!!boot_cpu_has(X86_FEATURE_XMM2)); | 	return (!!boot_cpu_has(X86_FEATURE_XMM2)); | ||||||
| #elif !defined(_KERNEL) |  | ||||||
| 	return (__cpuid_has_sse2()); |  | ||||||
| #endif |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
| @ -466,11 +267,7 @@ zfs_sse2_available(void) | |||||||
| static inline boolean_t | static inline boolean_t | ||||||
| zfs_sse3_available(void) | zfs_sse3_available(void) | ||||||
| { | { | ||||||
| #if defined(_KERNEL) |  | ||||||
| 	return (!!boot_cpu_has(X86_FEATURE_XMM3)); | 	return (!!boot_cpu_has(X86_FEATURE_XMM3)); | ||||||
| #elif !defined(_KERNEL) |  | ||||||
| 	return (__cpuid_has_sse3()); |  | ||||||
| #endif |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
| @ -479,11 +276,7 @@ zfs_sse3_available(void) | |||||||
| static inline boolean_t | static inline boolean_t | ||||||
| zfs_ssse3_available(void) | zfs_ssse3_available(void) | ||||||
| { | { | ||||||
| #if defined(_KERNEL) |  | ||||||
| 	return (!!boot_cpu_has(X86_FEATURE_SSSE3)); | 	return (!!boot_cpu_has(X86_FEATURE_SSSE3)); | ||||||
| #elif !defined(_KERNEL) |  | ||||||
| 	return (__cpuid_has_ssse3()); |  | ||||||
| #endif |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
| @ -492,11 +285,7 @@ zfs_ssse3_available(void) | |||||||
| static inline boolean_t | static inline boolean_t | ||||||
| zfs_sse4_1_available(void) | zfs_sse4_1_available(void) | ||||||
| { | { | ||||||
| #if defined(_KERNEL) |  | ||||||
| 	return (!!boot_cpu_has(X86_FEATURE_XMM4_1)); | 	return (!!boot_cpu_has(X86_FEATURE_XMM4_1)); | ||||||
| #elif !defined(_KERNEL) |  | ||||||
| 	return (__cpuid_has_sse4_1()); |  | ||||||
| #endif |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
| @ -505,11 +294,7 @@ zfs_sse4_1_available(void) | |||||||
| static inline boolean_t | static inline boolean_t | ||||||
| zfs_sse4_2_available(void) | zfs_sse4_2_available(void) | ||||||
| { | { | ||||||
| #if defined(_KERNEL) |  | ||||||
| 	return (!!boot_cpu_has(X86_FEATURE_XMM4_2)); | 	return (!!boot_cpu_has(X86_FEATURE_XMM4_2)); | ||||||
| #elif !defined(_KERNEL) |  | ||||||
| 	return (__cpuid_has_sse4_2()); |  | ||||||
| #endif |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
| @ -518,14 +303,7 @@ zfs_sse4_2_available(void) | |||||||
| static inline boolean_t | static inline boolean_t | ||||||
| zfs_avx_available(void) | zfs_avx_available(void) | ||||||
| { | { | ||||||
| 	boolean_t has_avx; | 	return (boot_cpu_has(X86_FEATURE_AVX) && __ymm_enabled()); | ||||||
| #if defined(_KERNEL) |  | ||||||
| 	has_avx = !!boot_cpu_has(X86_FEATURE_AVX); |  | ||||||
| #elif !defined(_KERNEL) |  | ||||||
| 	has_avx = __cpuid_has_avx(); |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| 	return (has_avx && __ymm_enabled()); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
| @ -534,14 +312,7 @@ zfs_avx_available(void) | |||||||
| static inline boolean_t | static inline boolean_t | ||||||
| zfs_avx2_available(void) | zfs_avx2_available(void) | ||||||
| { | { | ||||||
| 	boolean_t has_avx2; | 	return (boot_cpu_has(X86_FEATURE_AVX2) && __ymm_enabled()); | ||||||
| #if defined(_KERNEL) |  | ||||||
| 	has_avx2 = !!boot_cpu_has(X86_FEATURE_AVX2); |  | ||||||
| #elif !defined(_KERNEL) |  | ||||||
| 	has_avx2 = __cpuid_has_avx2(); |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| 	return (has_avx2 && __ymm_enabled()); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
| @ -550,15 +321,11 @@ zfs_avx2_available(void) | |||||||
| static inline boolean_t | static inline boolean_t | ||||||
| zfs_bmi1_available(void) | zfs_bmi1_available(void) | ||||||
| { | { | ||||||
| #if defined(_KERNEL) |  | ||||||
| #if defined(X86_FEATURE_BMI1) | #if defined(X86_FEATURE_BMI1) | ||||||
| 	return (!!boot_cpu_has(X86_FEATURE_BMI1)); | 	return (!!boot_cpu_has(X86_FEATURE_BMI1)); | ||||||
| #else | #else | ||||||
| 	return (B_FALSE); | 	return (B_FALSE); | ||||||
| #endif | #endif | ||||||
| #elif !defined(_KERNEL) |  | ||||||
| 	return (__cpuid_has_bmi1()); |  | ||||||
| #endif |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
| @ -567,15 +334,11 @@ zfs_bmi1_available(void) | |||||||
| static inline boolean_t | static inline boolean_t | ||||||
| zfs_bmi2_available(void) | zfs_bmi2_available(void) | ||||||
| { | { | ||||||
| #if defined(_KERNEL) |  | ||||||
| #if defined(X86_FEATURE_BMI2) | #if defined(X86_FEATURE_BMI2) | ||||||
| 	return (!!boot_cpu_has(X86_FEATURE_BMI2)); | 	return (!!boot_cpu_has(X86_FEATURE_BMI2)); | ||||||
| #else | #else | ||||||
| 	return (B_FALSE); | 	return (B_FALSE); | ||||||
| #endif | #endif | ||||||
| #elif !defined(_KERNEL) |  | ||||||
| 	return (__cpuid_has_bmi2()); |  | ||||||
| #endif |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
| @ -584,15 +347,11 @@ zfs_bmi2_available(void) | |||||||
| static inline boolean_t | static inline boolean_t | ||||||
| zfs_aes_available(void) | zfs_aes_available(void) | ||||||
| { | { | ||||||
| #if defined(_KERNEL) |  | ||||||
| #if defined(X86_FEATURE_AES) | #if defined(X86_FEATURE_AES) | ||||||
| 	return (!!boot_cpu_has(X86_FEATURE_AES)); | 	return (!!boot_cpu_has(X86_FEATURE_AES)); | ||||||
| #else | #else | ||||||
| 	return (B_FALSE); | 	return (B_FALSE); | ||||||
| #endif | #endif | ||||||
| #elif !defined(_KERNEL) |  | ||||||
| 	return (__cpuid_has_aes()); |  | ||||||
| #endif |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
| @ -601,15 +360,11 @@ zfs_aes_available(void) | |||||||
| static inline boolean_t | static inline boolean_t | ||||||
| zfs_pclmulqdq_available(void) | zfs_pclmulqdq_available(void) | ||||||
| { | { | ||||||
| #if defined(_KERNEL) |  | ||||||
| #if defined(X86_FEATURE_PCLMULQDQ) | #if defined(X86_FEATURE_PCLMULQDQ) | ||||||
| 	return (!!boot_cpu_has(X86_FEATURE_PCLMULQDQ)); | 	return (!!boot_cpu_has(X86_FEATURE_PCLMULQDQ)); | ||||||
| #else | #else | ||||||
| 	return (B_FALSE); | 	return (B_FALSE); | ||||||
| #endif | #endif | ||||||
| #elif !defined(_KERNEL) |  | ||||||
| 	return (__cpuid_has_pclmulqdq()); |  | ||||||
| #endif |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
| @ -628,187 +383,141 @@ zfs_pclmulqdq_available(void) | |||||||
|  * AVX512VBMI	Vector Byte Manipulation Instructions |  * AVX512VBMI	Vector Byte Manipulation Instructions | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| 
 | /*
 | ||||||
| /* Check if AVX512F instruction set is available */ |  * Check if AVX512F instruction set is available | ||||||
|  |  */ | ||||||
| static inline boolean_t | static inline boolean_t | ||||||
| zfs_avx512f_available(void) | zfs_avx512f_available(void) | ||||||
| { | { | ||||||
| 	boolean_t has_avx512 = B_FALSE; | 	boolean_t has_avx512 = B_FALSE; | ||||||
| 
 | 
 | ||||||
| #if defined(_KERNEL) |  | ||||||
| #if defined(X86_FEATURE_AVX512F) | #if defined(X86_FEATURE_AVX512F) | ||||||
| 	has_avx512 = !!boot_cpu_has(X86_FEATURE_AVX512F); | 	has_avx512 = !!boot_cpu_has(X86_FEATURE_AVX512F); | ||||||
| #else |  | ||||||
| 	has_avx512 = B_FALSE; |  | ||||||
| #endif | #endif | ||||||
| #elif !defined(_KERNEL) |  | ||||||
| 	has_avx512 = __cpuid_has_avx512f(); |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| 	return (has_avx512 && __zmm_enabled()); | 	return (has_avx512 && __zmm_enabled()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Check if AVX512CD instruction set is available */ | /*
 | ||||||
|  |  * Check if AVX512CD instruction set is available | ||||||
|  |  */ | ||||||
| static inline boolean_t | static inline boolean_t | ||||||
| zfs_avx512cd_available(void) | zfs_avx512cd_available(void) | ||||||
| { | { | ||||||
| 	boolean_t has_avx512 = B_FALSE; | 	boolean_t has_avx512 = B_FALSE; | ||||||
| 
 | 
 | ||||||
| #if defined(_KERNEL) |  | ||||||
| #if defined(X86_FEATURE_AVX512CD) | #if defined(X86_FEATURE_AVX512CD) | ||||||
| 	has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) && | 	has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) && | ||||||
| 	    boot_cpu_has(X86_FEATURE_AVX512CD); | 	    boot_cpu_has(X86_FEATURE_AVX512CD); | ||||||
| #else |  | ||||||
| 	has_avx512 = B_FALSE; |  | ||||||
| #endif | #endif | ||||||
| #elif !defined(_KERNEL) |  | ||||||
| 	has_avx512 = __cpuid_has_avx512cd(); |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| 	return (has_avx512 && __zmm_enabled()); | 	return (has_avx512 && __zmm_enabled()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Check if AVX512ER instruction set is available */ | /*
 | ||||||
|  |  * Check if AVX512ER instruction set is available | ||||||
|  |  */ | ||||||
| static inline boolean_t | static inline boolean_t | ||||||
| zfs_avx512er_available(void) | zfs_avx512er_available(void) | ||||||
| { | { | ||||||
| 	boolean_t has_avx512 = B_FALSE; | 	boolean_t has_avx512 = B_FALSE; | ||||||
| 
 | 
 | ||||||
| #if defined(_KERNEL) |  | ||||||
| #if defined(X86_FEATURE_AVX512ER) | #if defined(X86_FEATURE_AVX512ER) | ||||||
| 	has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) && | 	has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) && | ||||||
| 	    boot_cpu_has(X86_FEATURE_AVX512ER); | 	    boot_cpu_has(X86_FEATURE_AVX512ER); | ||||||
| #else |  | ||||||
| 	has_avx512 = B_FALSE; |  | ||||||
| #endif | #endif | ||||||
| #elif !defined(_KERNEL) |  | ||||||
| 	has_avx512 = __cpuid_has_avx512er(); |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| 	return (has_avx512 && __zmm_enabled()); | 	return (has_avx512 && __zmm_enabled()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Check if AVX512PF instruction set is available */ | /*
 | ||||||
|  |  * Check if AVX512PF instruction set is available | ||||||
|  |  */ | ||||||
| static inline boolean_t | static inline boolean_t | ||||||
| zfs_avx512pf_available(void) | zfs_avx512pf_available(void) | ||||||
| { | { | ||||||
| 	boolean_t has_avx512 = B_FALSE; | 	boolean_t has_avx512 = B_FALSE; | ||||||
| 
 | 
 | ||||||
| #if defined(_KERNEL) |  | ||||||
| #if defined(X86_FEATURE_AVX512PF) | #if defined(X86_FEATURE_AVX512PF) | ||||||
| 	has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) && | 	has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) && | ||||||
| 	    boot_cpu_has(X86_FEATURE_AVX512PF); | 	    boot_cpu_has(X86_FEATURE_AVX512PF); | ||||||
| #else |  | ||||||
| 	has_avx512 = B_FALSE; |  | ||||||
| #endif | #endif | ||||||
| #elif !defined(_KERNEL) |  | ||||||
| 	has_avx512 = __cpuid_has_avx512pf(); |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| 	return (has_avx512 && __zmm_enabled()); | 	return (has_avx512 && __zmm_enabled()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Check if AVX512BW instruction set is available */ | /*
 | ||||||
|  |  * Check if AVX512BW instruction set is available | ||||||
|  |  */ | ||||||
| static inline boolean_t | static inline boolean_t | ||||||
| zfs_avx512bw_available(void) | zfs_avx512bw_available(void) | ||||||
| { | { | ||||||
| 	boolean_t has_avx512 = B_FALSE; | 	boolean_t has_avx512 = B_FALSE; | ||||||
| 
 | 
 | ||||||
| #if defined(_KERNEL) |  | ||||||
| #if defined(X86_FEATURE_AVX512BW) | #if defined(X86_FEATURE_AVX512BW) | ||||||
| 	has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) && | 	has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) && | ||||||
| 	    boot_cpu_has(X86_FEATURE_AVX512BW); | 	    boot_cpu_has(X86_FEATURE_AVX512BW); | ||||||
| #else |  | ||||||
| 	has_avx512 = B_FALSE; |  | ||||||
| #endif |  | ||||||
| #elif !defined(_KERNEL) |  | ||||||
| 	has_avx512 = __cpuid_has_avx512bw(); |  | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 	return (has_avx512 && __zmm_enabled()); | 	return (has_avx512 && __zmm_enabled()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Check if AVX512DQ instruction set is available */ | /*
 | ||||||
|  |  * Check if AVX512DQ instruction set is available | ||||||
|  |  */ | ||||||
| static inline boolean_t | static inline boolean_t | ||||||
| zfs_avx512dq_available(void) | zfs_avx512dq_available(void) | ||||||
| { | { | ||||||
| 	boolean_t has_avx512 = B_FALSE; | 	boolean_t has_avx512 = B_FALSE; | ||||||
| 
 | 
 | ||||||
| #if defined(_KERNEL) |  | ||||||
| #if defined(X86_FEATURE_AVX512DQ) | #if defined(X86_FEATURE_AVX512DQ) | ||||||
| 	has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) && | 	has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) && | ||||||
| 	    boot_cpu_has(X86_FEATURE_AVX512DQ); | 	    boot_cpu_has(X86_FEATURE_AVX512DQ); | ||||||
| #else |  | ||||||
| 	has_avx512 = B_FALSE; |  | ||||||
| #endif | #endif | ||||||
| #elif !defined(_KERNEL) |  | ||||||
| 	has_avx512 = __cpuid_has_avx512dq(); |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| 	return (has_avx512 && __zmm_enabled()); | 	return (has_avx512 && __zmm_enabled()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Check if AVX512VL instruction set is available */ | /*
 | ||||||
|  |  * Check if AVX512VL instruction set is available | ||||||
|  |  */ | ||||||
| static inline boolean_t | static inline boolean_t | ||||||
| zfs_avx512vl_available(void) | zfs_avx512vl_available(void) | ||||||
| { | { | ||||||
| 	boolean_t has_avx512 = B_FALSE; | 	boolean_t has_avx512 = B_FALSE; | ||||||
| 
 | 
 | ||||||
| #if defined(_KERNEL) |  | ||||||
| #if defined(X86_FEATURE_AVX512VL) | #if defined(X86_FEATURE_AVX512VL) | ||||||
| 	has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) && | 	has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) && | ||||||
| 	    boot_cpu_has(X86_FEATURE_AVX512VL); | 	    boot_cpu_has(X86_FEATURE_AVX512VL); | ||||||
| #else |  | ||||||
| 	has_avx512 = B_FALSE; |  | ||||||
| #endif | #endif | ||||||
| #elif !defined(_KERNEL) |  | ||||||
| 	has_avx512 = __cpuid_has_avx512vl(); |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| 	return (has_avx512 && __zmm_enabled()); | 	return (has_avx512 && __zmm_enabled()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Check if AVX512IFMA instruction set is available */ | /*
 | ||||||
|  |  * Check if AVX512IFMA instruction set is available | ||||||
|  |  */ | ||||||
| static inline boolean_t | static inline boolean_t | ||||||
| zfs_avx512ifma_available(void) | zfs_avx512ifma_available(void) | ||||||
| { | { | ||||||
| 	boolean_t has_avx512 = B_FALSE; | 	boolean_t has_avx512 = B_FALSE; | ||||||
| 
 | 
 | ||||||
| #if defined(_KERNEL) |  | ||||||
| #if defined(X86_FEATURE_AVX512IFMA) | #if defined(X86_FEATURE_AVX512IFMA) | ||||||
| 	has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) && | 	has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) && | ||||||
| 	    boot_cpu_has(X86_FEATURE_AVX512IFMA); | 	    boot_cpu_has(X86_FEATURE_AVX512IFMA); | ||||||
| #else |  | ||||||
| 	has_avx512 = B_FALSE; |  | ||||||
| #endif | #endif | ||||||
| #elif !defined(_KERNEL) |  | ||||||
| 	has_avx512 = __cpuid_has_avx512ifma(); |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| 	return (has_avx512 && __zmm_enabled()); | 	return (has_avx512 && __zmm_enabled()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /* Check if AVX512VBMI instruction set is available */ | /*
 | ||||||
|  |  * Check if AVX512VBMI instruction set is available | ||||||
|  |  */ | ||||||
| static inline boolean_t | static inline boolean_t | ||||||
| zfs_avx512vbmi_available(void) | zfs_avx512vbmi_available(void) | ||||||
| { | { | ||||||
| 	boolean_t has_avx512 = B_FALSE; | 	boolean_t has_avx512 = B_FALSE; | ||||||
| 
 | 
 | ||||||
| #if defined(_KERNEL) |  | ||||||
| #if defined(X86_FEATURE_AVX512VBMI) | #if defined(X86_FEATURE_AVX512VBMI) | ||||||
| 	has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) && | 	has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) && | ||||||
| 	    boot_cpu_has(X86_FEATURE_AVX512VBMI); | 	    boot_cpu_has(X86_FEATURE_AVX512VBMI); | ||||||
| #else |  | ||||||
| 	has_avx512 = B_FALSE; |  | ||||||
| #endif | #endif | ||||||
| #elif !defined(_KERNEL) |  | ||||||
| 	has_avx512 = __cpuid_has_avx512f() && |  | ||||||
| 	    __cpuid_has_avx512vbmi(); |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| 	return (has_avx512 && __zmm_enabled()); | 	return (has_avx512 && __zmm_enabled()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #endif /* defined(__x86) */ | #endif /* defined(__x86) */ | ||||||
| 
 | 
 | ||||||
| #endif /* _SIMD_X86_H */ | #endif /* _LINUX_SIMD_X86_H */ | ||||||
| @ -1,5 +1,5 @@ | |||||||
| KERNEL_H = \
 | KERNEL_H = \
 | ||||||
| 	$(top_srcdir)/include/spl/rpc/xdr.h | 	$(top_srcdir)/include/os/linux/spl/rpc/xdr.h | ||||||
| 
 | 
 | ||||||
| if CONFIG_KERNEL | if CONFIG_KERNEL | ||||||
| kerneldir = @prefix@/src/zfs-$(VERSION)/include/spl/rpc | kerneldir = @prefix@/src/zfs-$(VERSION)/include/spl/rpc | ||||||
							
								
								
									
										62
									
								
								include/os/linux/spl/sys/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								include/os/linux/spl/sys/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,62 @@ | |||||||
|  | KERNEL_H = \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/acl.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/atomic.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/byteorder.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/callb.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/callo.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/cmn_err.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/condvar.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/console.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/cred.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/ctype.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/debug.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/disp.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/dkio.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/errno.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/fcntl.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/file.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/inttypes.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/isa_defs.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/kmem_cache.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/kmem.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/kobj.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/kstat.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/list.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/mode.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/mutex.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/param.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/processor.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/proc.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/procfs_list.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/random.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/rwlock.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/shrinker.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/sid.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/signal.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/simd.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/stat.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/strings.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/sunddi.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/sysmacros.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/systeminfo.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/taskq.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/thread.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/time.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/timer.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/tsd.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/types32.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/types.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/uio.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/user.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/vfs.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/vmem.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/vmsystm.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/vnode.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/wait.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/zmod.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/spl/sys/zone.h | ||||||
|  | 
 | ||||||
|  | if CONFIG_KERNEL | ||||||
|  | kerneldir = @prefix@/src/zfs-$(VERSION)/include/spl/sys | ||||||
|  | kernel_HEADERS = $(KERNEL_H) | ||||||
|  | endif | ||||||
							
								
								
									
										31
									
								
								include/os/linux/spl/sys/simd.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								include/os/linux/spl/sys/simd.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | |||||||
|  | /*
 | ||||||
|  |  *  Copyright (C) 2007-2010 Lawrence Livermore National Security, LLC. | ||||||
|  |  *  Copyright (C) 2007 The Regents of the University of California. | ||||||
|  |  *  Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). | ||||||
|  |  *  Written by Brian Behlendorf <behlendorf1@llnl.gov>. | ||||||
|  |  *  UCRL-CODE-235197 | ||||||
|  |  * | ||||||
|  |  *  This file is part of the SPL, Solaris Porting Layer. | ||||||
|  |  *  For details, see <http://zfsonlinux.org/>.
 | ||||||
|  |  * | ||||||
|  |  *  The SPL is free software; you can redistribute it and/or modify it | ||||||
|  |  *  under the terms of the GNU General Public License as published by the | ||||||
|  |  *  Free Software Foundation; either version 2 of the License, or (at your | ||||||
|  |  *  option) any later version. | ||||||
|  |  * | ||||||
|  |  *  The SPL is distributed in the hope that it will be useful, but WITHOUT | ||||||
|  |  *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||||||
|  |  *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License | ||||||
|  |  *  for more details. | ||||||
|  |  * | ||||||
|  |  *  You should have received a copy of the GNU General Public License along | ||||||
|  |  *  with the SPL.  If not, see <http://www.gnu.org/licenses/>.
 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef _SPL_SYS_SIMD_H | ||||||
|  | #define	_SPL_SYS_SIMD_H | ||||||
|  | 
 | ||||||
|  | #include <sys/isa_defs.h> | ||||||
|  | #include <linux/simd.h> | ||||||
|  | 
 | ||||||
|  | #endif /* _SPL_SYS_SIMD_H */ | ||||||
							
								
								
									
										1
									
								
								include/os/linux/zfs/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								include/os/linux/zfs/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | SUBDIRS = sys | ||||||
							
								
								
									
										12
									
								
								include/os/linux/zfs/sys/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								include/os/linux/zfs/sys/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | |||||||
|  | KERNEL_H = \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/zfs/sys/policy.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/zfs/sys/zfs_ctldir.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/zfs/sys/zfs_dir.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/zfs/sys/zfs_vfsops.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/zfs/sys/zfs_vnops.h \
 | ||||||
|  | 	$(top_srcdir)/include/os/linux/zfs/sys/zpl.h | ||||||
|  | 
 | ||||||
|  | if CONFIG_KERNEL | ||||||
|  | kerneldir = @prefix@/src/zfs-$(VERSION)/include/sys | ||||||
|  | kernel_HEADERS = $(KERNEL_H) | ||||||
|  | endif | ||||||
| @ -1,61 +0,0 @@ | |||||||
| KERNEL_H = \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/acl.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/atomic.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/byteorder.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/callb.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/callo.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/cmn_err.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/condvar.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/console.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/cred.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/ctype.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/debug.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/disp.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/dkio.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/errno.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/fcntl.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/file.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/inttypes.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/isa_defs.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/kmem_cache.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/kmem.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/kobj.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/kstat.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/list.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/mode.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/mutex.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/param.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/processor.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/proc.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/procfs_list.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/random.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/rwlock.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/shrinker.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/sid.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/signal.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/stat.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/strings.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/sunddi.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/sysmacros.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/systeminfo.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/taskq.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/thread.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/time.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/timer.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/tsd.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/types32.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/types.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/uio.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/user.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/vfs.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/vmem.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/vmsystm.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/vnode.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/wait.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/zmod.h \
 |  | ||||||
| 	$(top_srcdir)/include/spl/sys/zone.h |  | ||||||
| 
 |  | ||||||
| if CONFIG_KERNEL |  | ||||||
| kerneldir = @prefix@/src/zfs-$(VERSION)/include/spl/sys |  | ||||||
| kernel_HEADERS = $(KERNEL_H) |  | ||||||
| endif |  | ||||||
| @ -52,7 +52,6 @@ COMMON_H = \ | |||||||
| 	$(top_srcdir)/include/sys/nvpair_impl.h \
 | 	$(top_srcdir)/include/sys/nvpair_impl.h \
 | ||||||
| 	$(top_srcdir)/include/sys/objlist.h \
 | 	$(top_srcdir)/include/sys/objlist.h \
 | ||||||
| 	$(top_srcdir)/include/sys/pathname.h \
 | 	$(top_srcdir)/include/sys/pathname.h \
 | ||||||
| 	$(top_srcdir)/include/sys/policy.h \
 |  | ||||||
| 	$(top_srcdir)/include/sys/range_tree.h \
 | 	$(top_srcdir)/include/sys/range_tree.h \
 | ||||||
| 	$(top_srcdir)/include/sys/refcount.h \
 | 	$(top_srcdir)/include/sys/refcount.h \
 | ||||||
| 	$(top_srcdir)/include/sys/rrwlock.h \
 | 	$(top_srcdir)/include/sys/rrwlock.h \
 | ||||||
| @ -116,10 +115,8 @@ COMMON_H = \ | |||||||
| 	$(top_srcdir)/include/sys/zfeature.h \
 | 	$(top_srcdir)/include/sys/zfeature.h \
 | ||||||
| 	$(top_srcdir)/include/sys/zfs_acl.h \
 | 	$(top_srcdir)/include/sys/zfs_acl.h \
 | ||||||
| 	$(top_srcdir)/include/sys/zfs_context.h \
 | 	$(top_srcdir)/include/sys/zfs_context.h \
 | ||||||
| 	$(top_srcdir)/include/sys/zfs_ctldir.h \
 |  | ||||||
| 	$(top_srcdir)/include/sys/zfs_debug.h \
 | 	$(top_srcdir)/include/sys/zfs_debug.h \
 | ||||||
| 	$(top_srcdir)/include/sys/zfs_delay.h \
 | 	$(top_srcdir)/include/sys/zfs_delay.h \
 | ||||||
| 	$(top_srcdir)/include/sys/zfs_dir.h \
 |  | ||||||
| 	$(top_srcdir)/include/sys/zfs_fuid.h \
 | 	$(top_srcdir)/include/sys/zfs_fuid.h \
 | ||||||
| 	$(top_srcdir)/include/sys/zfs_project.h \
 | 	$(top_srcdir)/include/sys/zfs_project.h \
 | ||||||
| 	$(top_srcdir)/include/sys/zfs_ratelimit.h \
 | 	$(top_srcdir)/include/sys/zfs_ratelimit.h \
 | ||||||
| @ -127,8 +124,6 @@ COMMON_H = \ | |||||||
| 	$(top_srcdir)/include/sys/zfs_sa.h \
 | 	$(top_srcdir)/include/sys/zfs_sa.h \
 | ||||||
| 	$(top_srcdir)/include/sys/zfs_stat.h \
 | 	$(top_srcdir)/include/sys/zfs_stat.h \
 | ||||||
| 	$(top_srcdir)/include/sys/zfs_sysfs.h \
 | 	$(top_srcdir)/include/sys/zfs_sysfs.h \
 | ||||||
| 	$(top_srcdir)/include/sys/zfs_vfsops.h \
 |  | ||||||
| 	$(top_srcdir)/include/sys/zfs_vnops.h \
 |  | ||||||
| 	$(top_srcdir)/include/sys/zfs_znode.h \
 | 	$(top_srcdir)/include/sys/zfs_znode.h \
 | ||||||
| 	$(top_srcdir)/include/sys/zil.h \
 | 	$(top_srcdir)/include/sys/zil.h \
 | ||||||
| 	$(top_srcdir)/include/sys/zil_impl.h \
 | 	$(top_srcdir)/include/sys/zil_impl.h \
 | ||||||
| @ -144,7 +139,6 @@ COMMON_H = \ | |||||||
| KERNEL_H = \
 | KERNEL_H = \
 | ||||||
| 	$(top_srcdir)/include/sys/zfs_ioctl.h \
 | 	$(top_srcdir)/include/sys/zfs_ioctl.h \
 | ||||||
| 	$(top_srcdir)/include/sys/zfs_onexit.h \
 | 	$(top_srcdir)/include/sys/zfs_onexit.h \
 | ||||||
| 	${top_srcdir}/include/sys/zpl.h \
 |  | ||||||
| 	$(top_srcdir)/include/sys/zvol.h | 	$(top_srcdir)/include/sys/zvol.h | ||||||
| 
 | 
 | ||||||
| USER_H = | USER_H = | ||||||
|  | |||||||
| @ -33,6 +33,7 @@ libspl_HEADERS = \ | |||||||
| 	$(top_srcdir)/lib/libspl/include/sys/priv.h \
 | 	$(top_srcdir)/lib/libspl/include/sys/priv.h \
 | ||||||
| 	$(top_srcdir)/lib/libspl/include/sys/processor.h \
 | 	$(top_srcdir)/lib/libspl/include/sys/processor.h \
 | ||||||
| 	$(top_srcdir)/lib/libspl/include/sys/signal.h \
 | 	$(top_srcdir)/lib/libspl/include/sys/signal.h \
 | ||||||
|  | 	$(top_srcdir)/lib/libspl/include/sys/simd.h \
 | ||||||
| 	$(top_srcdir)/lib/libspl/include/sys/stack.h \
 | 	$(top_srcdir)/lib/libspl/include/sys/stack.h \
 | ||||||
| 	$(top_srcdir)/lib/libspl/include/sys/stat.h \
 | 	$(top_srcdir)/lib/libspl/include/sys/stat.h \
 | ||||||
| 	$(top_srcdir)/lib/libspl/include/sys/stdtypes.h \
 | 	$(top_srcdir)/lib/libspl/include/sys/stdtypes.h \
 | ||||||
|  | |||||||
							
								
								
									
										448
									
								
								lib/libspl/include/sys/simd.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										448
									
								
								lib/libspl/include/sys/simd.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,448 @@ | |||||||
|  | /*
 | ||||||
|  |  * CDDL HEADER START | ||||||
|  |  * | ||||||
|  |  * The contents of this file are subject to the terms of the | ||||||
|  |  * Common Development and Distribution License, Version 1.0 only | ||||||
|  |  * (the "License").  You may not use this file except in compliance | ||||||
|  |  * with the License. | ||||||
|  |  * | ||||||
|  |  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||||||
|  |  * or http://www.opensolaris.org/os/licensing.
 | ||||||
|  |  * See the License for the specific language governing permissions | ||||||
|  |  * and limitations under the License. | ||||||
|  |  * | ||||||
|  |  * When distributing Covered Code, include this CDDL HEADER in each | ||||||
|  |  * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||||||
|  |  * If applicable, add the following below this CDDL HEADER, with the | ||||||
|  |  * fields enclosed by brackets "[]" replaced with your own identifying | ||||||
|  |  * information: Portions Copyright [yyyy] [name of copyright owner] | ||||||
|  |  * | ||||||
|  |  * CDDL HEADER END | ||||||
|  |  */ | ||||||
|  | /*
 | ||||||
|  |  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved. | ||||||
|  |  * Use is subject to license terms. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef _LIBSPL_SYS_SIMD_H | ||||||
|  | #define	_LIBSPL_SYS_SIMD_H | ||||||
|  | 
 | ||||||
|  | #include <sys/isa_defs.h> | ||||||
|  | #include <sys/types.h> | ||||||
|  | 
 | ||||||
|  | #if defined(__x86) | ||||||
|  | #include <cpuid.h> | ||||||
|  | 
 | ||||||
|  | #define	kfpu_allowed()		1 | ||||||
|  | #define	kfpu_initialize(tsk)	do {} while (0) | ||||||
|  | #define	kfpu_begin()		do {} while (0) | ||||||
|  | #define	kfpu_end()		do {} while (0) | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * CPUID feature tests for user-space. | ||||||
|  |  * | ||||||
|  |  * x86 registers used implicitly by CPUID | ||||||
|  |  */ | ||||||
|  | typedef enum cpuid_regs { | ||||||
|  | 	EAX = 0, | ||||||
|  | 	EBX, | ||||||
|  | 	ECX, | ||||||
|  | 	EDX, | ||||||
|  | 	CPUID_REG_CNT = 4 | ||||||
|  | } cpuid_regs_t; | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * List of instruction sets identified by CPUID | ||||||
|  |  */ | ||||||
|  | typedef enum cpuid_inst_sets { | ||||||
|  | 	SSE = 0, | ||||||
|  | 	SSE2, | ||||||
|  | 	SSE3, | ||||||
|  | 	SSSE3, | ||||||
|  | 	SSE4_1, | ||||||
|  | 	SSE4_2, | ||||||
|  | 	OSXSAVE, | ||||||
|  | 	AVX, | ||||||
|  | 	AVX2, | ||||||
|  | 	BMI1, | ||||||
|  | 	BMI2, | ||||||
|  | 	AVX512F, | ||||||
|  | 	AVX512CD, | ||||||
|  | 	AVX512DQ, | ||||||
|  | 	AVX512BW, | ||||||
|  | 	AVX512IFMA, | ||||||
|  | 	AVX512VBMI, | ||||||
|  | 	AVX512PF, | ||||||
|  | 	AVX512ER, | ||||||
|  | 	AVX512VL, | ||||||
|  | 	AES, | ||||||
|  | 	PCLMULQDQ | ||||||
|  | } cpuid_inst_sets_t; | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Instruction set descriptor. | ||||||
|  |  */ | ||||||
|  | typedef struct cpuid_feature_desc { | ||||||
|  | 	uint32_t leaf;		/* CPUID leaf */ | ||||||
|  | 	uint32_t subleaf;	/* CPUID sub-leaf */ | ||||||
|  | 	uint32_t flag;		/* bit mask of the feature */ | ||||||
|  | 	cpuid_regs_t reg;	/* which CPUID return register to test */ | ||||||
|  | } cpuid_feature_desc_t; | ||||||
|  | 
 | ||||||
|  | #define	_AVX512F_BIT		(1U << 16) | ||||||
|  | #define	_AVX512CD_BIT		(_AVX512F_BIT | (1U << 28)) | ||||||
|  | #define	_AVX512DQ_BIT		(_AVX512F_BIT | (1U << 17)) | ||||||
|  | #define	_AVX512BW_BIT		(_AVX512F_BIT | (1U << 30)) | ||||||
|  | #define	_AVX512IFMA_BIT		(_AVX512F_BIT | (1U << 21)) | ||||||
|  | #define	_AVX512VBMI_BIT		(1U << 1) /* AVX512F_BIT is on another leaf  */ | ||||||
|  | #define	_AVX512PF_BIT		(_AVX512F_BIT | (1U << 26)) | ||||||
|  | #define	_AVX512ER_BIT		(_AVX512F_BIT | (1U << 27)) | ||||||
|  | #define	_AVX512VL_BIT		(1U << 31) /* if used also check other levels */ | ||||||
|  | #define	_AES_BIT		(1U << 25) | ||||||
|  | #define	_PCLMULQDQ_BIT		(1U << 1) | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Descriptions of supported instruction sets | ||||||
|  |  */ | ||||||
|  | static const cpuid_feature_desc_t cpuid_features[] = { | ||||||
|  | 	[SSE]		= {1U, 0U,	1U << 25,	EDX	}, | ||||||
|  | 	[SSE2]		= {1U, 0U,	1U << 26,	EDX	}, | ||||||
|  | 	[SSE3]		= {1U, 0U,	1U << 0,	ECX	}, | ||||||
|  | 	[SSSE3]		= {1U, 0U,	1U << 9,	ECX	}, | ||||||
|  | 	[SSE4_1]	= {1U, 0U,	1U << 19,	ECX	}, | ||||||
|  | 	[SSE4_2]	= {1U, 0U,	1U << 20,	ECX	}, | ||||||
|  | 	[OSXSAVE]	= {1U, 0U,	1U << 27,	ECX	}, | ||||||
|  | 	[AVX]		= {1U, 0U,	1U << 28,	ECX	}, | ||||||
|  | 	[AVX2]		= {7U, 0U,	1U << 5,	EBX	}, | ||||||
|  | 	[BMI1]		= {7U, 0U,	1U << 3,	EBX	}, | ||||||
|  | 	[BMI2]		= {7U, 0U,	1U << 8,	EBX	}, | ||||||
|  | 	[AVX512F]	= {7U, 0U, _AVX512F_BIT,	EBX	}, | ||||||
|  | 	[AVX512CD]	= {7U, 0U, _AVX512CD_BIT,	EBX	}, | ||||||
|  | 	[AVX512DQ]	= {7U, 0U, _AVX512DQ_BIT,	EBX	}, | ||||||
|  | 	[AVX512BW]	= {7U, 0U, _AVX512BW_BIT,	EBX	}, | ||||||
|  | 	[AVX512IFMA]	= {7U, 0U, _AVX512IFMA_BIT,	EBX	}, | ||||||
|  | 	[AVX512VBMI]	= {7U, 0U, _AVX512VBMI_BIT,	ECX	}, | ||||||
|  | 	[AVX512PF]	= {7U, 0U, _AVX512PF_BIT,	EBX	}, | ||||||
|  | 	[AVX512ER]	= {7U, 0U, _AVX512ER_BIT,	EBX	}, | ||||||
|  | 	[AVX512VL]	= {7U, 0U, _AVX512ER_BIT,	EBX	}, | ||||||
|  | 	[AES]		= {1U, 0U, _AES_BIT,		ECX	}, | ||||||
|  | 	[PCLMULQDQ]	= {1U, 0U, _PCLMULQDQ_BIT,	ECX	}, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Check if OS supports AVX and AVX2 by checking XCR0 | ||||||
|  |  * Only call this function if CPUID indicates that AVX feature is | ||||||
|  |  * supported by the CPU, otherwise it might be an illegal instruction. | ||||||
|  |  */ | ||||||
|  | static inline uint64_t | ||||||
|  | xgetbv(uint32_t index) | ||||||
|  | { | ||||||
|  | 	uint32_t eax, edx; | ||||||
|  | 	/* xgetbv - instruction byte code */ | ||||||
|  | 	__asm__ __volatile__(".byte 0x0f; .byte 0x01; .byte 0xd0" | ||||||
|  | 	    : "=a" (eax), "=d" (edx) | ||||||
|  | 	    : "c" (index)); | ||||||
|  | 
 | ||||||
|  | 	return ((((uint64_t)edx)<<32) | (uint64_t)eax); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Check if CPU supports a feature | ||||||
|  |  */ | ||||||
|  | static inline boolean_t | ||||||
|  | __cpuid_check_feature(const cpuid_feature_desc_t *desc) | ||||||
|  | { | ||||||
|  | 	uint32_t r[CPUID_REG_CNT]; | ||||||
|  | 
 | ||||||
|  | 	if (__get_cpuid_max(0, NULL) >= desc->leaf) { | ||||||
|  | 		/*
 | ||||||
|  | 		 * __cpuid_count is needed to properly check | ||||||
|  | 		 * for AVX2. It is a macro, so return parameters | ||||||
|  | 		 * are passed by value. | ||||||
|  | 		 */ | ||||||
|  | 		__cpuid_count(desc->leaf, desc->subleaf, | ||||||
|  | 		    r[EAX], r[EBX], r[ECX], r[EDX]); | ||||||
|  | 		return ((r[desc->reg] & desc->flag) == desc->flag); | ||||||
|  | 	} | ||||||
|  | 	return (B_FALSE); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #define	CPUID_FEATURE_CHECK(name, id)				\ | ||||||
|  | static inline boolean_t						\ | ||||||
|  | __cpuid_has_ ## name(void)					\ | ||||||
|  | {								\ | ||||||
|  | 	return (__cpuid_check_feature(&cpuid_features[id]));	\ | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Define functions for user-space CPUID features testing | ||||||
|  |  */ | ||||||
|  | CPUID_FEATURE_CHECK(sse, SSE); | ||||||
|  | CPUID_FEATURE_CHECK(sse2, SSE2); | ||||||
|  | CPUID_FEATURE_CHECK(sse3, SSE3); | ||||||
|  | CPUID_FEATURE_CHECK(ssse3, SSSE3); | ||||||
|  | CPUID_FEATURE_CHECK(sse4_1, SSE4_1); | ||||||
|  | CPUID_FEATURE_CHECK(sse4_2, SSE4_2); | ||||||
|  | CPUID_FEATURE_CHECK(avx, AVX); | ||||||
|  | CPUID_FEATURE_CHECK(avx2, AVX2); | ||||||
|  | CPUID_FEATURE_CHECK(osxsave, OSXSAVE); | ||||||
|  | CPUID_FEATURE_CHECK(bmi1, BMI1); | ||||||
|  | CPUID_FEATURE_CHECK(bmi2, BMI2); | ||||||
|  | CPUID_FEATURE_CHECK(avx512f, AVX512F); | ||||||
|  | CPUID_FEATURE_CHECK(avx512cd, AVX512CD); | ||||||
|  | CPUID_FEATURE_CHECK(avx512dq, AVX512DQ); | ||||||
|  | CPUID_FEATURE_CHECK(avx512bw, AVX512BW); | ||||||
|  | CPUID_FEATURE_CHECK(avx512ifma, AVX512IFMA); | ||||||
|  | CPUID_FEATURE_CHECK(avx512vbmi, AVX512VBMI); | ||||||
|  | CPUID_FEATURE_CHECK(avx512pf, AVX512PF); | ||||||
|  | CPUID_FEATURE_CHECK(avx512er, AVX512ER); | ||||||
|  | CPUID_FEATURE_CHECK(avx512vl, AVX512VL); | ||||||
|  | CPUID_FEATURE_CHECK(aes, AES); | ||||||
|  | CPUID_FEATURE_CHECK(pclmulqdq, PCLMULQDQ); | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Detect register set support | ||||||
|  |  */ | ||||||
|  | static inline boolean_t | ||||||
|  | __simd_state_enabled(const uint64_t state) | ||||||
|  | { | ||||||
|  | 	boolean_t has_osxsave; | ||||||
|  | 	uint64_t xcr0; | ||||||
|  | 
 | ||||||
|  | 	has_osxsave = __cpuid_has_osxsave(); | ||||||
|  | 	if (!has_osxsave) | ||||||
|  | 		return (B_FALSE); | ||||||
|  | 
 | ||||||
|  | 	xcr0 = xgetbv(0); | ||||||
|  | 	return ((xcr0 & state) == state); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #define	_XSTATE_SSE_AVX		(0x2 | 0x4) | ||||||
|  | #define	_XSTATE_AVX512		(0xE0 | _XSTATE_SSE_AVX) | ||||||
|  | 
 | ||||||
|  | #define	__ymm_enabled()		__simd_state_enabled(_XSTATE_SSE_AVX) | ||||||
|  | #define	__zmm_enabled()		__simd_state_enabled(_XSTATE_AVX512) | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Check if SSE instruction set is available | ||||||
|  |  */ | ||||||
|  | static inline boolean_t | ||||||
|  | zfs_sse_available(void) | ||||||
|  | { | ||||||
|  | 	return (__cpuid_has_sse()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Check if SSE2 instruction set is available | ||||||
|  |  */ | ||||||
|  | static inline boolean_t | ||||||
|  | zfs_sse2_available(void) | ||||||
|  | { | ||||||
|  | 	return (__cpuid_has_sse2()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Check if SSE3 instruction set is available | ||||||
|  |  */ | ||||||
|  | static inline boolean_t | ||||||
|  | zfs_sse3_available(void) | ||||||
|  | { | ||||||
|  | 	return (__cpuid_has_sse3()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Check if SSSE3 instruction set is available | ||||||
|  |  */ | ||||||
|  | static inline boolean_t | ||||||
|  | zfs_ssse3_available(void) | ||||||
|  | { | ||||||
|  | 	return (__cpuid_has_ssse3()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Check if SSE4.1 instruction set is available | ||||||
|  |  */ | ||||||
|  | static inline boolean_t | ||||||
|  | zfs_sse4_1_available(void) | ||||||
|  | { | ||||||
|  | 	return (__cpuid_has_sse4_1()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Check if SSE4.2 instruction set is available | ||||||
|  |  */ | ||||||
|  | static inline boolean_t | ||||||
|  | zfs_sse4_2_available(void) | ||||||
|  | { | ||||||
|  | 	return (__cpuid_has_sse4_2()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Check if AVX instruction set is available | ||||||
|  |  */ | ||||||
|  | static inline boolean_t | ||||||
|  | zfs_avx_available(void) | ||||||
|  | { | ||||||
|  | 	return (__cpuid_has_avx() && __ymm_enabled()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Check if AVX2 instruction set is available | ||||||
|  |  */ | ||||||
|  | static inline boolean_t | ||||||
|  | zfs_avx2_available(void) | ||||||
|  | { | ||||||
|  | 	return (__cpuid_has_avx2() && __ymm_enabled()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Check if BMI1 instruction set is available | ||||||
|  |  */ | ||||||
|  | static inline boolean_t | ||||||
|  | zfs_bmi1_available(void) | ||||||
|  | { | ||||||
|  | 	return (__cpuid_has_bmi1()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Check if BMI2 instruction set is available | ||||||
|  |  */ | ||||||
|  | static inline boolean_t | ||||||
|  | zfs_bmi2_available(void) | ||||||
|  | { | ||||||
|  | 	return (__cpuid_has_bmi2()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Check if AES instruction set is available | ||||||
|  |  */ | ||||||
|  | static inline boolean_t | ||||||
|  | zfs_aes_available(void) | ||||||
|  | { | ||||||
|  | 	return (__cpuid_has_aes()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Check if PCLMULQDQ instruction set is available | ||||||
|  |  */ | ||||||
|  | static inline boolean_t | ||||||
|  | zfs_pclmulqdq_available(void) | ||||||
|  | { | ||||||
|  | 	return (__cpuid_has_pclmulqdq()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * AVX-512 family of instruction sets: | ||||||
|  |  * | ||||||
|  |  * AVX512F	Foundation | ||||||
|  |  * AVX512CD	Conflict Detection Instructions | ||||||
|  |  * AVX512ER	Exponential and Reciprocal Instructions | ||||||
|  |  * AVX512PF	Prefetch Instructions | ||||||
|  |  * | ||||||
|  |  * AVX512BW	Byte and Word Instructions | ||||||
|  |  * AVX512DQ	Double-word and Quadword Instructions | ||||||
|  |  * AVX512VL	Vector Length Extensions | ||||||
|  |  * | ||||||
|  |  * AVX512IFMA	Integer Fused Multiply Add (Not supported by kernel 4.4) | ||||||
|  |  * AVX512VBMI	Vector Byte Manipulation Instructions | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Check if AVX512F instruction set is available | ||||||
|  |  */ | ||||||
|  | static inline boolean_t | ||||||
|  | zfs_avx512f_available(void) | ||||||
|  | { | ||||||
|  | 	return (__cpuid_has_avx512f() && __zmm_enabled()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Check if AVX512CD instruction set is available | ||||||
|  |  */ | ||||||
|  | static inline boolean_t | ||||||
|  | zfs_avx512cd_available(void) | ||||||
|  | { | ||||||
|  | 	return (__cpuid_has_avx512cd() && __zmm_enabled()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Check if AVX512ER instruction set is available | ||||||
|  |  */ | ||||||
|  | static inline boolean_t | ||||||
|  | zfs_avx512er_available(void) | ||||||
|  | { | ||||||
|  | 	return (__cpuid_has_avx512er() && __zmm_enabled()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Check if AVX512PF instruction set is available | ||||||
|  |  */ | ||||||
|  | static inline boolean_t | ||||||
|  | zfs_avx512pf_available(void) | ||||||
|  | { | ||||||
|  | 	return (__cpuid_has_avx512pf() && __zmm_enabled()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Check if AVX512BW instruction set is available | ||||||
|  |  */ | ||||||
|  | static inline boolean_t | ||||||
|  | zfs_avx512bw_available(void) | ||||||
|  | { | ||||||
|  | 	return (__cpuid_has_avx512bw() && __zmm_enabled()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Check if AVX512DQ instruction set is available | ||||||
|  |  */ | ||||||
|  | static inline boolean_t | ||||||
|  | zfs_avx512dq_available(void) | ||||||
|  | { | ||||||
|  | 	return (__cpuid_has_avx512dq() && __zmm_enabled()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Check if AVX512VL instruction set is available | ||||||
|  |  */ | ||||||
|  | static inline boolean_t | ||||||
|  | zfs_avx512vl_available(void) | ||||||
|  | { | ||||||
|  | 	return (__cpuid_has_avx512vl() && __zmm_enabled()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Check if AVX512IFMA instruction set is available | ||||||
|  |  */ | ||||||
|  | static inline boolean_t | ||||||
|  | zfs_avx512ifma_available(void) | ||||||
|  | { | ||||||
|  | 	return (__cpuid_has_avx512ifma() && __zmm_enabled()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Check if AVX512VBMI instruction set is available | ||||||
|  |  */ | ||||||
|  | static inline boolean_t | ||||||
|  | zfs_avx512vbmi_available(void) | ||||||
|  | { | ||||||
|  | 	return (__cpuid_has_avx512f() && __cpuid_has_avx512vbmi() && | ||||||
|  | 	    __zmm_enabled()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #elif defined(__aarch64__) | ||||||
|  | 
 | ||||||
|  | #define	kfpu_allowed()		1 | ||||||
|  | #define	kfpu_initialize(tsk)	do {} while (0) | ||||||
|  | #define	kfpu_begin()		do {} while (0) | ||||||
|  | #define	kfpu_end()		do {} while (0) | ||||||
|  | 
 | ||||||
|  | #else | ||||||
|  | 
 | ||||||
|  | #define	kfpu_allowed()		0 | ||||||
|  | #define	kfpu_initialize(tsk)	do {} while (0) | ||||||
|  | #define	kfpu_begin()		do {} while (0) | ||||||
|  | #define	kfpu_end()		do {} while (0) | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif /* _LIBSPL_SYS_SIMD_H */ | ||||||
| @ -12,7 +12,9 @@ INSTALL_MOD_DIR ?= extra | |||||||
| ZFS_MODULE_CFLAGS += -std=gnu99 -Wno-declaration-after-statement | ZFS_MODULE_CFLAGS += -std=gnu99 -Wno-declaration-after-statement | ||||||
| ZFS_MODULE_CFLAGS += @KERNEL_DEBUG_CFLAGS@ | ZFS_MODULE_CFLAGS += @KERNEL_DEBUG_CFLAGS@ | ||||||
| ZFS_MODULE_CFLAGS += -include @abs_top_builddir@/zfs_config.h | ZFS_MODULE_CFLAGS += -include @abs_top_builddir@/zfs_config.h | ||||||
| ZFS_MODULE_CFLAGS += -I@abs_top_srcdir@/include/spl | ZFS_MODULE_CFLAGS += -I@abs_top_srcdir@/include/os/linux/kernel | ||||||
|  | ZFS_MODULE_CFLAGS += -I@abs_top_srcdir@/include/os/linux/spl | ||||||
|  | ZFS_MODULE_CFLAGS += -I@abs_top_srcdir@/include/os/linux/zfs | ||||||
| ZFS_MODULE_CFLAGS += -I@abs_top_srcdir@/include | ZFS_MODULE_CFLAGS += -I@abs_top_srcdir@/include | ||||||
| 
 | 
 | ||||||
| ZFS_MODULE_CPPFLAGS += -D_KERNEL | ZFS_MODULE_CPPFLAGS += -D_KERNEL | ||||||
|  | |||||||
| @ -25,9 +25,9 @@ | |||||||
| #include <sys/zfs_context.h> | #include <sys/zfs_context.h> | ||||||
| #include <sys/crypto/icp.h> | #include <sys/crypto/icp.h> | ||||||
| #include <sys/crypto/spi.h> | #include <sys/crypto/spi.h> | ||||||
|  | #include <sys/simd.h> | ||||||
| #include <modes/modes.h> | #include <modes/modes.h> | ||||||
| #include <aes/aes_impl.h> | #include <aes/aes_impl.h> | ||||||
| #include <linux/simd.h> |  | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Initialize AES encryption and decryption key schedules. |  * Initialize AES encryption and decryption key schedules. | ||||||
|  | |||||||
| @ -24,7 +24,8 @@ | |||||||
| 
 | 
 | ||||||
| #if defined(__x86_64) && defined(HAVE_AES) | #if defined(__x86_64) && defined(HAVE_AES) | ||||||
| 
 | 
 | ||||||
| #include <linux/simd_x86.h> | #include <sys/simd.h> | ||||||
|  | #include <sys/types.h> | ||||||
| 
 | 
 | ||||||
| /* These functions are used to execute AES-NI instructions: */ | /* These functions are used to execute AES-NI instructions: */ | ||||||
| extern int rijndael_key_setup_enc_intel(uint32_t rk[], | extern int rijndael_key_setup_enc_intel(uint32_t rk[], | ||||||
|  | |||||||
| @ -24,7 +24,7 @@ | |||||||
| 
 | 
 | ||||||
| #if defined(__x86_64) | #if defined(__x86_64) | ||||||
| 
 | 
 | ||||||
| #include <linux/simd_x86.h> | #include <sys/simd.h> | ||||||
| 
 | 
 | ||||||
| /* These functions are used to execute amd64 instructions for AMD or Intel: */ | /* These functions are used to execute amd64 instructions for AMD or Intel: */ | ||||||
| extern int rijndael_key_setup_enc_amd64(uint32_t rk[], | extern int rijndael_key_setup_enc_amd64(uint32_t rk[], | ||||||
|  | |||||||
| @ -28,8 +28,8 @@ | |||||||
| #include <sys/crypto/icp.h> | #include <sys/crypto/icp.h> | ||||||
| #include <sys/crypto/impl.h> | #include <sys/crypto/impl.h> | ||||||
| #include <sys/byteorder.h> | #include <sys/byteorder.h> | ||||||
|  | #include <sys/simd.h> | ||||||
| #include <modes/gcm_impl.h> | #include <modes/gcm_impl.h> | ||||||
| #include <linux/simd.h> |  | ||||||
| 
 | 
 | ||||||
| #define	GHASH(c, d, t, o) \ | #define	GHASH(c, d, t, o) \ | ||||||
| 	xor_block((uint8_t *)(d), (uint8_t *)(c)->gcm_ghash); \ | 	xor_block((uint8_t *)(d), (uint8_t *)(c)->gcm_ghash); \ | ||||||
|  | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Matthew Macy
						Matthew Macy