[PATCH] readahead: fix initial window size calculation
authorSteven Pratt <slpratt@austin.ibm.com>
Wed, 22 Mar 2006 08:08:48 +0000 (00:08 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Wed, 22 Mar 2006 15:54:03 +0000 (07:54 -0800)
The current current get_init_ra_size is not optimal across different IO
sizes and max_readahead values.  Here is a quick summary of sizes computed
under current design and under the attached patch.  All of these assume 1st
IO at offset 0, or 1st detected sequential IO.

32k max, 4k request

old         new
-----------------
 8k        8k
16k       16k
32k       32k

128k max, 4k request
old         new
-----------------
32k         16k
64k         32k
128k        64k
128k       128k

128k max, 32k request
old         new
-----------------
32k         64k    <-----
64k        128k
128k       128k

512k max, 4k request
old         new
-----------------
4k         32k     <----
16k        64k
64k       128k
128k      256k
512k      512k

Cc: Oleg Nesterov <oleg@tv-sign.ru>
Cc: Steven Pratt <slpratt@austin.ibm.com>
Cc: Ram Pai <linuxram@us.ibm.com>
Cc: Trond Myklebust <trond.myklebust@fys.uio.no>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
mm/readahead.c

index 57557e2949870c8f4ff56c9347c4c17f7c624586..301b36c4a0ce10a006c651637cb2597040ec1413 100644 (file)
@@ -83,10 +83,10 @@ static unsigned long get_init_ra_size(unsigned long size, unsigned long max)
 {
        unsigned long newsize = roundup_pow_of_two(size);
 
-       if (newsize <= max / 64)
-               newsize = newsize * newsize;
+       if (newsize <= max / 32)
+               newsize = newsize * 4;
        else if (newsize <= max / 4)
-               newsize = max / 4;
+               newsize = newsize * 2;
        else
                newsize = max;
        return newsize;