mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-22 06:32:08 +00:00
readahead: code cleanup
Rename file_ra_state.prev_page to prev_index and file_ra_state.offset to prev_offset. Also update of prev_index in do_generic_mapping_read() is now moved close to the update of prev_offset. [wfg@mail.ustc.edu.cn: fix it] Signed-off-by: Jan Kara <jack@suse.cz> Cc: Nick Piggin <nickpiggin@yahoo.com.au> Cc: WU Fengguang <wfg@mail.ustc.edu.cn> Signed-off-by: Fengguang Wu <wfg@mail.ustc.edu.cn> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
ec0f163722
commit
6ce745ed39
3 changed files with 21 additions and 20 deletions
|
@ -696,13 +696,13 @@ struct file_ra_state {
|
||||||
unsigned long size;
|
unsigned long size;
|
||||||
unsigned long flags; /* ra flags RA_FLAG_xxx*/
|
unsigned long flags; /* ra flags RA_FLAG_xxx*/
|
||||||
unsigned long cache_hit; /* cache hit count*/
|
unsigned long cache_hit; /* cache hit count*/
|
||||||
unsigned long prev_page; /* Cache last read() position */
|
unsigned long prev_index; /* Cache last read() position */
|
||||||
unsigned long ahead_start; /* Ahead window */
|
unsigned long ahead_start; /* Ahead window */
|
||||||
unsigned long ahead_size;
|
unsigned long ahead_size;
|
||||||
unsigned long ra_pages; /* Maximum readahead window */
|
unsigned long ra_pages; /* Maximum readahead window */
|
||||||
unsigned long mmap_hit; /* Cache hit stat for mmap accesses */
|
unsigned long mmap_hit; /* Cache hit stat for mmap accesses */
|
||||||
unsigned long mmap_miss; /* Cache miss stat for mmap accesses */
|
unsigned long mmap_miss; /* Cache miss stat for mmap accesses */
|
||||||
unsigned int offset; /* Offset where last read() ended in a page */
|
unsigned int prev_offset; /* Offset where last read() ended in a page */
|
||||||
};
|
};
|
||||||
#define RA_FLAG_MISS 0x01 /* a cache miss occured against this file */
|
#define RA_FLAG_MISS 0x01 /* a cache miss occured against this file */
|
||||||
#define RA_FLAG_INCACHE 0x02 /* file is already in cache */
|
#define RA_FLAG_INCACHE 0x02 /* file is already in cache */
|
||||||
|
|
|
@ -877,8 +877,8 @@ void do_generic_mapping_read(struct address_space *mapping,
|
||||||
cached_page = NULL;
|
cached_page = NULL;
|
||||||
index = *ppos >> PAGE_CACHE_SHIFT;
|
index = *ppos >> PAGE_CACHE_SHIFT;
|
||||||
next_index = index;
|
next_index = index;
|
||||||
prev_index = ra.prev_page;
|
prev_index = ra.prev_index;
|
||||||
prev_offset = ra.offset;
|
prev_offset = ra.prev_offset;
|
||||||
last_index = (*ppos + desc->count + PAGE_CACHE_SIZE-1) >> PAGE_CACHE_SHIFT;
|
last_index = (*ppos + desc->count + PAGE_CACHE_SIZE-1) >> PAGE_CACHE_SHIFT;
|
||||||
offset = *ppos & ~PAGE_CACHE_MASK;
|
offset = *ppos & ~PAGE_CACHE_MASK;
|
||||||
|
|
||||||
|
@ -947,7 +947,8 @@ page_ok:
|
||||||
offset += ret;
|
offset += ret;
|
||||||
index += offset >> PAGE_CACHE_SHIFT;
|
index += offset >> PAGE_CACHE_SHIFT;
|
||||||
offset &= ~PAGE_CACHE_MASK;
|
offset &= ~PAGE_CACHE_MASK;
|
||||||
prev_offset = ra.offset = offset;
|
prev_offset = offset;
|
||||||
|
ra.prev_offset = offset;
|
||||||
|
|
||||||
page_cache_release(page);
|
page_cache_release(page);
|
||||||
if (ret == nr && desc->count)
|
if (ret == nr && desc->count)
|
||||||
|
|
|
@ -37,7 +37,7 @@ void
|
||||||
file_ra_state_init(struct file_ra_state *ra, struct address_space *mapping)
|
file_ra_state_init(struct file_ra_state *ra, struct address_space *mapping)
|
||||||
{
|
{
|
||||||
ra->ra_pages = mapping->backing_dev_info->ra_pages;
|
ra->ra_pages = mapping->backing_dev_info->ra_pages;
|
||||||
ra->prev_page = -1;
|
ra->prev_index = -1;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(file_ra_state_init);
|
EXPORT_SYMBOL_GPL(file_ra_state_init);
|
||||||
|
|
||||||
|
@ -202,19 +202,19 @@ out:
|
||||||
* size: Number of pages in that read
|
* size: Number of pages in that read
|
||||||
* Together, these form the "current window".
|
* Together, these form the "current window".
|
||||||
* Together, start and size represent the `readahead window'.
|
* Together, start and size represent the `readahead window'.
|
||||||
* prev_page: The page which the readahead algorithm most-recently inspected.
|
* prev_index: The page which the readahead algorithm most-recently inspected.
|
||||||
* It is mainly used to detect sequential file reading.
|
* It is mainly used to detect sequential file reading.
|
||||||
* If page_cache_readahead sees that it is again being called for
|
* If page_cache_readahead sees that it is again being called for
|
||||||
* a page which it just looked at, it can return immediately without
|
* a page which it just looked at, it can return immediately without
|
||||||
* making any state changes.
|
* making any state changes.
|
||||||
* offset: Offset in the prev_page where the last read ended - used for
|
* offset: Offset in the prev_index where the last read ended - used for
|
||||||
* detection of sequential file reading.
|
* detection of sequential file reading.
|
||||||
* ahead_start,
|
* ahead_start,
|
||||||
* ahead_size: Together, these form the "ahead window".
|
* ahead_size: Together, these form the "ahead window".
|
||||||
* ra_pages: The externally controlled max readahead for this fd.
|
* ra_pages: The externally controlled max readahead for this fd.
|
||||||
*
|
*
|
||||||
* When readahead is in the off state (size == 0), readahead is disabled.
|
* When readahead is in the off state (size == 0), readahead is disabled.
|
||||||
* In this state, prev_page is used to detect the resumption of sequential I/O.
|
* In this state, prev_index is used to detect the resumption of sequential I/O.
|
||||||
*
|
*
|
||||||
* The readahead code manages two windows - the "current" and the "ahead"
|
* The readahead code manages two windows - the "current" and the "ahead"
|
||||||
* windows. The intent is that while the application is walking the pages
|
* windows. The intent is that while the application is walking the pages
|
||||||
|
@ -417,7 +417,7 @@ static int make_ahead_window(struct address_space *mapping, struct file *filp,
|
||||||
ra->ahead_size = get_next_ra_size(ra);
|
ra->ahead_size = get_next_ra_size(ra);
|
||||||
ra->ahead_start = ra->start + ra->size;
|
ra->ahead_start = ra->start + ra->size;
|
||||||
|
|
||||||
block = force || (ra->prev_page >= ra->ahead_start);
|
block = force || (ra->prev_index >= ra->ahead_start);
|
||||||
ret = blockable_page_cache_readahead(mapping, filp,
|
ret = blockable_page_cache_readahead(mapping, filp,
|
||||||
ra->ahead_start, ra->ahead_size, ra, block);
|
ra->ahead_start, ra->ahead_size, ra, block);
|
||||||
|
|
||||||
|
@ -469,13 +469,13 @@ page_cache_readahead(struct address_space *mapping, struct file_ra_state *ra,
|
||||||
* We avoid doing extra work and bogusly perturbing the readahead
|
* We avoid doing extra work and bogusly perturbing the readahead
|
||||||
* window expansion logic.
|
* window expansion logic.
|
||||||
*/
|
*/
|
||||||
if (offset == ra->prev_page && --req_size)
|
if (offset == ra->prev_index && --req_size)
|
||||||
++offset;
|
++offset;
|
||||||
|
|
||||||
/* Note that prev_page == -1 if it is a first read */
|
/* Note that prev_index == -1 if it is a first read */
|
||||||
sequential = (offset == ra->prev_page + 1);
|
sequential = (offset == ra->prev_index + 1);
|
||||||
ra->prev_page = offset;
|
ra->prev_index = offset;
|
||||||
ra->offset = 0;
|
ra->prev_offset = 0;
|
||||||
|
|
||||||
max = get_max_readahead(ra);
|
max = get_max_readahead(ra);
|
||||||
newsize = min(req_size, max);
|
newsize = min(req_size, max);
|
||||||
|
@ -484,7 +484,7 @@ page_cache_readahead(struct address_space *mapping, struct file_ra_state *ra,
|
||||||
if (newsize == 0 || (ra->flags & RA_FLAG_INCACHE))
|
if (newsize == 0 || (ra->flags & RA_FLAG_INCACHE))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
ra->prev_page += newsize - 1;
|
ra->prev_index += newsize - 1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Special case - first read at start of file. We'll assume it's
|
* Special case - first read at start of file. We'll assume it's
|
||||||
|
@ -540,18 +540,18 @@ page_cache_readahead(struct address_space *mapping, struct file_ra_state *ra,
|
||||||
* we get called back on the first page of the ahead window which
|
* we get called back on the first page of the ahead window which
|
||||||
* will allow us to submit more IO.
|
* will allow us to submit more IO.
|
||||||
*/
|
*/
|
||||||
if (ra->prev_page >= ra->ahead_start) {
|
if (ra->prev_index >= ra->ahead_start) {
|
||||||
ra->start = ra->ahead_start;
|
ra->start = ra->ahead_start;
|
||||||
ra->size = ra->ahead_size;
|
ra->size = ra->ahead_size;
|
||||||
make_ahead_window(mapping, filp, ra, 0);
|
make_ahead_window(mapping, filp, ra, 0);
|
||||||
recheck:
|
recheck:
|
||||||
/* prev_page shouldn't overrun the ahead window */
|
/* prev_index shouldn't overrun the ahead window */
|
||||||
ra->prev_page = min(ra->prev_page,
|
ra->prev_index = min(ra->prev_index,
|
||||||
ra->ahead_start + ra->ahead_size - 1);
|
ra->ahead_start + ra->ahead_size - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
return ra->prev_page + 1;
|
return ra->prev_index + 1;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(page_cache_readahead);
|
EXPORT_SYMBOL_GPL(page_cache_readahead);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue