ath9k: avoid potential freezing during random generator read
authorMiaoqing Pan <miaoqing@codeaurora.org>
Tue, 27 Jun 2017 14:31:54 +0000 (17:31 +0300)
committerKalle Valo <kvalo@qca.qualcomm.com>
Wed, 28 Jun 2017 16:54:38 +0000 (19:54 +0300)
In the worst case, ath9k_rng_stop() may take 10s to stop rng kthread.
The time is too long for users, use wait_event_interruptible_timeout()
instead of msleep_interruptible(), wakup immediately once
kthread_should_stop() is true.

Signed-off-by: Miaoqing Pan <miaoqing@codeaurora.org>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath9k/rng.c

index 73f46fb3e83a14ff9f867c81aff4183ccdaacb03..f9d3d6eedd3cd994d8b9b2e7fbcdf0a13c8cdbab 100644 (file)
@@ -24,6 +24,8 @@
 #define ATH9K_RNG_BUF_SIZE     320
 #define ATH9K_RNG_ENTROPY(x)   (((x) * 8 * 10) >> 5) /* quality: 10/32 */
 
+static DECLARE_WAIT_QUEUE_HEAD(rng_queue);
+
 static int ath9k_rng_data_read(struct ath_softc *sc, u32 *buf, u32 buf_size)
 {
        int i, j;
@@ -85,7 +87,9 @@ static int ath9k_rng_kthread(void *data)
                                                 ATH9K_RNG_BUF_SIZE);
                if (unlikely(!bytes_read)) {
                        delay = ath9k_rng_delay_get(++fail_stats);
-                       msleep_interruptible(delay);
+                       wait_event_interruptible_timeout(rng_queue,
+                                                        kthread_should_stop(),
+                                                        msecs_to_jiffies(delay));
                        continue;
                }