random: consolidate wakeup logic
authorMatt Mackall <mpm@selenic.com>
Tue, 29 Apr 2008 08:02:56 +0000 (01:02 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 29 Apr 2008 15:06:24 +0000 (08:06 -0700)
Signed-off-by: Matt Mackall <mpm@selenic.com>
Cc: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/char/random.c

index 32118598a71bd427c2d2071a3f2d9618c549a21f..46944088cf942f81ccc16aa8ec84b817e0ba1277 100644 (file)
@@ -540,6 +540,10 @@ static void credit_entropy_store(struct entropy_store *r, int nbits)
                                  nbits, r->name);
        }
 
+       /* should we wake readers? */
+       if (r == &input_pool && r->entropy_count >= random_read_wakeup_thresh)
+               wake_up_interruptible(&random_read_wait);
+
        spin_unlock_irqrestore(&r->lock, flags);
 }
 
@@ -624,10 +628,6 @@ static void add_timer_randomness(struct timer_rand_state *state, unsigned num)
                credit_entropy_store(&input_pool,
                                     min_t(int, fls(delta>>1), 11));
        }
-
-       if (input_pool.entropy_count >= random_read_wakeup_thresh)
-               wake_up_interruptible(&random_read_wait);
-
 out:
        preempt_enable();
 }
@@ -1081,12 +1081,6 @@ static int random_ioctl(struct inode *inode, struct file *file,
                if (get_user(ent_count, p))
                        return -EFAULT;
                credit_entropy_store(&input_pool, ent_count);
-               /*
-                * Wake up waiting processes if we have enough
-                * entropy.
-                */
-               if (input_pool.entropy_count >= random_read_wakeup_thresh)
-                       wake_up_interruptible(&random_read_wait);
                return 0;
        case RNDADDENTROPY:
                if (!capable(CAP_SYS_ADMIN))
@@ -1102,12 +1096,6 @@ static int random_ioctl(struct inode *inode, struct file *file,
                if (retval < 0)
                        return retval;
                credit_entropy_store(&input_pool, ent_count);
-               /*
-                * Wake up waiting processes if we have enough
-                * entropy.
-                */
-               if (input_pool.entropy_count >= random_read_wakeup_thresh)
-                       wake_up_interruptible(&random_read_wait);
                return 0;
        case RNDZAPENTCNT:
        case RNDCLEARPOOL: