On Thu, 17 Oct 2013 20:09:12 +0200 Damien Ramonda <damien.ramonda@xxxxxxxxx> wrote: > 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. Do you have any performance testing results which would permit people to understand the significance of this change? Thanks. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>