lkml.org 
[lkml]   [2006]   [May]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 19/32] readahead: initial method - expected read size
    backing_dev_info.ra_expect_bytes is dynamicly updated to be the expected
    read pages on start-of-file. It allows the initial readahead to be more
    aggressive and hence efficient.


    Signed-off-by: Wu Fengguang <wfg@mail.ustc.edu.cn>
    ---

    fs/file_table.c | 7 ++++++
    include/linux/mm.h | 1
    mm/readahead.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++
    3 files changed, 63 insertions(+)

    --- linux-2.6.17-rc4-mm3.orig/include/linux/mm.h
    +++ linux-2.6.17-rc4-mm3/include/linux/mm.h
    @@ -1032,6 +1032,7 @@ unsigned long page_cache_readahead(struc
    void handle_ra_miss(struct address_space *mapping,
    struct file_ra_state *ra, pgoff_t offset);
    unsigned long max_sane_readahead(unsigned long nr);
    +void fastcall readahead_close(struct file *file);

    #ifdef CONFIG_ADAPTIVE_READAHEAD
    extern int readahead_ratio;
    --- linux-2.6.17-rc4-mm3.orig/fs/file_table.c
    +++ linux-2.6.17-rc4-mm3/fs/file_table.c
    @@ -12,6 +12,7 @@
    #include <linux/init.h>
    #include <linux/module.h>
    #include <linux/smp_lock.h>
    +#include <linux/mm.h>
    #include <linux/fs.h>
    #include <linux/security.h>
    #include <linux/eventpoll.h>
    @@ -160,6 +161,12 @@ void fastcall __fput(struct file *file)
    might_sleep();

    fsnotify_close(file);
    +
    +#ifdef CONFIG_ADAPTIVE_READAHEAD
    + if (file->f_ra.flags & RA_FLAG_EOF)
    + readahead_close(file);
    +#endif
    +
    /*
    * The function eventpoll_release() should be the first called
    * in the file cleanup chain.
    --- linux-2.6.17-rc4-mm3.orig/mm/readahead.c
    +++ linux-2.6.17-rc4-mm3/mm/readahead.c
    @@ -1517,6 +1517,62 @@ static inline void get_readahead_bounds(
    (128*1024) / PAGE_CACHE_SIZE), *ra_max / 2);
    }

    +/*
    + * When closing a normal readonly file,
    + * - on cache hit: increase `backing_dev_info.ra_expect_bytes' slowly;
    + * - on cache miss: decrease it rapidly.
    + *
    + * The resulted `ra_expect_bytes' answers the question of:
    + * How many pages are expected to be read on start-of-file?
    + */
    +void fastcall readahead_close(struct file *file)
    +{
    + struct inode *inode = file->f_dentry->d_inode;
    + struct address_space *mapping = inode->i_mapping;
    + struct backing_dev_info *bdi = mapping->backing_dev_info;
    + unsigned long pos = file->f_pos; /* supposed to be small */
    + unsigned long pgrahit = file->f_ra.hit0;
    + unsigned long pgcached = mapping->nrpages;
    + unsigned long pgaccess;
    +
    + if (!pos) /* pread */
    + return;
    +
    + if (pgcached > bdi->ra_pages0) /* excessive reads */
    + return;
    +
    + pgaccess = max(pgrahit, 1 + pos / PAGE_CACHE_SIZE);
    + if (pgaccess >= pgcached) {
    + if (bdi->ra_expect_bytes < bdi->ra_pages0 * PAGE_CACHE_SIZE)
    + bdi->ra_expect_bytes += pgcached * PAGE_CACHE_SIZE / 8;
    +
    + debug_inc(initial_ra_hit);
    + dprintk("initial_ra_hit on file %s size %lluK "
    + "pos %lu by %s(%d)\n",
    + file->f_dentry->d_name.name,
    + i_size_read(inode) / 1024,
    + pos,
    + current->comm, current->pid);
    + } else {
    + unsigned long missed;
    +
    + missed = (pgcached - pgaccess) * PAGE_CACHE_SIZE;
    + if (bdi->ra_expect_bytes >= missed / 2)
    + bdi->ra_expect_bytes -= missed / 2;
    +
    + debug_inc(initial_ra_miss);
    + dprintk("initial_ra_miss on file %s "
    + "size %lluK cached %luK hit %luK "
    + "pos %lu by %s(%d)\n",
    + file->f_dentry->d_name.name,
    + i_size_read(inode) / 1024,
    + pgcached << (PAGE_CACHE_SHIFT - 10),
    + pgrahit << (PAGE_CACHE_SHIFT - 10),
    + pos,
    + current->comm, current->pid);
    + }
    +}
    +
    #endif /* CONFIG_ADAPTIVE_READAHEAD */

    /*
    --
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2006-05-27 18:04    [W:2.646 / U:0.152 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site