From 72dfe63dd44979d182be741d2446d364546c5df5 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Sun, 31 May 2020 20:25:04 -0600 Subject: [PATCH 2/6] mm: provide read-ahead helpers that take a struct kiocb Signed-off-by: Jens Axboe --- mm/internal.h | 10 +++++++ mm/readahead.c | 79 +++++++++++++++++++++++++++++++------------------- 2 files changed, 59 insertions(+), 30 deletions(-) diff --git a/mm/internal.h b/mm/internal.h index 1d051cbadf1a..c486d675af41 100644 --- a/mm/internal.h +++ b/mm/internal.h @@ -63,6 +63,16 @@ static inline unsigned long ra_submit(struct file_ra_state *ra, ra->start, ra->size, ra->async_size); } +void __page_cache_sync_readahead(struct address_space *mapping, + struct file_ra_state *ra, + struct kiocb *kiocb, pgoff_t offset, + unsigned long req_size); + +void __page_cache_async_readahead(struct address_space *mapping, + struct file_ra_state *ra, struct kiocb *kiocb, + struct page *page, pgoff_t offset, + unsigned long req_size); + /** * page_evictable - test whether a page is evictable * @page: the page to test diff --git a/mm/readahead.c b/mm/readahead.c index 657206f6318d..54a41dae4fea 100644 --- a/mm/readahead.c +++ b/mm/readahead.c @@ -493,6 +493,29 @@ ondemand_readahead(struct address_space *mapping, return ra_submit(ra, mapping, kiocb); } +void __page_cache_sync_readahead(struct address_space *mapping, + struct file_ra_state *ra, struct kiocb *kiocb, + pgoff_t offset, unsigned long req_size) +{ + struct file *filp = kiocb->ki_filp; + + /* no read-ahead */ + if (!ra->ra_pages) + return; + + if (blk_cgroup_congested()) + return; + + /* be dumb */ + if (filp && (filp->f_mode & FMODE_RANDOM)) { + force_page_cache_readahead(mapping, kiocb, offset, req_size); + return; + } + + /* do read-ahead */ + ondemand_readahead(mapping, ra, kiocb, false, offset, req_size); +} + /** * page_cache_sync_readahead - generic file readahead * @mapping: address_space which holds the pagecache and I/O vectors @@ -513,23 +536,40 @@ void page_cache_sync_readahead(struct address_space *mapping, { struct kiocb kiocb = { .ki_filp = filp, }; + __page_cache_sync_readahead(mapping, ra, &kiocb, offset, req_size); +} +EXPORT_SYMBOL_GPL(page_cache_sync_readahead); + +void +__page_cache_async_readahead(struct address_space *mapping, + struct file_ra_state *ra, struct kiocb *kiocb, + struct page *page, pgoff_t offset, + unsigned long req_size) +{ /* no read-ahead */ if (!ra->ra_pages) return; - if (blk_cgroup_congested()) + /* + * Same bit is used for PG_readahead and PG_reclaim. + */ + if (PageWriteback(page)) return; - /* be dumb */ - if (filp && (filp->f_mode & FMODE_RANDOM)) { - force_page_cache_readahead(mapping, &kiocb, offset, req_size); + ClearPageReadahead(page); + + /* + * Defer asynchronous read-ahead on IO congestion. + */ + if (inode_read_congested(mapping->host)) + return; + + if (blk_cgroup_congested()) return; - } /* do read-ahead */ - ondemand_readahead(mapping, ra, &kiocb, false, offset, req_size); + ondemand_readahead(mapping, ra, kiocb, true, offset, req_size); } -EXPORT_SYMBOL_GPL(page_cache_sync_readahead); /** * page_cache_async_readahead - file readahead for marked pages @@ -554,29 +594,8 @@ page_cache_async_readahead(struct address_space *mapping, { struct kiocb kiocb = { .ki_filp = filp, }; - /* no read-ahead */ - if (!ra->ra_pages) - return; - - /* - * Same bit is used for PG_readahead and PG_reclaim. - */ - if (PageWriteback(page)) - return; - - ClearPageReadahead(page); - - /* - * Defer asynchronous read-ahead on IO congestion. - */ - if (inode_read_congested(mapping->host)) - return; - - if (blk_cgroup_congested()) - return; - - /* do read-ahead */ - ondemand_readahead(mapping, ra, &kiocb, true, offset, req_size); + __page_cache_async_readahead(mapping, ra, &kiocb, page, offset, + req_size); } EXPORT_SYMBOL_GPL(page_cache_async_readahead); -- 2.26.2