diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2022-07-14 20:28:22 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2022-07-18 15:04:04 +0200 |
commit | b7a68f67ff4911e8a842d03f6f97fa91a8d483f5 (patch) | |
tree | 14f878e40474fd14b5cfb224b794e8e5e1919f3f /drivers/char | |
parent | b8ac29b40183a6038919768b5d189c9bd91ce9b4 (diff) | |
download | lwn-b7a68f67ff4911e8a842d03f6f97fa91a8d483f5.tar.gz lwn-b7a68f67ff4911e8a842d03f6f97fa91a8d483f5.zip |
random: use try_cmpxchg in _credit_init_bits
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 <ubizjak@gmail.com>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/random.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/char/random.c b/drivers/char/random.c index a1af90bacc9f..0c6568ae5f68 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c @@ -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. */ |