X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=mm%2Freadahead.c;h=8d6eeaaa6296f9fb2372cff059138cbdd4b89723;hb=cce03467f61534d8f68519495f26df0603ce678b;hp=0f142a40984b1674228e067f491159d42b13f32d;hpb=e6a27dba1cf83d871b2dfcd64f04f12a67e3f4d5;p=linux-2.6.git diff --git a/mm/readahead.c b/mm/readahead.c index 0f142a409..8d6eeaaa6 100644 --- a/mm/readahead.c +++ b/mm/readahead.c @@ -52,24 +52,13 @@ static inline unsigned long get_min_readahead(struct file_ra_state *ra) return (VM_MIN_READAHEAD * 1024) / PAGE_CACHE_SIZE; } -static inline void reset_ahead_window(struct file_ra_state *ra) -{ - /* - * ... but preserve ahead_start + ahead_size value, - * see 'recheck:' label in page_cache_readahead(). - * Note: We never use ->ahead_size as rvalue without - * checking ->ahead_start != 0 first. - */ - ra->ahead_size += ra->ahead_start; - ra->ahead_start = 0; -} - static inline void ra_off(struct file_ra_state *ra) { ra->start = 0; ra->flags = 0; ra->size = 0; - reset_ahead_window(ra); + ra->ahead_start = 0; + ra->ahead_size = 0; return; } @@ -83,10 +72,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 / 32) - newsize = newsize * 4; + if (newsize <= max / 64) + newsize = newsize * newsize; else if (newsize <= max / 4) - newsize = newsize * 2; + newsize = max / 4; else newsize = max; return newsize; @@ -437,7 +426,8 @@ static int make_ahead_window(struct address_space *mapping, struct file *filp, * congestion. The ahead window will any way be closed * in case we failed due to excessive page cache hits. */ - reset_ahead_window(ra); + ra->ahead_start = 0; + ra->ahead_size = 0; } return ret; @@ -530,11 +520,11 @@ page_cache_readahead(struct address_space *mapping, struct file_ra_state *ra, * If we get here we are doing sequential IO and this was not the first * occurence (ie we have an existing window) */ + if (ra->ahead_start == 0) { /* no ahead window yet */ if (!make_ahead_window(mapping, filp, ra, 0)) - goto recheck; + goto out; } - /* * Already have an ahead window, check if we crossed into it. * If so, shift windows and issue a new ahead window. @@ -546,16 +536,11 @@ page_cache_readahead(struct address_space *mapping, struct file_ra_state *ra, ra->start = ra->ahead_start; ra->size = ra->ahead_size; make_ahead_window(mapping, filp, ra, 0); -recheck: - /* prev_page shouldn't overrun the ahead window */ - ra->prev_page = min(ra->prev_page, - ra->ahead_start + ra->ahead_size - 1); } out: return ra->prev_page + 1; } -EXPORT_SYMBOL_GPL(page_cache_readahead); /* * handle_ra_miss() is called when it is known that a page which should have