• M
    timekeeping: optimized ktime_get[_ts] for GENERIC_TIME=y · 951ed4d3
    Martin Schwidefsky 提交于
    The generic ktime_get function defined in kernel/hrtimer.c is suboptimial
    for GENERIC_TIME=y:
    
     0)               |  ktime_get() {
     0)               |    ktime_get_ts() {
     0)               |      getnstimeofday() {
     0)               |        read_tod_clock() {
     0)   0.601 us    |        }
     0)   1.938 us    |      }
     0)               |      set_normalized_timespec() {
     0)   0.602 us    |      }
     0)   4.375 us    |    }
     0)   5.523 us    |  }
    
    Overall there are two read_seqbegin/read_seqretry loops and a lot of
    unnecessary struct timespec calculations. ktime_get returns a nano second
    value which is the sum of xtime, wall_to_monotonic and the nano second
    delta from the clock source.
    
    ktime_get can be optimized for GENERIC_TIME=y. The new version only calls
    clocksource_read:
    
     0)               |  ktime_get() {
     0)               |    read_tod_clock() {
     0)   0.610 us    |    }
     0)   1.977 us    |  }
    
    It uses a single read_seqbegin/readseqretry loop and just adds everthing
    to a nano second value.
    
    ktime_get_ts is optimized in a similar fashion.
    
    [ tglx: added WARN_ON(timekeeping_suspended) as in getnstimeofday() ]
    Signed-off-by: NMartin Schwidefsky <schwidefsky@de.ibm.com>
    Acked-by: Njohn stultz <johnstul@us.ibm.com>
    LKML-Reference: <20090707112728.3005244d@skybase>
    Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
    951ed4d3
timekeeping.c 17.2 KB