Patch "random: help compiler out with fast_mix() by using simpler arguments" has been added to the 4.14-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    random: help compiler out with fast_mix() by using simpler arguments

to the 4.14-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     random-help-compiler-out-with-fast_mix-by-using-simpler-arguments.patch
and it can be found in the queue-4.14 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.


>From foo@baz Thu Jun 16 07:08:33 PM CEST 2022
From: "Jason A. Donenfeld" <Jason@xxxxxxxxx>
Date: Fri, 6 May 2022 23:19:43 +0200
Subject: random: help compiler out with fast_mix() by using simpler arguments

From: "Jason A. Donenfeld" <Jason@xxxxxxxxx>

commit 791332b3cbb080510954a4c152ce02af8832eac9 upstream.

Now that fast_mix() has more than one caller, gcc no longer inlines it.
That's fine. But it also doesn't handle the compound literal argument we
pass it very efficiently, nor does it handle the loop as well as it
could. So just expand the code to spell out this function so that it
generates the same code as it did before. Performance-wise, this now
behaves as it did before the last commit. The difference in actual code
size on x86 is 45 bytes, which is less than a cache line.

Signed-off-by: Jason A. Donenfeld <Jason@xxxxxxxxx>
Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
---
 drivers/char/random.c |   44 +++++++++++++++++++++++---------------------
 1 file changed, 23 insertions(+), 21 deletions(-)

--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -1026,25 +1026,30 @@ static DEFINE_PER_CPU(struct fast_pool,
  * and therefore this has no security on its own. s represents the
  * four-word SipHash state, while v represents a two-word input.
  */
-static void fast_mix(unsigned long s[4], const unsigned long v[2])
+static void fast_mix(unsigned long s[4], unsigned long v1, unsigned long v2)
 {
-	size_t i;
-
-	for (i = 0; i < 2; ++i) {
-		s[3] ^= v[i];
 #ifdef CONFIG_64BIT
-		s[0] += s[1]; s[1] = rol64(s[1], 13); s[1] ^= s[0]; s[0] = rol64(s[0], 32);
-		s[2] += s[3]; s[3] = rol64(s[3], 16); s[3] ^= s[2];
-		s[0] += s[3]; s[3] = rol64(s[3], 21); s[3] ^= s[0];
-		s[2] += s[1]; s[1] = rol64(s[1], 17); s[1] ^= s[2]; s[2] = rol64(s[2], 32);
+#define PERM() do { \
+	s[0] += s[1]; s[1] = rol64(s[1], 13); s[1] ^= s[0]; s[0] = rol64(s[0], 32); \
+	s[2] += s[3]; s[3] = rol64(s[3], 16); s[3] ^= s[2]; \
+	s[0] += s[3]; s[3] = rol64(s[3], 21); s[3] ^= s[0]; \
+	s[2] += s[1]; s[1] = rol64(s[1], 17); s[1] ^= s[2]; s[2] = rol64(s[2], 32); \
+} while (0)
 #else
-		s[0] += s[1]; s[1] = rol32(s[1],  5); s[1] ^= s[0]; s[0] = rol32(s[0], 16);
-		s[2] += s[3]; s[3] = rol32(s[3],  8); s[3] ^= s[2];
-		s[0] += s[3]; s[3] = rol32(s[3],  7); s[3] ^= s[0];
-		s[2] += s[1]; s[1] = rol32(s[1], 13); s[1] ^= s[2]; s[2] = rol32(s[2], 16);
+#define PERM() do { \
+	s[0] += s[1]; s[1] = rol32(s[1],  5); s[1] ^= s[0]; s[0] = rol32(s[0], 16); \
+	s[2] += s[3]; s[3] = rol32(s[3],  8); s[3] ^= s[2]; \
+	s[0] += s[3]; s[3] = rol32(s[3],  7); s[3] ^= s[0]; \
+	s[2] += s[1]; s[1] = rol32(s[1], 13); s[1] ^= s[2]; s[2] = rol32(s[2], 16); \
+} while (0)
 #endif
-		s[0] ^= v[i];
-	}
+
+	s[3] ^= v1;
+	PERM();
+	s[0] ^= v1;
+	s[3] ^= v2;
+	PERM();
+	s[0] ^= v2;
 }
 
 #ifdef CONFIG_SMP
@@ -1114,10 +1119,8 @@ void add_interrupt_randomness(int irq)
 	struct pt_regs *regs = get_irq_regs();
 	unsigned int new_count;
 
-	fast_mix(fast_pool->pool, (unsigned long[2]){
-		entropy,
-		(regs ? instruction_pointer(regs) : _RET_IP_) ^ swab(irq)
-	});
+	fast_mix(fast_pool->pool, entropy,
+		 (regs ? instruction_pointer(regs) : _RET_IP_) ^ swab(irq));
 	new_count = ++fast_pool->count;
 
 	if (new_count & MIX_INFLIGHT)
@@ -1157,8 +1160,7 @@ static void add_timer_randomness(struct
 	 * sometime after, so mix into the fast pool.
 	 */
 	if (in_irq()) {
-		fast_mix(this_cpu_ptr(&irq_randomness)->pool,
-			 (unsigned long[2]){ entropy, num });
+		fast_mix(this_cpu_ptr(&irq_randomness)->pool, entropy, num);
 	} else {
 		spin_lock_irqsave(&input_pool.lock, flags);
 		_mix_pool_bytes(&entropy, sizeof(entropy));


Patches currently in stable-queue which might be from Jason@xxxxxxxxx are

queue-4.14/random-do-not-take-pool-spinlock-at-boot.patch
queue-4.14/random-remove-kernel.random.read_wakeup_threshold.patch
queue-4.14/random-simplify-arithmetic-function-flow-in-account.patch
queue-4.14/random-order-timer-entropy-functions-below-interrupt-functions.patch
queue-4.14/random-introduce-drain_entropy-helper-to-declutter-crng_reseed.patch
queue-4.14/random-fix-locking-in-crng_fast_load.patch
queue-4.14/random-cleanup-uuid-handling.patch
queue-4.14/random-group-userspace-read-write-functions.patch
queue-4.14/random-make-credit_entropy_bits-always-safe.patch
queue-4.14/latent_entropy-avoid-build-error-when-plugin-cflags-are-not-set.patch
queue-4.14/revert-hwrng-core-freeze-khwrng-thread-during-suspend.patch
queue-4.14/drivers-char-random.c-make-primary_crng-static.patch
queue-4.14/random-do-not-re-init-if-crng_reseed-completes-before-primary-init.patch
queue-4.14/random-always-fill-buffer-in-get_random_bytes_wait.patch
queue-4.14/random-use-proper-jiffies-comparison-macro.patch
queue-4.14/init-call-time_init-before-rand_initialize.patch
queue-4.14/random-split-primary-secondary-crng-init-paths.patch
queue-4.14/random-pull-add_hwgenerator_randomness-declaration-into-random.h.patch
queue-4.14/random-unify-early-init-crng-load-accounting.patch
queue-4.14/drivers-char-random.c-remove-unused-stuct-poolinfo-poolbits.patch
queue-4.14/random-use-blake2s-instead-of-sha1-in-extraction.patch
queue-4.14/random-make-cpu-trust-a-boot-parameter.patch
queue-4.14/random-convert-to-using-fops-write_iter.patch
queue-4.14/random-initialize-chacha20-constants-with-correct-endianness.patch
queue-4.14/random-remove-incomplete-last_data-logic.patch
queue-4.14/random-group-entropy-extraction-functions.patch
queue-4.14/random-optimize-add_interrupt_randomness.patch
queue-4.14/random-add-proper-spdx-header.patch
queue-4.14/linux-random.h-remove-arch_has_random-arch_has_random_seed.patch
queue-4.14/random-rewrite-header-introductory-comment.patch
queue-4.14/random-make-dev-random-be-almost-like-dev-urandom.patch
queue-4.14/random-remove-ifdef-d-out-interrupt-bench.patch
queue-4.14/um-use-fallback-for-random_get_entropy-instead-of-zero.patch
queue-4.14/lib-crypto-sha1-re-roll-loops-to-reduce-code-size.patch
queue-4.14/random-tie-batched-entropy-generation-to-base_crng-generation.patch
queue-4.14/sparc-use-fallback-for-random_get_entropy-instead-of-zero.patch
queue-4.14/random-use-linear-min-entropy-accumulation-crediting.patch
queue-4.14/random-remove-batched-entropy-locking.patch
queue-4.14/xtensa-use-fallback-for-random_get_entropy-instead-of-zero.patch
queue-4.14/powerpc-remove-arch_has_random-arch_has_random_seed.patch
queue-4.14/fdt-add-support-for-rng-seed.patch
queue-4.14/random-continually-use-hwgenerator-randomness.patch
queue-4.14/random-access-input_pool_data-directly-rather-than-through-pointer.patch
queue-4.14/random-add-arch_get_random_-long_early.patch
queue-4.14/random-inline-leaves-of-rand_initialize.patch
queue-4.14/random-cleanup-poolinfo-abstraction.patch
queue-4.14/random-wire-up-fops-splice_-read-write-_iter.patch
queue-4.14/random-handle-latent-entropy-and-command-line-from-random_init.patch
queue-4.14/random-remove-use_input_pool-parameter-from-crng_reseed.patch
queue-4.14/random-credit-architectural-init-the-exact-amount.patch
queue-4.14/ia64-define-get_cycles-macro-for-arch-override.patch
queue-4.14/random-replace-custom-notifier-chain-with-standard-one.patch
queue-4.14/random-support-freezable-kthreads-in-add_hwgenerator_randomness.patch
queue-4.14/random-document-get_random_int-family.patch
queue-4.14/random-remove-the-blocking-pool.patch
queue-4.14/random-avoid-initializing-twice-in-credit-race.patch
queue-4.14/random-avoid-warnings-for-config_numa-builds.patch
queue-4.14/crypto-drbg-add-fips-140-2-ctrng-for-noise-source.patch
queue-4.14/random-mark-bootloader-randomness-code-as-__init.patch
queue-4.14/random-zero-buffer-after-reading-entropy-from-userspace.patch
queue-4.14/random-remove-whitespace-and-reorder-includes.patch
queue-4.14/random-ignore-grnd_random-in-getentropy-2.patch
queue-4.14/random-clear-fast-pool-crng-and-batches-in-cpuhp-bring-up.patch
queue-4.14/random-document-add_hwgenerator_randomness-with-other-input-functions.patch
queue-4.14/random-fix-typo-in-add_timer_randomness.patch
queue-4.14/random-do-crng-pre-init-loading-in-worker-rather-than-irq.patch
queue-4.14/powerpc-use-bool-in-archrandom.h.patch
queue-4.14/random-do-not-split-fast-init-input-in-add_hwgenerator_randomness.patch
queue-4.14/timekeeping-add-raw-clock-fallback-for-random_get_entropy.patch
queue-4.14/random-early-initialization-of-chacha-constants.patch
queue-4.14/crypto-drbg-prepare-for-more-fine-grained-tracking-of-seeding-state.patch
queue-4.14/random-delete-code-to-pull-data-into-pools.patch
queue-4.14/crypto-drbg-always-try-to-free-jitter-rng-instance.patch
queue-4.14/random-simplify-entropy-debiting.patch
queue-4.14/random-don-t-reset-crng_init_cnt-on-urandom_read.patch
queue-4.14/random-skip-fast_init-if-hwrng-provides-large-chunk-of-entropy.patch
queue-4.14/random-use-siphash-as-interrupt-entropy-accumulator.patch
queue-4.14/random-avoid-checking-crng_ready-twice-in-random_init.patch
queue-4.14/random-fix-soft-lockup-when-trying-to-read-from-an-uninitialized-blocking-pool.patch
queue-4.14/random-group-sysctl-functions.patch
queue-4.14/random-don-t-let-644-read-only-sysctls-be-written-to.patch
queue-4.14/random-document-crng_fast_key_erasure-destination-possibility.patch
queue-4.14/random-only-wake-up-writers-after-zap-if-threshold-was-passed.patch
queue-4.14/random-use-wait_event_freezable-in-add_hwgenerator_randomness.patch
queue-4.14/random-check-for-signal-and-try-earlier-when-generating-entropy.patch
queue-4.14/random-check-for-signals-every-page_size-chunk-of-dev-random.patch
queue-4.14/arm-use-fallback-for-random_get_entropy-instead-of-zero.patch
queue-4.14/random-absorb-fast-pool-into-input-pool-after-fast-load.patch
queue-4.14/random-give-sysctl_random_min_urandom_seed-a-more-sensible-value.patch
queue-4.14/crypto-blake2s-generic-c-library-implementation-and-selftest.patch
queue-4.14/random-cleanup-fractional-entropy-shift-constants.patch
queue-4.14/random-use-rdseed-instead-of-rdrand-in-entropy-extraction.patch
queue-4.14/random-move-rand_initialize-earlier.patch
queue-4.14/random-don-t-wake-crng_init_wait-when-crng_init-1.patch
queue-4.14/random-add-a-urandom_read_nowait-for-random-apis-that-don-t-warn.patch
queue-4.14/random-do-not-sign-extend-bytes-for-rotation-when-mixing.patch
queue-4.14/random-move-initialization-functions-out-of-hot-pages.patch
queue-4.14/random-remove-dead-code-left-over-from-blocking-pool.patch
queue-4.14/drivers-char-random.c-constify-poolinfo_table.patch
queue-4.14/crypto-drbg-track-whether-drbg-was-seeded-with-rng_is_initialized.patch
queue-4.14/random-use-computational-hash-for-entropy-extraction.patch
queue-4.14/random-add-and-use-pr_fmt.patch
queue-4.14/random-round-robin-registers-as-ulong-not-u32.patch
queue-4.14/random-always-wake-up-entropy-writers-after-extraction.patch
queue-4.14/s390-remove-arch_has_random-arch_has_random_seed.patch
queue-4.14/random-do-not-xor-rdrand-when-writing-into-dev-random.patch
queue-4.14/crypto-drbg-make-reseeding-from-get_random_bytes-synchronous.patch
queue-4.14/random-convert-to-entropy_bits-for-better-code-readability.patch
queue-4.14/char-random-add-a-newline-at-the-end-of-the-file.patch
queue-4.14/random-move-randomize_page-into-mm-where-it-belongs.patch
queue-4.14/random-only-call-crng_finalize_init-for-primary_crng.patch
queue-4.14/random-cleanup-integer-types.patch
queue-4.14/random-re-add-removed-comment-about-get_random_-u32-u64-reseeding.patch
queue-4.14/random-unify-cycles_t-and-jiffies-usage-and-types.patch
queue-4.14/random-insist-on-random_get_entropy-existing-in-order-to-simplify.patch
queue-4.14/random-group-initialization-wait-functions.patch
queue-4.14/linux-random.h-mark-config_arch_random-functions-__must_check.patch
queue-4.14/random-remove-unused-extract_entropy-reserved-argument.patch
queue-4.14/random-check-for-signal_pending-outside-of-need_resched-check.patch
queue-4.14/random-access-primary_pool-directly-rather-than-through-pointer.patch
queue-4.14/random-fix-sysctl-documentation-nits.patch
queue-4.14/random-remove-unused-tracepoints.patch
queue-4.14/random-only-read-from-dev-random-after-its-pool-has-received-128-bits.patch
queue-4.14/nios2-use-fallback-for-random_get_entropy-instead-of-zero.patch
queue-4.14/random-treat-bootloader-trust-toggle-the-same-way-as-cpu-trust-toggle.patch
queue-4.14/random-make-consistent-usage-of-crng_ready.patch
queue-4.14/lib-crypto-blake2s-move-hmac-construction-into-wireguard.patch
queue-4.14/parisc-define-get_cycles-macro-for-arch-override.patch
queue-4.14/x86-tsc-use-fallback-for-random_get_entropy-instead-of-zero.patch
queue-4.14/crypto-chacha20-fix-keystream-alignment-for-chacha20_block.patch
queue-4.14/random-add-grnd_insecure-to-return-best-effort-non-cryptographic-bytes.patch
queue-4.14/random-fix-whitespace-pre-random-bytes-work.patch
queue-4.14/crypto-drbg-move-dynamic-reseed_threshold-adjustments-to-__drbg_seed.patch
queue-4.14/random-check-for-signals-after-page-of-pool-writes.patch
queue-4.14/random-make-random_get_entropy-return-an-unsigned-long.patch
queue-4.14/random-check-for-crng_init-0-in-add_device_randomness.patch
queue-4.14/random-add-a-config-option-to-trust-the-cpu-s-hwrng.patch
queue-4.14/random-remove-unnecessary-unlikely.patch
queue-4.14/random-defer-fast-pool-mixing-to-worker.patch
queue-4.14/random-harmonize-crng-init-done-messages.patch
queue-4.14/crypto-blake2s-include-linux-bug.h-instead-of-asm-bug.h.patch
queue-4.14/random-use-static-branch-for-crng_ready.patch
queue-4.14/random-rather-than-entropy_store-abstraction-use-global.patch
queue-4.14/drivers-char-random.c-remove-unused-dont_count_entropy.patch
queue-4.14/random-remove-extern-from-functions-in-header.patch
queue-4.14/siphash-use-one-source-of-truth-for-siphash-permutations.patch
queue-4.14/random-group-entropy-collection-functions.patch
queue-4.14/random-de-duplicate-input_pool-constants.patch
queue-4.14/random-mix-build-time-latent-entropy-into-pool-at-init.patch
queue-4.14/random-remove-useless-header-comment.patch
queue-4.14/linux-random.h-use-false-with-bool.patch
queue-4.14/maintainers-co-maintain-random.c.patch
queue-4.14/random-remove-outdated-int_max-6-check-in-urandom_read.patch
queue-4.14/m68k-use-fallback-for-random_get_entropy-instead-of-zero.patch
queue-4.14/alpha-define-get_cycles-macro-for-arch-override.patch
queue-4.14/random-mix-bootloader-randomness-into-pool.patch
queue-4.14/random-remove-some-dead-code-of-poolinfo.patch
queue-4.14/random-do-not-use-batches-when-crng_ready.patch
queue-4.14/crypto-drbg-always-seeded-with-sp800-90b-compliant-noise-source.patch
queue-4.14/s390-define-get_cycles-macro-for-arch-override.patch
queue-4.14/random-do-not-pretend-to-handle-premature-next-security-model.patch
queue-4.14/random-avoid-arch_get_random_seed_long-when-collecting-irq-randomness.patch
queue-4.14/random-use-is_enabled-config_numa-instead-of-ifdefs.patch
queue-4.14/random-make-crng-state-queryable.patch
queue-4.14/random-avoid-superfluous-call-to-rdrand-in-crng-extraction.patch
queue-4.14/random-use-symbolic-constants-for-crng_init-states.patch
queue-4.14/random-reseed-more-often-immediately-after-booting.patch
queue-4.14/random-ensure-early-rdseed-goes-through-mixer-on-init.patch
queue-4.14/random-deobfuscate-irq-u32-u64-contributions.patch
queue-4.14/random-do-not-use-input-pool-from-hard-irqs.patch
queue-4.14/random-help-compiler-out-with-fast_mix-by-using-simpler-arguments.patch
queue-4.14/revert-random-use-static-branch-for-crng_ready.patch
queue-4.14/random-fix-crash-on-multiple-early-calls-to-add_bootloader_randomness.patch
queue-4.14/random-return-nbytes-filled-from-hw-rng.patch
queue-4.14/random-account-for-arch-randomness-in-bits.patch
queue-4.14/crypto-blake2s-adjust-include-guard-naming.patch
queue-4.14/random-do-not-allow-user-to-keep-crng-key-around-on-stack.patch
queue-4.14/x86-remove-arch_has_random-arch_has_random_seed.patch
queue-4.14/crypto-deduplicate-le32_to_cpu_array-and-cpu_to_le32_array.patch
queue-4.14/random-remove-ratelimiting-for-in-kernel-unseeded-randomness.patch
queue-4.14/random-remove-unused-irq_flags-argument-from-add_interrupt_randomness.patch
queue-4.14/random-prepend-remaining-pool-constants-with-pool_.patch
queue-4.14/powerpc-define-get_cycles-macro-for-arch-override.patch
queue-4.14/random-remove-unused-output_pool-constants.patch
queue-4.14/mips-use-fallback-for-random_get_entropy-instead-of-just-c0-random.patch
queue-4.14/random-use-hash-function-for-crng_slow_load.patch
queue-4.14/random-fix-typo-in-comments.patch
queue-4.14/random-remove-preempt-disabled-region.patch
queue-4.14/random-use-proper-return-types-on-get_random_-int-long-_wait.patch



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux