From: Benjamin LaHaise <bcrl@kvack.org>
To: linux-aio@kvack.org, linux-fsdevel@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-api@vger.kernel.org,
linux-mm@kvack.org
Cc: Alexander Viro <viro@zeniv.linux.org.uk>,
Andrew Morton <akpm@linux-foundation.org>,
Linus Torvalds <torvalds@linux-foundation.org>
Subject: [PATCH 11/13] mm: enable __do_page_cache_readahead() to include present pages
Date: Mon, 11 Jan 2016 17:07:52 -0500 [thread overview]
Message-ID: <7b76f5442bab13114bbb75c3143e1ccc5f17de98.1452549431.git.bcrl@kvack.org> (raw)
In-Reply-To: <cover.1452549431.git.bcrl@kvack.org>
For the upcoming AIO readahead operation it is necessary to know that
all the pages in a readahead request have had reads issued for them or
that the read was satisfied from cache. Add a parameter to
__do_page_cache_readahead() to instruct it to count these pages in the
return value.
Signed-off-by: Benjamin LaHaise <ben.lahaise@solacesystems.com>
Signed-off-by: Benjamin LaHaise <bcrl@kvack.org>
---
mm/internal.h | 4 ++--
mm/readahead.c | 13 +++++++++----
2 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/mm/internal.h b/mm/internal.h
index 38e24b8..7599068 100644
--- a/mm/internal.h
+++ b/mm/internal.h
@@ -43,7 +43,7 @@ static inline void set_page_count(struct page *page, int v)
extern int __do_page_cache_readahead(struct address_space *mapping,
struct file *filp, pgoff_t offset, unsigned long nr_to_read,
- unsigned long lookahead_size);
+ unsigned long lookahead_size, int report_present);
/*
* Submit IO for the read-ahead request in file_ra_state.
@@ -52,7 +52,7 @@ static inline unsigned long ra_submit(struct file_ra_state *ra,
struct address_space *mapping, struct file *filp)
{
return __do_page_cache_readahead(mapping, filp,
- ra->start, ra->size, ra->async_size);
+ ra->start, ra->size, ra->async_size, 0);
}
/*
diff --git a/mm/readahead.c b/mm/readahead.c
index ba22d7f..afd3abe 100644
--- a/mm/readahead.c
+++ b/mm/readahead.c
@@ -151,12 +151,13 @@ out:
*/
int __do_page_cache_readahead(struct address_space *mapping, struct file *filp,
pgoff_t offset, unsigned long nr_to_read,
- unsigned long lookahead_size)
+ unsigned long lookahead_size, int report_present)
{
struct inode *inode = mapping->host;
struct page *page;
unsigned long end_index; /* The last page we want to read */
LIST_HEAD(page_pool);
+ int present = 0;
int page_idx;
int ret = 0;
loff_t isize = i_size_read(inode);
@@ -178,8 +179,10 @@ int __do_page_cache_readahead(struct address_space *mapping, struct file *filp,
rcu_read_lock();
page = radix_tree_lookup(&mapping->page_tree, page_offset);
rcu_read_unlock();
- if (page && !radix_tree_exceptional_entry(page))
+ if (page && !radix_tree_exceptional_entry(page)) {
+ present++;
continue;
+ }
page = page_cache_alloc_readahead(mapping);
if (!page)
@@ -199,6 +202,8 @@ int __do_page_cache_readahead(struct address_space *mapping, struct file *filp,
if (ret)
read_pages(mapping, filp, &page_pool, ret);
BUG_ON(!list_empty(&page_pool));
+ if (report_present)
+ ret += present;
out:
return ret;
}
@@ -222,7 +227,7 @@ int force_page_cache_readahead(struct address_space *mapping, struct file *filp,
if (this_chunk > nr_to_read)
this_chunk = nr_to_read;
err = __do_page_cache_readahead(mapping, filp,
- offset, this_chunk, 0);
+ offset, this_chunk, 0, 0);
if (err < 0)
return err;
@@ -441,7 +446,7 @@ ondemand_readahead(struct address_space *mapping,
* standalone, small random read
* Read as is, and do not pollute the readahead state.
*/
- return __do_page_cache_readahead(mapping, filp, offset, req_size, 0);
+ return __do_page_cache_readahead(mapping, filp, offset, req_size, 0, 0);
initial_readahead:
ra->start = offset;
--
2.5.0
--
"Thought is the essence of where you are now."
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2016-01-11 22:07 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-11 22:06 [PATCH 00/13] aio: thread (work queue) based aio and new aio functionality Benjamin LaHaise
2016-01-11 22:06 ` [PATCH 01/13] signals: distinguish signals sent due to i/o via io_send_sig() Benjamin LaHaise
2016-01-11 22:06 ` [PATCH 02/13] aio: add aio_get_mm() helper Benjamin LaHaise
2016-01-11 22:06 ` [PATCH 03/13] aio: for async operations, make the iter argument persistent Benjamin LaHaise
2016-01-11 22:07 ` [PATCH 04/13] signals: add and use aio_get_task() to direct signals sent via io_send_sig() Benjamin LaHaise
2016-01-11 22:07 ` [PATCH 05/13] fs: make do_loop_readv_writev() non-static Benjamin LaHaise
2016-01-11 22:07 ` [PATCH 06/13] aio: add queue_work() based threaded aio support Benjamin LaHaise
2016-01-11 22:07 ` [PATCH 07/13] aio: enabled thread based async fsync Benjamin LaHaise
2016-01-12 1:11 ` Dave Chinner
2016-01-12 1:20 ` Linus Torvalds
2016-01-12 2:25 ` Dave Chinner
2016-01-12 2:38 ` Linus Torvalds
2016-01-12 3:37 ` Dave Chinner
2016-01-12 4:03 ` Linus Torvalds
2016-01-12 4:48 ` Linus Torvalds
2016-01-12 22:50 ` Benjamin LaHaise
2016-01-15 20:21 ` Benjamin LaHaise
2016-01-20 3:59 ` Linus Torvalds
2016-01-20 5:02 ` Theodore Ts'o
2016-01-20 19:59 ` Dave Chinner
2016-01-20 20:29 ` Linus Torvalds
2016-01-20 20:44 ` Benjamin LaHaise
2016-01-20 21:45 ` Dave Chinner
2016-01-20 21:56 ` Benjamin LaHaise
2016-01-23 4:24 ` Dave Chinner
2016-01-23 4:50 ` Benjamin LaHaise
2016-01-23 22:22 ` Dave Chinner
2016-01-20 23:07 ` Linus Torvalds
2016-01-23 4:39 ` Dave Chinner
2016-03-14 17:17 ` aio openat " Benjamin LaHaise
2016-03-20 1:20 ` Linus Torvalds
2016-03-20 1:26 ` Al Viro
2016-03-20 1:45 ` Linus Torvalds
2016-03-20 1:55 ` Al Viro
2016-03-20 2:03 ` Linus Torvalds
2016-01-20 21:57 ` Dave Chinner
2016-01-22 15:41 ` Andres Freund
2016-01-12 22:59 ` Andy Lutomirski
2016-01-14 9:19 ` Paolo Bonzini
2016-01-12 1:30 ` Benjamin LaHaise
2016-01-22 15:31 ` Andres Freund
2016-01-11 22:07 ` [PATCH 08/13] aio: add support for aio poll via aio thread helper Benjamin LaHaise
2016-01-11 22:07 ` [PATCH 09/13] aio: add support for async openat() Benjamin LaHaise
2016-01-12 0:22 ` Linus Torvalds
2016-01-12 1:17 ` Benjamin LaHaise
2016-01-12 1:45 ` Chris Mason
2016-01-12 9:53 ` Ingo Molnar
2016-01-11 22:07 ` [PATCH 10/13] aio: add async unlinkat functionality Benjamin LaHaise
2016-01-11 22:07 ` Benjamin LaHaise [this message]
2016-01-11 22:07 ` [PATCH 12/13] aio: add support for aio readahead Benjamin LaHaise
2016-01-11 22:08 ` [PATCH 13/13] aio: add support for aio renameat operation Benjamin LaHaise
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7b76f5442bab13114bbb75c3143e1ccc5f17de98.1452549431.git.bcrl@kvack.org \
--to=bcrl@kvack.org \
--cc=akpm@linux-foundation.org \
--cc=linux-aio@kvack.org \
--cc=linux-api@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=torvalds@linux-foundation.org \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox