Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 61568
b: refs/heads/master
c: 5ce1110
h: refs/heads/master
v: v3
  • Loading branch information
Fengguang Wu authored and Linus Torvalds committed Jul 19, 2007
1 parent 56fcb65 commit da7e83e
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f615bfca468c9b80ed2d09be5fdbaf470a32c045
refs/heads/master: 5ce1110b92b31d079aa443e967f43a2294e01194
64 changes: 64 additions & 0 deletions trunk/include/linux/fs.h
Original file line number Diff line number Diff line change
Expand Up @@ -695,6 +695,10 @@ struct fown_struct {

/*
* Track a single file's readahead state
*
* ================#============|==================#==================|
* ^ ^ ^ ^
* file_ra_state.la_index .ra_index .lookahead_index .readahead_index
*/
struct file_ra_state {
unsigned long start; /* Current window */
Expand All @@ -704,6 +708,12 @@ struct file_ra_state {
unsigned long prev_index; /* Cache last read() position */
unsigned long ahead_start; /* Ahead window */
unsigned long ahead_size;

pgoff_t la_index; /* enqueue time */
pgoff_t ra_index; /* begin offset */
pgoff_t lookahead_index; /* time to do next readahead */
pgoff_t readahead_index; /* end offset */

unsigned long ra_pages; /* Maximum readahead window */
unsigned long mmap_hit; /* Cache hit stat for mmap accesses */
unsigned long mmap_miss; /* Cache miss stat for mmap accesses */
Expand All @@ -712,6 +722,60 @@ struct file_ra_state {
#define RA_FLAG_MISS 0x01 /* a cache miss occured against this file */
#define RA_FLAG_INCACHE 0x02 /* file is already in cache */

/*
* Measuring read-ahead sizes.
*
* |----------- readahead size ------------>|
* ===#============|==================#=====================|
* |------- invoke interval ------>|-- lookahead size -->|
*/
static inline unsigned long ra_readahead_size(struct file_ra_state *ra)
{
return ra->readahead_index - ra->ra_index;
}

static inline unsigned long ra_lookahead_size(struct file_ra_state *ra)
{
return ra->readahead_index - ra->lookahead_index;
}

static inline unsigned long ra_invoke_interval(struct file_ra_state *ra)
{
return ra->lookahead_index - ra->la_index;
}

/*
* Check if @index falls in the readahead windows.
*/
static inline int ra_has_index(struct file_ra_state *ra, pgoff_t index)
{
return (index >= ra->la_index &&
index < ra->readahead_index);
}

/*
* Where is the old read-ahead and look-ahead?
*/
static inline void ra_set_index(struct file_ra_state *ra,
pgoff_t la_index, pgoff_t ra_index)
{
ra->la_index = la_index;
ra->ra_index = ra_index;
}

/*
* Where is the new read-ahead and look-ahead?
*/
static inline void ra_set_size(struct file_ra_state *ra,
unsigned long ra_size, unsigned long la_size)
{
ra->readahead_index = ra->ra_index + ra_size;
ra->lookahead_index = ra->ra_index + ra_size - la_size;
}

unsigned long ra_submit(struct file_ra_state *ra,
struct address_space *mapping, struct file *filp);

struct file {
/*
* fu_list becomes invalid after file_free is called and queued via
Expand Down
19 changes: 19 additions & 0 deletions trunk/mm/readahead.c
Original file line number Diff line number Diff line change
Expand Up @@ -592,3 +592,22 @@ unsigned long max_sane_readahead(unsigned long nr)
return min(nr, (node_page_state(numa_node_id(), NR_INACTIVE)
+ node_page_state(numa_node_id(), NR_FREE_PAGES)) / 2);
}

/*
* Submit IO for the read-ahead request in file_ra_state.
*/
unsigned long ra_submit(struct file_ra_state *ra,
struct address_space *mapping, struct file *filp)
{
unsigned long ra_size;
unsigned long la_size;
int actual;

ra_size = ra_readahead_size(ra);
la_size = ra_lookahead_size(ra);
actual = __do_page_cache_readahead(mapping, filp,
ra->ra_index, ra_size, la_size);

return actual;
}
EXPORT_SYMBOL_GPL(ra_submit);

0 comments on commit da7e83e

Please sign in to comment.