The patch titled readahead: laptop mode has been added to the -mm tree. Its filename is readahead-laptop-mode.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: readahead: laptop mode From: Wu Fengguang <wfg@xxxxxxxxxxxxxxxx> When the laptop drive is spinned down, defer look-ahead to spin up time. The implementation employs a poll based method, for performance is not a concern in this code path. The poll interval is 64KB, which should be small enough for movies/musics. The user space application is responsible for proper caching to hide the spin-up-and-read delay. ------------------------------------------------------------------------ For crazy laptop users who prefer aggressive read-ahead, here is the way: # echo 1000 > /proc/sys/vm/readahead_ratio # blockdev --setra 524280 /dev/hda # this is the max possible value Notes: - It is still an untested feature. - It is safer to use blockdev+fadvise to increase ra-max for a single file, which needs patching your movie player. - Be sure to restore them to sane values in normal operations! Signed-off-by: Wu Fengguang <wfg@xxxxxxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- include/linux/writeback.h | 6 ++++++ mm/page-writeback.c | 2 +- mm/readahead.c | 30 ++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff -puN include/linux/writeback.h~readahead-laptop-mode include/linux/writeback.h --- 25/include/linux/writeback.h~readahead-laptop-mode Wed May 24 16:50:39 2006 +++ 25-akpm/include/linux/writeback.h Wed May 24 16:50:39 2006 @@ -86,6 +86,12 @@ void laptop_io_completion(void); void laptop_sync_completion(void); void throttle_vm_writeout(void); +extern struct timer_list laptop_mode_wb_timer; +static inline int laptop_spinned_down(void) +{ + return !timer_pending(&laptop_mode_wb_timer); +} + /* These are exported to sysctl. */ extern int dirty_background_ratio; extern int vm_dirty_ratio; diff -puN mm/page-writeback.c~readahead-laptop-mode mm/page-writeback.c --- 25/mm/page-writeback.c~readahead-laptop-mode Wed May 24 16:50:39 2006 +++ 25-akpm/mm/page-writeback.c Wed May 24 16:50:39 2006 @@ -378,7 +378,7 @@ static void wb_timer_fn(unsigned long un static void laptop_timer_fn(unsigned long unused); static DEFINE_TIMER(wb_timer, wb_timer_fn, 0, 0); -static DEFINE_TIMER(laptop_mode_wb_timer, laptop_timer_fn, 0, 0); +DEFINE_TIMER(laptop_mode_wb_timer, laptop_timer_fn, 0, 0); /* * Periodic writeback of "old" data. diff -puN mm/readahead.c~readahead-laptop-mode mm/readahead.c --- 25/mm/readahead.c~readahead-laptop-mode Wed May 24 16:50:39 2006 +++ 25-akpm/mm/readahead.c Wed May 24 16:50:39 2006 @@ -816,6 +816,31 @@ out: } /* + * Set a new look-ahead mark at @new_index. + * Return 0 if the new mark is successfully set. + */ +static inline int renew_lookahead(struct address_space *mapping, + struct file_ra_state *ra, + pgoff_t index, pgoff_t new_index) +{ + struct page *page; + + if (index == ra->lookahead_index && + new_index >= ra->readahead_index) + return 1; + + page = find_page(mapping, new_index); + if (!page) + return 1; + + __SetPageReadahead(page); + if (ra->lookahead_index == index) + ra->lookahead_index = new_index; + + return 0; +} + +/* * Update `backing_dev_info.ra_thrash_bytes' to be a _biased_ average of * read-ahead sizes. Which makes it an a-bit-risky(*) estimation of the * _minimal_ read-ahead thrashing threshold on the device. @@ -1759,6 +1784,11 @@ page_cache_readahead_adaptive(struct add end_index - index); return 0; } + if (laptop_mode && laptop_spinned_down()) { + if (!renew_lookahead(mapping, ra, index, + index + LAPTOP_POLL_INTERVAL)) + return 0; + } } if (page) _ Patches currently in -mm which might be from wfg@xxxxxxxxxxxxxxxx are readahead-kconfig-options.patch radixtree-look-aside-cache.patch radixtree-hole-scanning-functions.patch readahead-page-flag-pg_readahead.patch readahead-refactor-do_generic_mapping_read.patch readahead-refactor-__do_page_cache_readahead.patch readahead-insert-cond_resched-calls.patch readahead-common-macros.patch readahead-events-accounting.patch readahead-support-functions.patch readahead-sysctl-parameters.patch readahead-min-max-sizes.patch readahead-state-based-method-aging-accounting.patch readahead-state-based-method-data-structure.patch readahead-state-based-method-routines.patch readahead-state-based-method.patch readahead-context-based-method.patch readahead-initial-method-guiding-sizes.patch readahead-initial-method-thrashing-guard-size.patch readahead-initial-method-expected-read-size.patch readahead-initial-method-user-recommended-size.patch readahead-initial-method.patch readahead-backward-prefetching-method.patch readahead-seeking-reads-method.patch readahead-thrashing-recovery-method.patch readahead-call-scheme.patch readahead-laptop-mode.patch readahead-loop-case.patch readahead-nfsd-case.patch readahead-turn-on-by-default.patch readahead-debug-radix-tree-new-functions.patch readahead-debug-traces-showing-accessed-file-names.patch readahead-debug-traces-showing-read-patterns.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html