diff options
| author | Marius Bakke <mbakke@fastmail.com> | 2019-10-08 19:24:34 +0200 | 
|---|---|---|
| committer | Marius Bakke <mbakke@fastmail.com> | 2019-10-08 19:24:34 +0200 | 
| commit | d1f3b333e6176a7879ab3742bbebb2a99f61a528 (patch) | |
| tree | 8bd82ce68bd2534a48bf13c7256997f82dd1b3f4 /gnu/packages/patches/linux-libre-active-entropy.patch | |
| parent | e01d384efcdaf564bbb221e43b81e087c8e2af06 (diff) | |
| parent | 861907f01efb1cae7f260e8cb7b991d5034a486a (diff) | |
Merge branch 'master' into staging
Diffstat (limited to 'gnu/packages/patches/linux-libre-active-entropy.patch')
| -rw-r--r-- | gnu/packages/patches/linux-libre-active-entropy.patch | 86 | 
1 files changed, 86 insertions, 0 deletions
| diff --git a/gnu/packages/patches/linux-libre-active-entropy.patch b/gnu/packages/patches/linux-libre-active-entropy.patch new file mode 100644 index 0000000000..8f081f4a19 --- /dev/null +++ b/gnu/packages/patches/linux-libre-active-entropy.patch @@ -0,0 +1,86 @@ +Try to actively add entropy instead of waiting forever. +Fixes <https://bugs.gnu.org/37501>. + +Taken from upstream: +https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/patch/?id=50ee7529ec4500c88f8664560770a7a1b65db72b + +diff --git a/drivers/char/random.c b/drivers/char/random.c +index 5d5ea4ce1442..2fda6166c1dd 100644 +--- a/drivers/char/random.c ++++ b/drivers/char/random.c +@@ -1731,6 +1731,56 @@ void get_random_bytes(void *buf, int nbytes) + } + EXPORT_SYMBOL(get_random_bytes); +  ++ ++/* ++ * Each time the timer fires, we expect that we got an unpredictable ++ * jump in the cycle counter. Even if the timer is running on another ++ * CPU, the timer activity will be touching the stack of the CPU that is ++ * generating entropy.. ++ * ++ * Note that we don't re-arm the timer in the timer itself - we are ++ * happy to be scheduled away, since that just makes the load more ++ * complex, but we do not want the timer to keep ticking unless the ++ * entropy loop is running. ++ * ++ * So the re-arming always happens in the entropy loop itself. ++ */ ++static void entropy_timer(struct timer_list *t) ++{ ++	credit_entropy_bits(&input_pool, 1); ++} ++ ++/* ++ * If we have an actual cycle counter, see if we can ++ * generate enough entropy with timing noise ++ */ ++static void try_to_generate_entropy(void) ++{ ++	struct { ++		unsigned long now; ++		struct timer_list timer; ++	} stack; ++ ++	stack.now = random_get_entropy(); ++ ++	/* Slow counter - or none. Don't even bother */ ++	if (stack.now == random_get_entropy()) ++		return; ++ ++	timer_setup_on_stack(&stack.timer, entropy_timer, 0); ++	while (!crng_ready()) { ++		if (!timer_pending(&stack.timer)) ++			mod_timer(&stack.timer, jiffies+1); ++		mix_pool_bytes(&input_pool, &stack.now, sizeof(stack.now)); ++		schedule(); ++		stack.now = random_get_entropy(); ++	} ++ ++	del_timer_sync(&stack.timer); ++	destroy_timer_on_stack(&stack.timer); ++	mix_pool_bytes(&input_pool, &stack.now, sizeof(stack.now)); ++} ++ + /* +  * Wait for the urandom pool to be seeded and thus guaranteed to supply +  * cryptographically secure random numbers. This applies to: the /dev/urandom +@@ -1745,7 +1795,17 @@ int wait_for_random_bytes(void) + { + 	if (likely(crng_ready())) + 		return 0; +-	return wait_event_interruptible(crng_init_wait, crng_ready()); ++ ++	do { ++		int ret; ++		ret = wait_event_interruptible_timeout(crng_init_wait, crng_ready(), HZ); ++		if (ret) ++			return ret > 0 ? 0 : ret; ++ ++		try_to_generate_entropy(); ++	} while (!crng_ready()); ++ ++	return 0; + } + EXPORT_SYMBOL(wait_for_random_bytes); +  | 
