From: Wu Fengguang Introduce three guiding sizes for the initial readahead method. - ra_pages0: min readahead on start-of-file - ra_thrash_bytes: estimated thrashing threshold ra_thrash_bytes defaults to large value: - most systems don't have the danger of thrashing - it increases slowly and drops rapidly Signed-off-by: Wu Fengguang Signed-off-by: Andrew Morton --- block/ll_rw_blk.c | 4 +--- include/linux/backing-dev.h | 2 ++ mm/readahead.c | 5 +++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff -puN block/ll_rw_blk.c~readahead-initial-method-guiding-sizes block/ll_rw_blk.c --- a/block/ll_rw_blk.c~readahead-initial-method-guiding-sizes +++ a/block/ll_rw_blk.c @@ -210,9 +210,6 @@ void blk_queue_make_request(request_queu blk_queue_max_phys_segments(q, MAX_PHYS_SEGMENTS); blk_queue_max_hw_segments(q, MAX_HW_SEGMENTS); q->make_request_fn = mfn; - bdi->ra_pages = (VM_MAX_READAHEAD * 1024) / PAGE_CACHE_SIZE; - bdi->state = 0; - bdi->capabilities = BDI_CAP_MAP_COPY; atomic_long_set(&bdi->nr_dirty, 0); atomic_long_set(&bdi->nr_writeback, 0); blk_queue_max_sectors(q, SAFE_MAX_SECTORS); @@ -1756,6 +1753,7 @@ request_queue_t *blk_alloc_queue_node(gf snprintf(q->kobj.name, KOBJ_NAME_LEN, "%s", "queue"); q->kobj.ktype = &queue_ktype; kobject_init(&q->kobj); + q->backing_dev_info = default_backing_dev_info; mutex_init(&q->sysfs_lock); diff -puN include/linux/backing-dev.h~readahead-initial-method-guiding-sizes include/linux/backing-dev.h --- a/include/linux/backing-dev.h~readahead-initial-method-guiding-sizes +++ a/include/linux/backing-dev.h @@ -26,6 +26,8 @@ typedef int (congested_fn)(void *, int); struct backing_dev_info { unsigned long ra_pages; /* max readahead in PAGE_CACHE_SIZE units */ + unsigned long ra_pages0; /* min readahead on start of file */ + unsigned long ra_thrash_bytes; /* estimated thrashing threshold */ unsigned long state; /* Always use atomic bitops on this */ unsigned int capabilities; /* Device capabilities */ atomic_long_t nr_dirty; /* Pages dirty against this BDI */ diff -puN mm/readahead.c~readahead-initial-method-guiding-sizes mm/readahead.c --- a/mm/readahead.c~readahead-initial-method-guiding-sizes +++ a/mm/readahead.c @@ -32,6 +32,9 @@ * Adaptive read-ahead parameters. */ +/* Default initial read-ahead size. */ +#define INITIAL_RA_PAGES DIV_ROUND_UP(64*1024, PAGE_CACHE_SIZE) + /* In laptop mode, poll delayed look-ahead on every ## pages read. */ #define LAPTOP_POLL_INTERVAL 16 @@ -109,6 +112,8 @@ static void ra_account(struct file_ra_st struct backing_dev_info default_backing_dev_info = { .ra_pages = MAX_RA_PAGES, + .ra_pages0 = INITIAL_RA_PAGES, + .ra_thrash_bytes = MAX_RA_PAGES * PAGE_CACHE_SIZE, .state = 0, .capabilities = BDI_CAP_MAP_COPY, }; _