From: Hsin-Yi Wang <hsinyi@chromium.org> To: Phillip Lougher <phillip@squashfs.org.uk>, Matthew Wilcox <willy@infradead.org>, Xiongwei Song <Xiongwei.Song@windriver.com> Cc: Zheng Liang <zhengliang6@huawei.com>, Zhang Yi <yi.zhang@huawei.com>, Hou Tao <houtao1@huawei.com>, Miao Xie <miaoxie@huawei.com>, Andrew Morton <akpm@linux-foundation.org>, "linux-mm @ kvack . org" <linux-mm@kvack.org>, "squashfs-devel @ lists . sourceforge . net" <squashfs-devel@lists.sourceforge.net>, linux-kernel@vger.kernel.org Subject: [PATCH v2 3/3] squashfs: implement readahead Date: Tue, 17 May 2022 16:26:54 +0800 [thread overview] Message-ID: <20220517082650.2005840-4-hsinyi@chromium.org> (raw) In-Reply-To: <20220517082650.2005840-1-hsinyi@chromium.org> Implement readahead callback for squashfs. It will read datablocks which cover pages in readahead request. For a few cases it will not mark page as uptodate, including: - file end is 0. - zero filled blocks. - current batch of pages isn't in the same datablock or not enough in a datablock. Otherwise pages will be marked as uptodate. The unhandled pages will be updated by readpage later. Suggested-by: Matthew Wilcox <willy@infradead.org> Signed-off-by: Hsin-Yi Wang <hsinyi@chromium.org> Reported-by: Matthew Wilcox <willy@infradead.org> Reported-by: Phillip Lougher <phillip@squashfs.org.uk> Reported-by: Xiongwei Song <sxwjean@gmail.com> --- v1->v2: remove unused check on readahead_expand(). v1: https://lore.kernel.org/lkml/20220516105100.1412740-3-hsinyi@chromium.org/ --- fs/squashfs/file.c | 77 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) diff --git a/fs/squashfs/file.c b/fs/squashfs/file.c index a8e495d8eb86..e10a55c5b1eb 100644 --- a/fs/squashfs/file.c +++ b/fs/squashfs/file.c @@ -39,6 +39,7 @@ #include "squashfs_fs_sb.h" #include "squashfs_fs_i.h" #include "squashfs.h" +#include "page_actor.h" /* * Locate cache slot in range [offset, index] for specified inode. If @@ -495,7 +496,81 @@ static int squashfs_read_folio(struct file *file, struct folio *folio) return 0; } +static void squashfs_readahead(struct readahead_control *ractl) +{ + struct inode *inode = ractl->mapping->host; + struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info; + size_t mask = (1UL << msblk->block_log) - 1; + size_t shift = msblk->block_log - PAGE_SHIFT; + loff_t start = readahead_pos(ractl) &~ mask; + size_t len = readahead_length(ractl) + readahead_pos(ractl) - start; + struct squashfs_page_actor *actor; + unsigned int nr_pages = 0; + struct page **pages; + u64 block = 0; + int bsize, res, i, index; + int file_end = i_size_read(inode) >> msblk->block_log; + unsigned int max_pages = 1UL << shift; + + readahead_expand(ractl, start, (len | mask) + 1); + + if (file_end == 0) + return; + + pages = kmalloc_array(max_pages, sizeof(void *), GFP_KERNEL); + if (!pages) + return; + + actor = squashfs_page_actor_init_special(pages, max_pages, 0); + if (!actor) + goto out; + + for (;;) { + nr_pages = __readahead_batch(ractl, pages, max_pages); + if (!nr_pages) + break; + + if (readahead_pos(ractl) >= i_size_read(inode) || + nr_pages < max_pages) + goto skip_pages; + + index = pages[0]->index >> shift; + if ((pages[nr_pages - 1]->index >> shift) != index) + goto skip_pages; + + bsize = read_blocklist(inode, index, &block); + if (bsize == 0) + goto skip_pages; + + res = squashfs_read_data(inode->i_sb, block, bsize, NULL, + actor); + + if (res >= 0) + for (i = 0; i < nr_pages; i++) + SetPageUptodate(pages[i]); + + for (i = 0; i < nr_pages; i++) { + unlock_page(pages[i]); + put_page(pages[i]); + } + } + + kfree(actor); + kfree(pages); + return; + +skip_pages: + for (i = 0; i < nr_pages; i++) { + unlock_page(pages[i]); + put_page(pages[i]); + } + + kfree(actor); +out: + kfree(pages); +} const struct address_space_operations squashfs_aops = { - .read_folio = squashfs_read_folio + .read_folio = squashfs_read_folio, + .readahead = squashfs_readahead }; -- 2.36.0.550.gb090851708-goog
next prev parent reply other threads:[~2022-05-17 8:29 UTC|newest] Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-05-17 8:26 [PATCH v2 0/3] Implement readahead for squashfs Hsin-Yi Wang 2022-05-17 8:26 ` [PATCH v2 1/3] Revert "squashfs: provide backing_dev_info in order to disable read-ahead" Hsin-Yi Wang 2022-05-17 9:15 ` Xiongwei Song 2022-05-17 8:26 ` [PATCH v2 2/3] squashfs: always build "file direct" version of page actor Hsin-Yi Wang 2022-05-17 8:26 ` Hsin-Yi Wang [this message] 2022-05-17 9:16 ` [PATCH v2 3/3] squashfs: implement readahead Xiongwei Song 2022-05-19 7:56 ` Hsin-Yi Wang 2022-05-19 8:09 ` Hsin-Yi Wang 2022-05-20 3:02 ` Phillip Lougher 2022-05-20 7:38 ` Hsin-Yi Wang 2022-05-20 20:21 ` Phillip Lougher 2022-05-23 7:00 ` Hsin-Yi Wang
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=20220517082650.2005840-4-hsinyi@chromium.org \ --to=hsinyi@chromium.org \ --cc=Xiongwei.Song@windriver.com \ --cc=akpm@linux-foundation.org \ --cc=houtao1@huawei.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --cc=miaoxie@huawei.com \ --cc=phillip@squashfs.org.uk \ --cc=squashfs-devel@lists.sourceforge.net \ --cc=willy@infradead.org \ --cc=yi.zhang@huawei.com \ --cc=zhengliang6@huawei.com \ --subject='Re: [PATCH v2 3/3] squashfs: implement readahead' \ /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
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.