• Len Brown's avatar
    x86: Replace RDRAND forced-reseed with simple sanity check · 0007bccc
    Len Brown authored
    x86_init_rdrand() was added with 2 goals:
    
    1. Sanity check that the built-in-self-test circuit on the Digital
       Random Number Generator (DRNG) is not complaining.  As RDRAND
       HW self-checks on every invocation, this goal is achieved
       by simply invoking RDRAND and checking its return code.
    
    2. Force a full re-seed of the random number generator.
       This was done out of paranoia to benefit the most un-sophisticated
       DRNG implementation conceivable in the architecture,
       an implementation that does not exist, and unlikely ever will.
       This worst-case full-re-seed is achieved by invoking
       a 64-bit RDRAND 8192 times.
    
    Unfortunately, this worst-case re-seed costs O(1,000us).
    Magnifying this cost, it is done from identify_cpu(), which is the
    synchronous critical path to bring a processor on-line -- repeated
    for every logical processor in the system at boot and resume from S3.
    
    As it is very expensive, and of highly dubious value, we delete the
    worst-case re-seed from the kernel.
    
    We keep the 1st goal -- sanity check the hardware, and mark it absent
    if it complains.
    
    This change reduces the cost of x86_init_rdrand() by a factor of 1,000x,
    to O(1us) from O(1,000us).
    Signed-off-by: default avatarLen Brown <len.brown@intel.com>
    Link: http://lkml.kernel.org/r/058618cc56ec6611171427ad7205e37e377aa8d4.1439738240.git.len.brown@intel.comSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    0007bccc
rdrand.c 1.64 KB