diff options
Diffstat (limited to 'crypto/cryptd.c')
| -rw-r--r-- | crypto/cryptd.c | 11 | 
1 files changed, 8 insertions, 3 deletions
diff --git a/crypto/cryptd.c b/crypto/cryptd.c index 671d4d6d14d..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;  |