• Linus Torvalds's avatar
    Merge tag 'random-6.1-rc1-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/crng/random · 8adc0486
    Linus Torvalds authored
    Pull random number generator updates from Jason Donenfeld:
    
     - Huawei reported that when they updated their kernel from 4.4 to
       something much newer, some userspace code they had broke, the culprit
       being the accidental removal of O_NONBLOCK from /dev/random way back
       in 5.6. It's been gone for over 2 years now and this is the first
       we've heard of it, but userspace breakage is userspace breakage, so
       O_NONBLOCK is now back.
    
     - Use randomness from hardware RNGs much more often during early boot,
       at the same interval that crng reseeds are done, from Dominik.
    
     - A semantic change in hardware RNG throttling, so that the hwrng
       framework can properly feed random.c with randomness from hardware
       RNGs that aren't specifically marked as creditable.
    
       A related patch coming to you via Herbert's hwrng tree depends on
       this one, not to compile, but just to function properly, so you may
       want to merge this PULL before that one.
    
     - A fix to clamp credited bits from the interrupts pool to the size of
       the pool sample. This is mainly just a theoretical fix, as it'd be
       pretty hard to exceed it in practice.
    
     - Oracle reported that InfiniBand TCP latency regressed by around
       10-15% after a change a few cycles ago made at the request of the RT
       folks, in which we hoisted a somewhat rare operation (1 in 1024
       times) out of the hard IRQ handler and into a workqueue, a pretty
       common and boring pattern.
    
       It turns out, though, that scheduling a worker from there has
       overhead of its own, whereas scheduling a timer on that same CPU for
       the next jiffy amortizes better and doesn't incur the same overhead.
    
       I also eliminated a cache miss by moving the work_struct (and
       subsequently, the timer_list) to below a critical cache line, so that
       the more critical members that are accessed on every hard IRQ aren't
       split between two cache lines.
    
     - The boot-time initialization of the RNG has been split into two
       approximate phases: what we can accomplish before timekeeping is
       possible and what we can accomplish after.
    
       This winds up being useful so that we can use RDRAND to seed the RNG
       before CONFIG_SLAB_FREELIST_RANDOM=y systems initialize slabs, in
       addition to other early uses of randomness. The effect is that
       systems with RDRAND (or a bootloader seed) will never see any
       warnings at all when setting CONFIG_WARN_ALL_UNSEEDED_RANDOM=y. And
       kfence benefits from getting a better seed of its own.
    
     - Small systems without much entropy sometimes wind up putting some
       truncated serial number read from flash into hostname, so contribute
       utsname changes to the RNG, without crediting.
    
     - Add smaller batches to serve requests for smaller integers, and make
       use of them when people ask for random numbers bounded by a given
       compile-time constant. This has positive effects all over the tree,
       most notably in networking and kfence.
    
     - The original jitter algorithm intended (I believe) to schedule the
       timer for the next jiffy, not the next-next jiffy, yet it used
       mod_timer(jiffies + 1), which will fire on the next-next jiffy,
       instead of what I believe was intended, mod_timer(jiffies), which
       will fire on the next jiffy. So fix that.
    
     - Fix a comment typo, from William.
    
    * tag 'random-6.1-rc1-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/crng/random:
      random: clear new batches when bringing new CPUs online
      random: fix typos in get_random_bytes() comment
      random: schedule jitter credit for next jiffy, not in two jiffies
      prandom: make use of smaller types in prandom_u32_max
      random: add 8-bit and 16-bit batches
      utsname: contribute changes to RNG
      random: use init_utsname() instead of utsname()
      kfence: use better stack hash seed
      random: split initialization into early step and later step
      random: use expired timer rather than wq for mixing fast pool
      random: avoid reading two cache lines on irq randomness
      random: clamp credited irq bits to maximum mixed
      random: throttle hwrng writes if no entropy is credited
      random: use hwgenerator randomness more frequently at early boot
      random: restore O_NONBLOCK support
    8adc0486
sys.c 65.3 KB