From: Matt Mackall Original code checked in output pool for missed wakeup avoidance, while waker (batch_entropy_process) checked input pool which could result in a missed wakeup. - Move to wait_event_interruptible style - Delete superfluous waitqueue Signed-off-by: Matt Mackall Signed-off-by: Andrew Morton --- 25-akpm/drivers/char/random.c | 19 +++++++++---------- 1 files changed, 9 insertions(+), 10 deletions(-) diff -puN drivers/char/random.c~random-pt2-cleanup-waitqueue-logic-fix-missed-wakeup drivers/char/random.c --- 25/drivers/char/random.c~random-pt2-cleanup-waitqueue-logic-fix-missed-wakeup 2005-01-16 00:53:25.540126200 -0800 +++ 25-akpm/drivers/char/random.c 2005-01-16 00:53:25.546125288 -0800 @@ -1587,7 +1587,6 @@ void rand_initialize_disk(struct gendisk static ssize_t random_read(struct file * file, char __user * buf, size_t nbytes, loff_t *ppos) { - DECLARE_WAITQUEUE(wait, current); ssize_t n, retval = 0, count = 0; if (nbytes == 0) @@ -1613,20 +1612,20 @@ random_read(struct file * file, char __u retval = -EAGAIN; break; } + + DEBUG_ENT("sleeping?\n"); + + wait_event_interruptible(random_read_wait, + random_state->entropy_count >= + random_read_wakeup_thresh); + + DEBUG_ENT("awake\n"); + if (signal_pending(current)) { retval = -ERESTARTSYS; break; } - set_current_state(TASK_INTERRUPTIBLE); - add_wait_queue(&random_read_wait, &wait); - - if (sec_random_state->entropy_count / 8 == 0) - schedule(); - - set_current_state(TASK_RUNNING); - remove_wait_queue(&random_read_wait, &wait); - continue; } _