diff options
Diffstat (limited to 'crypto/cryptd.c')
| -rw-r--r-- | crypto/cryptd.c | 13 | 
1 files changed, 9 insertions, 4 deletions
diff --git a/crypto/cryptd.c b/crypto/cryptd.c index e46d21ae26b..7bdd61b867c 100644 --- a/crypto/cryptd.c +++ b/crypto/cryptd.c @@ -137,13 +137,18 @@ static void cryptd_queue_worker(struct work_struct *work)  	struct crypto_async_request *req, *backlog;  	cpu_queue = container_of(work, struct cryptd_cpu_queue, work); -	/* Only handle one request at a time to avoid hogging crypto -	 * workqueue. preempt_disable/enable is used to prevent -	 * being preempted by cryptd_enqueue_request() */ +	/* +	 * Only handle one request at a time to avoid hogging crypto workqueue. +	 * preempt_disable/enable is used to prevent being preempted by +	 * cryptd_enqueue_request(). local_bh_disable/enable is used to prevent +	 * cryptd_enqueue_request() being accessed from software interrupts. +	 */ +	local_bh_disable();  	preempt_disable();  	backlog = crypto_get_backlog(&cpu_queue->queue);  	req = crypto_dequeue_request(&cpu_queue->queue);  	preempt_enable(); +	local_bh_enable();  	if (!req)  		return; @@ -945,7 +950,7 @@ static void __exit cryptd_exit(void)  	crypto_unregister_template(&cryptd_tmpl);  } -module_init(cryptd_init); +subsys_initcall(cryptd_init);  module_exit(cryptd_exit);  MODULE_LICENSE("GPL");  | 
