• Nayna Jain's avatar
    tpm: msleep() delays - replace with usleep_range() in i2c nuvoton driver · a233a028
    Nayna Jain authored
    Commit 500462a9 "timers: Switch to a non-cascading wheel" replaced
    the 'classic' timer wheel, which aimed for near 'exact' expiry of the
    timers.  Their analysis was that the vast majority of timeout timers
    are used as safeguards, not as real timers, and are cancelled or
    rearmed before expiration.  The only exception noted to this were
    networking timers with a small expiry time.
    
    Not included in the analysis was the TPM polling timer, which resulted
    in a longer normal delay and, every so often, a very long delay.  The
    non-cascading wheel delay is based on CONFIG_HZ.  For a description of
    the different rings and their delays, refer to the comments in
    kernel/time/timer.c.
    
    Below are the delays given for rings 0 - 2, which explains the longer
    "normal" delays and the very, long delays as seen on systems with
    CONFIG_HZ 250.
    
    * HZ 1000 steps
     * Level Offset  Granularity            Range
     *  0      0         1 ms                0 ms - 63 ms
     *  1     64         8 ms               64 ms - 511 ms
     *  2    128        64 ms              512 ms - 4095 ms (512ms - ~4s)
    
    * HZ  250
     * Level Offset  Granularity            Range
     *  0      0         4 ms                0 ms - 255 ms
     *  1     64        32 ms              256 ms - 2047 ms (256ms - ~2s)
     *  2    128       256 ms             2048 ms - 16383 ms (~2s - ~16s)
    
    Below is a comparison of extending the TPM with 1000 measurements,
    using msleep() vs. usleep_delay() when configured for 1000 hz vs. 250
    hz, before and after commit 500462a9.
    
    linux-4.7 | msleep() usleep_range()
    1000 hz: 0m44.628s | 1m34.497s 29.243s
    250 hz: 1m28.510s | 4m49.269s 32.386s
    
    linux-4.7  | min-max (msleep)  min-max (usleep_range)
    1000 hz: 0:017 - 2:760s | 0:015 - 3:967s    0:014 - 0:418s
    250 hz: 0:028 - 1:954s | 0:040 - 4:096s    0:016 - 0:816s
    
    This patch replaces the msleep() with usleep_range() calls in the
    i2c nuvoton driver with a consistent max range value.
    Signed-of-by: default avatarMimi Zohar <zohar@linux.vnet.ibm.com>
    Cc: stable@vger.kernel.org (linux-4.8)
    Signed-off-by: default avatarNayna Jain <nayna@linux.vnet.ibm.com>
    Reviewed-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
    Signed-off-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
    a233a028
tpm_i2c_nuvoton.c 18.9 KB