Skip to content

Commit

Permalink
random: use try_cmpxchg in _credit_init_bits
Browse files Browse the repository at this point in the history
Use `!try_cmpxchg(ptr, &orig, new)` instead of `cmpxchg(ptr, orig, new)
!= orig` in _credit_init_bits. This has two benefits:

- The x86 cmpxchg instruction returns success in the ZF flag, so this
  change saves a compare after cmpxchg, as well as a related move
  instruction in front of cmpxchg.

- try_cmpxchg implicitly assigns the *ptr value to &orig when cmpxchg
  fails, enabling further code simplifications.

This patch has no functional change.

Signed-off-by: Uros Bizjak <[email protected]>
Signed-off-by: Jason A. Donenfeld <[email protected]>
  • Loading branch information
ubizjak authored and zx2c4 committed Jul 18, 2022
1 parent b8ac29b commit b7a68f6
Showing 1 changed file with 2 additions and 2 deletions.
4 changes: 2 additions & 2 deletions drivers/char/random.c
Original file line number Diff line number Diff line change
Expand Up @@ -643,10 +643,10 @@ static void __cold _credit_init_bits(size_t bits)

add = min_t(size_t, bits, POOL_BITS);

orig = READ_ONCE(input_pool.init_bits);
do {
orig = READ_ONCE(input_pool.init_bits);
new = min_t(unsigned int, POOL_BITS, orig + add);
} while (cmpxchg(&input_pool.init_bits, orig, new) != orig);
} while (!try_cmpxchg(&input_pool.init_bits, &orig, new));

if (orig < POOL_READY_BITS && new >= POOL_READY_BITS) {
crng_reseed(); /* Sets crng_init to CRNG_READY under base_crng.lock. */
Expand Down

0 comments on commit b7a68f6

Please sign in to comment.