Re: hanging modprobe aes_s390

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Herbert,

your patch solves the hanging modprobe (tested on top of cryptodev-2.6).
Both modules (aes_generic and aes_s390) are loaded after the modprobe
aes_s390.

Thanks a lot, Jan

On Thu, 2009-02-26 at 14:06 +0800, Herbert Xu wrote:
> On Wed, Feb 25, 2009 at 05:33:50PM +0000, Jan Glauber wrote:
> >
> > STACK TRACE FOR TASK: 0x3f6137c8 (modprobe)
> > 
> >  STACK:
> >  0 schedule+1136 [0x2df82c]
> >  1 fcntl_setlk+412 [0x107a0c]
> >  2 sys_fcntl+262 [0xd7076]
> >  3 sysc_noemu+16 [0x27a5e]
> 
> I see.  Please let me know if this patch fixes it.
> 
> crypto: api - Fix module load deadlock with fallback algorithms
> 
> With the mandatory algorithm testing at registration, we have
> now created a deadlock with algorithms requiring fallbacks.
> This can happen if the module containing the algorithm requiring
> fallback is loaded first, without the fallback module being loaded
> first.  The system will then try to test the new algorithm, find
> that it needs to load a fallback, and then try to load that.
> 
> As both algorithms share the same module alias, it can attempt
> to load the original algorithm again and block indefinitely.
> 
> As algorithms requiring fallbacks are a special case, we can fix
> this by giving them a different module alias than the rest.  Then
> it's just a matter of using the right aliases according to what
> algorithms we're trying to find.
> 
> Signed-off-by: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>
> 
> diff --git a/arch/s390/crypto/aes_s390.c b/arch/s390/crypto/aes_s390.c
> index c42cd89..6118890 100644
> --- a/arch/s390/crypto/aes_s390.c
> +++ b/arch/s390/crypto/aes_s390.c
> @@ -556,7 +556,7 @@ static void __exit aes_s390_fini(void)
>  module_init(aes_s390_init);
>  module_exit(aes_s390_fini);
>  
> -MODULE_ALIAS("aes");
> +MODULE_ALIAS("aes-all");
>  
>  MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm");
>  MODULE_LICENSE("GPL");
> diff --git a/crypto/api.c b/crypto/api.c
> index efe77df..38a2bc0 100644
> --- a/crypto/api.c
> +++ b/crypto/api.c
> @@ -215,8 +215,19 @@ struct crypto_alg *crypto_larval_lookup(const char *name, u32 type, u32 mask)
>  	mask &= ~(CRYPTO_ALG_LARVAL | CRYPTO_ALG_DEAD);
>  	type &= mask;
>  
> -	alg = try_then_request_module(crypto_alg_lookup(name, type, mask),
> -				      name);
> +	alg = crypto_alg_lookup(name, type, mask);
> +	if (!alg) {
> +		char tmp[CRYPTO_MAX_ALG_NAME];
> +
> +		request_module(name);
> +
> +		if (!((type ^ CRYPTO_ALG_NEED_FALLBACK) & mask) &&
> +		    snprintf(tmp, sizeof(tmp), "%s-all", name) < sizeof(tmp))
> +			request_module(tmp);
> +
> +		alg = crypto_alg_lookup(name, type, mask);
> +	}
> +
>  	if (alg)
>  		return crypto_is_larval(alg) ? crypto_larval_wait(alg) : alg;
>  
> diff --git a/drivers/crypto/padlock-aes.c b/drivers/crypto/padlock-aes.c
> index 856b3cc..3f0fdd1 100644
> --- a/drivers/crypto/padlock-aes.c
> +++ b/drivers/crypto/padlock-aes.c
> @@ -489,4 +489,4 @@ MODULE_DESCRIPTION("VIA PadLock AES algorithm support");
>  MODULE_LICENSE("GPL");
>  MODULE_AUTHOR("Michal Ludvig");
>  
> -MODULE_ALIAS("aes");
> +MODULE_ALIAS("aes-all");
> diff --git a/drivers/crypto/padlock-sha.c b/drivers/crypto/padlock-sha.c
> index a7fbade..a2c8e85 100644
> --- a/drivers/crypto/padlock-sha.c
> +++ b/drivers/crypto/padlock-sha.c
> @@ -304,7 +304,7 @@ MODULE_DESCRIPTION("VIA PadLock SHA1/SHA256 algorithms support.");
>  MODULE_LICENSE("GPL");
>  MODULE_AUTHOR("Michal Ludvig");
>  
> -MODULE_ALIAS("sha1");
> -MODULE_ALIAS("sha256");
> +MODULE_ALIAS("sha1-all");
> +MODULE_ALIAS("sha256-all");
>  MODULE_ALIAS("sha1-padlock");
>  MODULE_ALIAS("sha256-padlock");
> 
> Thanks,

--
To unsubscribe from this list: send the line "unsubscribe linux-crypto" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Kernel]     [Gnu Classpath]     [Gnu Crypto]     [DM Crypt]     [Netfilter]     [Bugtraq]

  Powered by Linux