2007-01-27 08:25:00

by Wu Fengguang

[permalink] [raw]
Subject: [PATCH 6/8] readahead: thrashing recovery method fix

- keep lookahead_index if the current chunk is lost, so that when we
revisted this stream, the state based method see a consistent state.
- correct the thrashing-threshold computation
- discount read-ahead size more, to free more memory to the system on pressure
- disable look-ahead when thrashed, just to be safe

Signed-off-by: Fengguang Wu <[email protected]>
---
mm/readahead.c | 28 +++++++++++++---------------
1 file changed, 13 insertions(+), 15 deletions(-)

--- linux-2.6.20-rc4-mm1.orig/mm/readahead.c
+++ linux-2.6.20-rc4-mm1/mm/readahead.c
@@ -1524,28 +1524,26 @@ thrashing_recovery_readahead(struct addr
ra->readahead_index - offset);
#endif

- /*
- * Some thrashing occur in (ra_index, la_index], in which case the
- * old read-ahead chunk is lost soon after the new one is allocated.
- * Ensure that we recover all needed pages in the old chunk.
- */
- if (offset < ra->ra_index)
- ra_size = ra->ra_index - offset;
- else {
+ if (offset < ra->ra_index) {
+ /*
+ * Thrashed when we are in [la_index, ra_index), i.e.
+ * the old chunk is lost soon after the new one is allocated.
+ * Ensure that we recover all needed pages in the old chunk.
+ * And futher keep the lookahead_index untouched.
+ */
+ ra_size = ra->lookahead_index - offset;
+ } else {
/* After thrashing, we know the exact thrashing-threshold. */
- ra_size = offset - ra->ra_index;
+ ra_size = offset - ra->la_index;
update_ra_thrash_bytes(mapping->backing_dev_info, ra_size);

- /* And we'd better be a bit conservative. */
- ra_size = ra_size * 3 / 4;
+ /* And be cooperative: the system may be hunting for memory. */
+ ra_size = MIN_RA_PAGES + ra_size / 2;
}

- if (ra_size > ra_max)
- ra_size = ra_max;
-
ra_set_class(ra, RA_CLASS_THRASHING);
ra_set_index(ra, offset, offset);
- ra_set_size(ra, ra_size, ra_size / LOOKAHEAD_RATIO);
+ ra_set_size(ra, ra_size, 0);

return ra_submit(ra, mapping, filp);
}

--