cfq-iosched: rework seeky detection
authorCorrado Zoccolo <czoccolo@gmail.com>
Sat, 27 Feb 2010 18:45:39 +0000 (19:45 +0100)
committerJens Axboe <jens.axboe@oracle.com>
Sun, 28 Feb 2010 18:41:25 +0000 (19:41 +0100)
commit3dde36ddea3e07dd025c4c1ba47edec91606fec0
tree0b8bbdb3fa9a08a3e4c6b0181a7b3325d578b111
parent6fc2de06ef1e691d032aa572478c905b7495a274
cfq-iosched: rework seeky detection

Current seeky detection is based on average seek lenght.
This is suboptimal, since the average will not distinguish between:
* a process doing medium sized seeks
* a process doing some sequential requests interleaved with larger seeks
and even a medium seek can take lot of time, if the requested sector
happens to be behind the disk head in the rotation (50% probability).

Therefore, we change the seeky queue detection to work as follows:
* each request can be classified as sequential if it is very close to
  the current head position, i.e. it is likely in the disk cache (disks
  usually read more data than requested, and put it in cache for
  subsequent reads). Otherwise, the request is classified as seeky.
* an history window of the last 32 requests is kept, storing the
  classification result.
* A queue is marked as seeky if more than 1/8 of the last 32 requests
  were seeky.

This patch fixes a regression reported by Yanmin, on mmap 64k random
reads.

Reported-by: Yanmin Zhang <yanmin_zhang@linux.intel.com>
Signed-off-by: Corrado Zoccolo <czoccolo@gmail.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
block/cfq-iosched.c