<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">
From: Ingo Molnar &lt;mingo@elte.hu&gt;

The attached patch fixes possibly long scheduling latencies in the
/dev/random driver's rekey_seq_generator() function, by moving the
expensive get_random_bytes() function out from under ip_lock.

Has been in the -VP patchset for quite some time.

Signed-off-by: Ingo Molnar &lt;mingo@elte.hu&gt;
Signed-off-by: Andrew Morton &lt;akpm@osdl.org&gt;
---

 25-akpm/drivers/char/random.c |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

diff -puN drivers/char/random.c~sched-fix-latency-in-random-driver drivers/char/random.c
--- 25/drivers/char/random.c~sched-fix-latency-in-random-driver	Tue Sep 14 17:38:28 2004
+++ 25-akpm/drivers/char/random.c	Tue Sep 14 17:38:28 2004
@@ -2220,17 +2220,18 @@ static unsigned int ip_cnt;
 
 static void rekey_seq_generator(void *private_)
 {
-	struct keydata *keyptr;
+	struct keydata *keyptr, tmp;
 	struct timeval 	tv;
 
 	do_gettimeofday(&amp;tv);
+	get_random_bytes(tmp.secret, sizeof(tmp.secret));
 
 	spin_lock_bh(&amp;ip_lock);
 	keyptr = &amp;ip_keydata[ip_cnt&amp;1];
 
 	keyptr = &amp;ip_keydata[1^(ip_cnt&amp;1)];
 	keyptr-&gt;rekey_time = tv.tv_sec;
-	get_random_bytes(keyptr-&gt;secret, sizeof(keyptr-&gt;secret));
+	memcpy(keyptr-&gt;secret, tmp.secret, sizeof(keyptr-&gt;secret));
 	keyptr-&gt;count = (ip_cnt&amp;COUNT_MASK)&lt;&lt;HASH_BITS;
 	mb();
 	ip_cnt++;
_
</pre></body></html>