forked from mirrors/linux
		
	crypto: aesni - Fix cryptd reordering problem on gcm
This patch fixes an old bug where gcm requests can be reordered because some are processed by cryptd while others are processed directly in softirq context. The fix is to always postpone to cryptd if there are currently requests outstanding from the same tfm. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
		
							parent
							
								
									81760ea6a9
								
							
						
					
					
						commit
						38b2f68b42
					
				
					 1 changed files with 12 additions and 6 deletions
				
			
		|  | @ -1098,9 +1098,12 @@ static int rfc4106_encrypt(struct aead_request *req) | |||
| 	struct cryptd_aead **ctx = crypto_aead_ctx(tfm); | ||||
| 	struct cryptd_aead *cryptd_tfm = *ctx; | ||||
| 
 | ||||
| 	aead_request_set_tfm(req, irq_fpu_usable() ? | ||||
| 				  cryptd_aead_child(cryptd_tfm) : | ||||
| 				  &cryptd_tfm->base); | ||||
| 	tfm = &cryptd_tfm->base; | ||||
| 	if (irq_fpu_usable() && (!in_atomic() || | ||||
| 				 !cryptd_aead_queued(cryptd_tfm))) | ||||
| 		tfm = cryptd_aead_child(cryptd_tfm); | ||||
| 
 | ||||
| 	aead_request_set_tfm(req, tfm); | ||||
| 
 | ||||
| 	return crypto_aead_encrypt(req); | ||||
| } | ||||
|  | @ -1111,9 +1114,12 @@ static int rfc4106_decrypt(struct aead_request *req) | |||
| 	struct cryptd_aead **ctx = crypto_aead_ctx(tfm); | ||||
| 	struct cryptd_aead *cryptd_tfm = *ctx; | ||||
| 
 | ||||
| 	aead_request_set_tfm(req, irq_fpu_usable() ? | ||||
| 				  cryptd_aead_child(cryptd_tfm) : | ||||
| 				  &cryptd_tfm->base); | ||||
| 	tfm = &cryptd_tfm->base; | ||||
| 	if (irq_fpu_usable() && (!in_atomic() || | ||||
| 				 !cryptd_aead_queued(cryptd_tfm))) | ||||
| 		tfm = cryptd_aead_child(cryptd_tfm); | ||||
| 
 | ||||
| 	aead_request_set_tfm(req, tfm); | ||||
| 
 | ||||
| 	return crypto_aead_decrypt(req); | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Herbert Xu
						Herbert Xu