Skip to content
  • Damien Ramonda's avatar
    readahead: fix sequential read cache miss detection · af248a0c
    Damien Ramonda authored
    
    
    The kernel's readahead algorithm sometimes interprets random read
    accesses as sequential and triggers unnecessary data prefecthing from
    storage device (impacting random read average latency).
    
    In order to identify sequential cache read misses, the readahead
    algorithm intends to check whether offset - previous offset == 1
    (trivial sequential reads) or offset - previous offset == 0 (sequential
    reads not aligned on page boundary):
    
      if (offset - (ra->prev_pos >> PAGE_CACHE_SHIFT) <= 1UL)
    
    The current offset is stored in the "offset" variable of type "pgoff_t"
    (unsigned long), while previous offset is stored in "ra->prev_pos" of
    type "loff_t" (long long).  Therefore, operands of the if statement are
    implicitly converted to type long long.  Consequently, when previous
    offset > current offset (which happens on random pattern), the if
    condition is true and access is wrongly interpeted as sequential.  An
    unnecessary data prefetching is triggered, impacting the average random
    read latency.
    
    Storing the previous offset value in a "pgoff_t" variable (unsigned
    long) fixes the sequential read detection logic.
    
    Signed-off-by: default avatarDamien Ramonda <damien.ramonda@intel.com>
    Reviewed-by: default avatarFengguang Wu <fengguang.wu@intel.com>
    Acked-by: default avatarPierre Tardy <pierre.tardy@intel.com>
    Acked-by: default avatarDavid Cohen <david.a.cohen@linux.intel.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    af248a0c