mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	crypto: x86/sha512 - load based on CPU features
x86 optimized crypto modules built as modules rather than built-in to the kernel end up as .ko files in the filesystem, e.g., in /usr/lib/modules. If the filesystem itself is a module, these might not be available when the crypto API is initialized, resulting in the generic implementation being used (e.g., sha512_transform rather than sha512_transform_avx2). In one test case, CPU utilization in the sha512 function dropped from 15.34% to 7.18% after forcing loading of the optimized module. Add module aliases for this x86 optimized crypto module based on CPU feature bits so udev gets a chance to load them later in the boot process when the filesystems are all running. Signed-off-by: Robert Elliott <elliott@hpe.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
		
							parent
							
								
									6a088a2cbc
								
							
						
					
					
						commit
						aa031b8f70
					
				
					 1 changed files with 10 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -36,6 +36,7 @@
 | 
			
		|||
#include <linux/types.h>
 | 
			
		||||
#include <crypto/sha2.h>
 | 
			
		||||
#include <crypto/sha512_base.h>
 | 
			
		||||
#include <asm/cpu_device_id.h>
 | 
			
		||||
#include <asm/simd.h>
 | 
			
		||||
 | 
			
		||||
asmlinkage void sha512_transform_ssse3(struct sha512_state *state,
 | 
			
		||||
| 
						 | 
				
			
			@ -284,6 +285,13 @@ static int register_sha512_avx2(void)
 | 
			
		|||
			ARRAY_SIZE(sha512_avx2_algs));
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
static const struct x86_cpu_id module_cpu_ids[] = {
 | 
			
		||||
	X86_MATCH_FEATURE(X86_FEATURE_AVX2, NULL),
 | 
			
		||||
	X86_MATCH_FEATURE(X86_FEATURE_AVX, NULL),
 | 
			
		||||
	X86_MATCH_FEATURE(X86_FEATURE_SSSE3, NULL),
 | 
			
		||||
	{}
 | 
			
		||||
};
 | 
			
		||||
MODULE_DEVICE_TABLE(x86cpu, module_cpu_ids);
 | 
			
		||||
 | 
			
		||||
static void unregister_sha512_avx2(void)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -294,6 +302,8 @@ static void unregister_sha512_avx2(void)
 | 
			
		|||
 | 
			
		||||
static int __init sha512_ssse3_mod_init(void)
 | 
			
		||||
{
 | 
			
		||||
	if (!x86_match_cpu(module_cpu_ids))
 | 
			
		||||
		return -ENODEV;
 | 
			
		||||
 | 
			
		||||
	if (register_sha512_ssse3())
 | 
			
		||||
		goto fail;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue