* [PATCH 1/10] random pt2: cleanup waitqueue logic, fix missed wakeup
@ 2005-01-15 0:49 Matt Mackall
2005-01-15 0:49 ` [PATCH 2/10] random pt2: kill pool clearing Matt Mackall
0 siblings, 1 reply; 10+ messages in thread
From: Matt Mackall @ 2005-01-15 0:49 UTC (permalink / raw)
To: Andrew Morton, Theodore Ts'o; +Cc: linux-kernel
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 <mpm@selenic.com>
Index: rnd/drivers/char/random.c
===================================================================
--- rnd.orig/drivers/char/random.c 2005-01-12 21:27:58.178748133 -0800
+++ rnd/drivers/char/random.c 2005-01-12 21:27:58.951649596 -0800
@@ -1587,7 +1587,6 @@
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 @@
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;
}
^ permalink raw reply [flat|nested] 10+ messages in thread* [PATCH 2/10] random pt2: kill pool clearing 2005-01-15 0:49 [PATCH 1/10] random pt2: cleanup waitqueue logic, fix missed wakeup Matt Mackall @ 2005-01-15 0:49 ` Matt Mackall 2005-01-15 0:49 ` [PATCH 3/10] random pt2: combine legacy ioctls Matt Mackall 0 siblings, 1 reply; 10+ messages in thread From: Matt Mackall @ 2005-01-15 0:49 UTC (permalink / raw) To: Andrew Morton, Theodore Ts'o; +Cc: linux-kernel Remove pool clearing. We've only ever cleared one of three pools and there's no good reason to do it. Instead just reset the entropy count. Signed-off-by: Matt Mackall <mpm@selenic.com> Index: rnd/drivers/char/random.c =================================================================== --- rnd.orig/drivers/char/random.c 2005-01-12 21:27:58.951649596 -0800 +++ rnd/drivers/char/random.c 2005-01-12 21:28:00.196490892 -0800 @@ -546,15 +546,6 @@ return 0; } -/* Clear the entropy pool and associated counters. */ -static void clear_entropy_store(struct entropy_store *r) -{ - r->add_ptr = 0; - r->entropy_count = 0; - r->input_rotate = 0; - memset(r->pool, 0, r->poolinfo.POOLBYTES); -} - /* * This function adds a byte into the entropy "pool". It does not * update the entropy estimate. The caller should call @@ -1531,9 +1522,6 @@ if (create_entropy_store(SECONDARY_POOL_SIZE, "urandom", &urandom_state)) goto err; - clear_entropy_store(random_state); - clear_entropy_store(sec_random_state); - clear_entropy_store(urandom_state); init_std_data(random_state); init_std_data(sec_random_state); init_std_data(urandom_state); @@ -1765,10 +1753,10 @@ random_state->entropy_count = 0; return 0; case RNDCLEARPOOL: - /* Clear the entropy pool and associated counters. */ + /* Clear the entropy pool counters. */ if (!capable(CAP_SYS_ADMIN)) return -EPERM; - clear_entropy_store(random_state); + random_state->entropy_count = 0; init_std_data(random_state); return 0; default: ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 3/10] random pt2: combine legacy ioctls 2005-01-15 0:49 ` [PATCH 2/10] random pt2: kill pool clearing Matt Mackall @ 2005-01-15 0:49 ` Matt Mackall 2005-01-15 0:49 ` [PATCH 4/10] random pt2: re-init all pools on zero Matt Mackall 0 siblings, 1 reply; 10+ messages in thread From: Matt Mackall @ 2005-01-15 0:49 UTC (permalink / raw) To: Andrew Morton, Theodore Ts'o; +Cc: linux-kernel ZAPENTCNT is now effectively identical to RNDCLEARPOOL, fall through Signed-off-by: Matt Mackall <mpm@selenic.com> Index: rnd/drivers/char/random.c =================================================================== --- rnd.orig/drivers/char/random.c 2005-01-12 21:28:00.196490892 -0800 +++ rnd/drivers/char/random.c 2005-01-12 21:28:01.110374382 -0800 @@ -1748,10 +1748,6 @@ wake_up_interruptible(&random_read_wait); return 0; case RNDZAPENTCNT: - if (!capable(CAP_SYS_ADMIN)) - return -EPERM; - random_state->entropy_count = 0; - return 0; case RNDCLEARPOOL: /* Clear the entropy pool counters. */ if (!capable(CAP_SYS_ADMIN)) ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 4/10] random pt2: re-init all pools on zero 2005-01-15 0:49 ` [PATCH 3/10] random pt2: combine legacy ioctls Matt Mackall @ 2005-01-15 0:49 ` Matt Mackall 2005-01-15 0:49 ` [PATCH 5/10] random pt2: simplify initialization Matt Mackall 0 siblings, 1 reply; 10+ messages in thread From: Matt Mackall @ 2005-01-15 0:49 UTC (permalink / raw) To: Andrew Morton, Theodore Ts'o; +Cc: linux-kernel Re-init all three pools in ioctls Clear entropy count in init_std_data under a lock Add kerneldoc comment Signed-off-by: Matt Mackall <mpm@selenic.com> Index: rnd/drivers/char/random.c =================================================================== --- rnd.orig/drivers/char/random.c 2005-01-12 21:28:01.110374382 -0800 +++ rnd/drivers/char/random.c 2005-01-12 21:28:02.593185340 -0800 @@ -1473,16 +1473,14 @@ EXPORT_SYMBOL(get_random_bytes); -/********************************************************************* - * - * Functions to interface with Linux - * - *********************************************************************/ - /* - * Initialize the random pool with standard stuff. + * init_std_data - initialize pool with system data * - * NOTE: This is an OS-dependent function. + * @r: pool to initialize + * + * This function clears the pool's entropy count and mixes some system + * data into the pool to prepare it for use. The pool is not cleared + * as that can only decrease the entropy in the pool. */ static void init_std_data(struct entropy_store *r) { @@ -1490,6 +1488,11 @@ __u32 words[2]; char *p; int i; + unsigned long flags; + + spin_lock_irqsave(&r->lock, flags); + r->entropy_count = 0; + spin_unlock_irqrestore(&r->lock, flags); do_gettimeofday(&tv); words[0] = tv.tv_sec; @@ -1752,8 +1755,9 @@ /* Clear the entropy pool counters. */ if (!capable(CAP_SYS_ADMIN)) return -EPERM; - random_state->entropy_count = 0; init_std_data(random_state); + init_std_data(sec_random_state); + init_std_data(urandom_state); return 0; default: return -EINVAL; ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 5/10] random pt2: simplify initialization 2005-01-15 0:49 ` [PATCH 4/10] random pt2: re-init all pools on zero Matt Mackall @ 2005-01-15 0:49 ` Matt Mackall 2005-01-15 0:49 ` [PATCH 6/10] random pt2: kill memsets of static data Matt Mackall 0 siblings, 1 reply; 10+ messages in thread From: Matt Mackall @ 2005-01-15 0:49 UTC (permalink / raw) To: Andrew Morton, Theodore Ts'o; +Cc: linux-kernel Simplify the init code Signed-off-by: Matt Mackall <mpm@selenic.com> Index: rnd/drivers/char/random.c =================================================================== --- rnd.orig/drivers/char/random.c 2005-01-12 21:28:02.593185340 -0800 +++ rnd/drivers/char/random.c 2005-01-12 21:28:03.909017586 -0800 @@ -1485,9 +1485,6 @@ static void init_std_data(struct entropy_store *r) { struct timeval tv; - __u32 words[2]; - char *p; - int i; unsigned long flags; spin_lock_irqsave(&r->lock, flags); @@ -1495,20 +1492,9 @@ spin_unlock_irqrestore(&r->lock, flags); do_gettimeofday(&tv); - words[0] = tv.tv_sec; - words[1] = tv.tv_usec; - add_entropy_words(r, words, 2); - - /* - * This doesn't lock system.utsname. However, we are generating - * entropy so a race with a name set here is fine. - */ - p = (char *) &system_utsname; - for (i = sizeof(system_utsname) / sizeof(words); i; i--) { - memcpy(words, p, sizeof(words)); - add_entropy_words(r, words, sizeof(words)/4); - p += sizeof(words); - } + add_entropy_words(r, (__u32 *)&tv, sizeof(tv)/4); + add_entropy_words(r, (__u32 *)&system_utsname, + sizeof(system_utsname)/4); } static int __init rand_initialize(void) ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 6/10] random pt2: kill memsets of static data 2005-01-15 0:49 ` [PATCH 5/10] random pt2: simplify initialization Matt Mackall @ 2005-01-15 0:49 ` Matt Mackall 2005-01-15 0:49 ` [PATCH 7/10] random pt2: kill dead extract_state struct Matt Mackall 0 siblings, 1 reply; 10+ messages in thread From: Matt Mackall @ 2005-01-15 0:49 UTC (permalink / raw) To: Andrew Morton, Theodore Ts'o; +Cc: linux-kernel Remove redundant memsets of BSS data Signed-off-by: Matt Mackall <mpm@selenic.com> Index: rnd/drivers/char/random.c =================================================================== --- rnd.orig/drivers/char/random.c 2005-01-12 21:28:03.909017586 -0800 +++ rnd/drivers/char/random.c 2005-01-12 21:28:04.834899546 -0800 @@ -1499,8 +1499,6 @@ static int __init rand_initialize(void) { - int i; - if (create_entropy_store(DEFAULT_POOL_SIZE, "primary", &random_state)) goto err; if (batch_entropy_init(BATCH_ENTROPY_SIZE, random_state)) @@ -1517,10 +1515,6 @@ #ifdef CONFIG_SYSCTL sysctl_init_random(random_state); #endif - for (i = 0; i < NR_IRQS; i++) - irq_timer_state[i] = NULL; - memset(&input_timer_state, 0, sizeof(struct timer_rand_state)); - memset(&extract_timer_state, 0, sizeof(struct timer_rand_state)); extract_timer_state.dont_count_entropy = 1; return 0; err: ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 7/10] random pt2: kill dead extract_state struct 2005-01-15 0:49 ` [PATCH 6/10] random pt2: kill memsets of static data Matt Mackall @ 2005-01-15 0:49 ` Matt Mackall 2005-01-15 0:49 ` [PATCH 8/10] random pt2: kill 2.2 compat waitqueue defs Matt Mackall 0 siblings, 1 reply; 10+ messages in thread From: Matt Mackall @ 2005-01-15 0:49 UTC (permalink / raw) To: Andrew Morton, Theodore Ts'o; +Cc: linux-kernel Remove unused extract_timer_state struct. It was formerly used to feedback zero-entropy timing samples while extracting entropy, but that had a tendency to overwhelm the batch processing queue and prevent storing real samples. Signed-off-by: Matt Mackall <mpm@selenic.com> Index: rnd/drivers/char/random.c =================================================================== --- rnd.orig/drivers/char/random.c 2005-01-12 21:28:04.834899546 -0800 +++ rnd/drivers/char/random.c 2005-01-12 21:28:05.741783928 -0800 @@ -777,7 +777,6 @@ }; static struct timer_rand_state input_timer_state; -static struct timer_rand_state extract_timer_state; static struct timer_rand_state *irq_timer_state[NR_IRQS]; /* @@ -1515,7 +1514,6 @@ #ifdef CONFIG_SYSCTL sysctl_init_random(random_state); #endif - extract_timer_state.dont_count_entropy = 1; return 0; err: return -1; ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 8/10] random pt2: kill 2.2 compat waitqueue defs 2005-01-15 0:49 ` [PATCH 7/10] random pt2: kill dead extract_state struct Matt Mackall @ 2005-01-15 0:49 ` Matt Mackall 2005-01-15 0:49 ` [PATCH 9/10] random pt2: kill redundant rotate_left definitions Matt Mackall 0 siblings, 1 reply; 10+ messages in thread From: Matt Mackall @ 2005-01-15 0:49 UTC (permalink / raw) To: Andrew Morton, Theodore Ts'o; +Cc: linux-kernel Remove Linux 2.2 compatibility cruft. Signed-off-by: Matt Mackall <mpm@selenic.com> Index: rnd/drivers/char/random.c =================================================================== --- rnd.orig/drivers/char/random.c 2005-01-12 21:28:05.741783928 -0800 +++ rnd/drivers/char/random.c 2005-01-12 21:28:06.993624332 -0800 @@ -380,16 +380,6 @@ */ /* - * Linux 2.2 compatibility - */ -#ifndef DECLARE_WAITQUEUE -#define DECLARE_WAITQUEUE(WAIT, PTR) struct wait_queue WAIT = { PTR, NULL } -#endif -#ifndef DECLARE_WAIT_QUEUE_HEAD -#define DECLARE_WAIT_QUEUE_HEAD(WAIT) struct wait_queue *WAIT -#endif - -/* * Static global variables */ static struct entropy_store *random_state; /* The default global store */ ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 9/10] random pt2: kill redundant rotate_left definitions 2005-01-15 0:49 ` [PATCH 8/10] random pt2: kill 2.2 compat waitqueue defs Matt Mackall @ 2005-01-15 0:49 ` Matt Mackall 2005-01-15 0:49 ` [PATCH 10/10] random pt2: kill misnamed log2 Matt Mackall 0 siblings, 1 reply; 10+ messages in thread From: Matt Mackall @ 2005-01-15 0:49 UTC (permalink / raw) To: Andrew Morton, Theodore Ts'o; +Cc: linux-kernel We've got three definitions of rotate_left. Remove x86 and duplicate rotate definitions. Remaining definition is fixed up such that recent gcc will generate rol instructions on x86 at least. A later patch will move this to bitops and clean up the other tree users. Signed-off-by: Matt Mackall <mpm@selenic.com> Index: rnd/drivers/char/random.c =================================================================== --- rnd.orig/drivers/char/random.c 2005-01-12 21:28:06.993624332 -0800 +++ rnd/drivers/char/random.c 2005-01-12 21:28:07.768525540 -0800 @@ -401,26 +401,10 @@ * purposes * *****************************************************************/ - -/* - * Unfortunately, while the GCC optimizer for the i386 understands how - * to optimize a static rotate left of x bits, it doesn't know how to - * deal with a variable rotate of x bits. So we use a bit of asm magic. - */ -#if (!defined (__i386__)) -static inline __u32 rotate_left(int i, __u32 word) -{ - return (word << i) | (word >> (32 - i)); -} -#else -static inline __u32 rotate_left(int i, __u32 word) +static inline __u32 rol32(__u32 word, int shift) { - __asm__("roll %%cl,%0" - :"=r" (word) - :"0" (word),"c" (i)); - return word; + return (word << shift) | (word >> (32 - shift)); } -#endif /* * More asm magic.... @@ -572,7 +556,7 @@ add_ptr = r->add_ptr; while (nwords--) { - w = rotate_left(input_rotate, next_w); + w = rol32(input_rotate, next_w); if (nwords > 0) next_w = *in++; i = add_ptr = (add_ptr - 1) & wordmask; @@ -941,10 +925,8 @@ #define K3 0x8F1BBCDCL /* Rounds 40-59: sqrt(5) * 2^30 */ #define K4 0xCA62C1D6L /* Rounds 60-79: sqrt(10) * 2^30 */ -#define ROTL(n,X) (((X) << n ) | ((X) >> (32 - n))) - #define subRound(a, b, c, d, e, f, k, data) \ - (e += ROTL(5, a) + f(b, c, d) + k + data, b = ROTL(30, b)) + (e += rol32(a, 5) + f(b, c, d) + k + data, b = rol32(b, 30)) static void SHATransform(__u32 digest[85], __u32 const data[16]) { @@ -962,7 +944,7 @@ memcpy(W, data, 16*sizeof(__u32)); for (i = 0; i < 64; i++) { TEMP = W[i] ^ W[i+2] ^ W[i+8] ^ W[i+13]; - W[i+16] = ROTL(1, TEMP); + W[i+16] = rol32(TEMP, 1); } /* Set up first buffer and local data buffer */ @@ -990,25 +972,25 @@ else TEMP = f4(B, C, D) + K4; } - TEMP += ROTL(5, A) + E + W[i]; - E = D; D = C; C = ROTL(30, B); B = A; A = TEMP; + TEMP += rol32(A, 5) + E + W[i]; + E = D; D = C; C = rol32(B, 30); B = A; A = TEMP; } #elif SHA_CODE_SIZE == 1 for (i = 0; i < 20; i++) { - TEMP = f1(B, C, D) + K1 + ROTL(5, A) + E + W[i]; - E = D; D = C; C = ROTL(30, B); B = A; A = TEMP; + TEMP = f1(B, C, D) + K1 + rol32(A, 5) + E + W[i]; + E = D; D = C; C = rol32(B, 30); B = A; A = TEMP; } for (; i < 40; i++) { - TEMP = f2(B, C, D) + K2 + ROTL(5, A) + E + W[i]; - E = D; D = C; C = ROTL(30, B); B = A; A = TEMP; + TEMP = f2(B, C, D) + K2 + rol32(A, 5) + E + W[i]; + E = D; D = C; C = rol32(B, 30); B = A; A = TEMP; } for (; i < 60; i++) { - TEMP = f3(B, C, D) + K3 + ROTL(5, A) + E + W[i]; - E = D; D = C; C = ROTL(30, B); B = A; A = TEMP; + TEMP = f3(B, C, D) + K3 + rol32(A, 5) + E + W[i]; + E = D; D = C; C = rol22(B, 30); B = A; A = TEMP; } for (; i < 80; i++) { - TEMP = f4(B, C, D) + K4 + ROTL(5, A) + E + W[i]; - E = D; D = C; C = ROTL(30, B); B = A; A = TEMP; + TEMP = f4(B, C, D) + K4 + rol32(A, 5) + E + W[i]; + E = D; D = C; C = rol32(B, 30); B = A; A = TEMP; } #elif SHA_CODE_SIZE == 2 for (i = 0; i < 20; i += 5) { @@ -1138,7 +1120,6 @@ #undef W } -#undef ROTL #undef f1 #undef f2 #undef f3 ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 10/10] random pt2: kill misnamed log2 2005-01-15 0:49 ` [PATCH 9/10] random pt2: kill redundant rotate_left definitions Matt Mackall @ 2005-01-15 0:49 ` Matt Mackall 0 siblings, 0 replies; 10+ messages in thread From: Matt Mackall @ 2005-01-15 0:49 UTC (permalink / raw) To: Andrew Morton, Theodore Ts'o; +Cc: linux-kernel Remove incorrectly named ln (it's log2!) and x86 asm function and replace with fls bitop. Signed-off-by: Matt Mackall <mpm@selenic.com> Index: rnd/drivers/char/random.c =================================================================== --- rnd.orig/drivers/char/random.c 2005-01-12 21:28:07.768525540 -0800 +++ rnd/drivers/char/random.c 2005-01-12 21:28:08.700406735 -0800 @@ -395,54 +395,11 @@ static void sysctl_init_random(struct entropy_store *random_state); #endif -/***************************************************************** - * - * Utility functions, with some ASM defined functions for speed - * purposes - * - *****************************************************************/ static inline __u32 rol32(__u32 word, int shift) { return (word << shift) | (word >> (32 - shift)); } -/* - * More asm magic.... - * - * For entropy estimation, we need to do an integral base 2 - * logarithm. - * - * Note the "12bits" suffix - this is used for numbers between - * 0 and 4095 only. This allows a few shortcuts. - */ -#if 0 /* Slow but clear version */ -static inline __u32 int_ln_12bits(__u32 word) -{ - __u32 nbits = 0; - - while (word >>= 1) - nbits++; - return nbits; -} -#else /* Faster (more clever) version, courtesy Colin Plumb */ -static inline __u32 int_ln_12bits(__u32 word) -{ - /* Smear msbit right to make an n-bit mask */ - word |= word >> 8; - word |= word >> 4; - word |= word >> 2; - word |= word >> 1; - /* Remove one bit to make this a logarithm */ - word >>= 1; - /* Count the bits set in the word */ - word -= (word >> 1) & 0x555; - word = (word & 0x333) + ((word >> 2) & 0x333); - word += (word >> 4); - word += (word >> 8); - return word & 15; -} -#endif - #if 0 static int debug = 0; module_param(debug, bool, 0644); @@ -808,10 +765,7 @@ * Round down by 1 bit on general principles, * and limit entropy entimate to 12 bits. */ - delta >>= 1; - delta &= (1 << 12) - 1; - - entropy = int_ln_12bits(delta); + entropy = min_t(int, fls(delta>>1), 11); } /* ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2005-01-15 1:03 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2005-01-15 0:49 [PATCH 1/10] random pt2: cleanup waitqueue logic, fix missed wakeup Matt Mackall 2005-01-15 0:49 ` [PATCH 2/10] random pt2: kill pool clearing Matt Mackall 2005-01-15 0:49 ` [PATCH 3/10] random pt2: combine legacy ioctls Matt Mackall 2005-01-15 0:49 ` [PATCH 4/10] random pt2: re-init all pools on zero Matt Mackall 2005-01-15 0:49 ` [PATCH 5/10] random pt2: simplify initialization Matt Mackall 2005-01-15 0:49 ` [PATCH 6/10] random pt2: kill memsets of static data Matt Mackall 2005-01-15 0:49 ` [PATCH 7/10] random pt2: kill dead extract_state struct Matt Mackall 2005-01-15 0:49 ` [PATCH 8/10] random pt2: kill 2.2 compat waitqueue defs Matt Mackall 2005-01-15 0:49 ` [PATCH 9/10] random pt2: kill redundant rotate_left definitions Matt Mackall 2005-01-15 0:49 ` [PATCH 10/10] random pt2: kill misnamed log2 Matt Mackall
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox