From: "Fabio M. De Francesco" <fmdefrancesco@gmail.com>
To: Phillip Lougher <phillip@squashfs.org.uk>,
Matthew Wilcox <willy@infradead.org>,
Xiongwei Song <Xiongwei.Song@windriver.com>,
Marek Szyprowski <m.szyprowski@samsung.com>,
Andrew Morton <akpm@linux-foundation.org>,
Hsin-Yi Wang <hsinyi@chromium.org>
Cc: Zheng Liang <zhengliang6@huawei.com>,
Zhang Yi <yi.zhang@huawei.com>, Hou Tao <houtao1@huawei.com>,
Miao Xie <miaoxie@huawei.com>,
"linux-mm @ kvack . org" <linux-mm@kvack.org>,
"squashfs-devel @ lists . sourceforge . net"
<squashfs-devel@lists.sourceforge.net>,
linux-kernel@vger.kernel.org, ira.weiny@intel.com
Subject: Re: [PATCH v5 3/3] squashfs: implement readahead
Date: Tue, 07 Jun 2022 21:29:42 +0200 [thread overview]
Message-ID: <1794711.atdPhlSkOF@opensuse> (raw)
In-Reply-To: <20220606150305.1883410-4-hsinyi@chromium.org>
On lunedì 6 giugno 2022 17:03:05 CEST Hsin-Yi Wang wrote:
> 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.
> - decompressor error.
> 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 <Xiongwei.Song@windriver.com>
> Reported-by: Marek Szyprowski <m.szyprowski@samsung.com>
> Reported-by: Andrew Morton <akpm@linux-foundation.org>
> ---
> v4->v5:
> - Handle short file cases reported by Marek and Matthew.
> - Fix checkpatch error reported by Andrew.
>
> v4: https://lore.kernel.org/lkml/20220601103922.1338320-4-hsinyi@chromium.org/
> v3: https://lore.kernel.org/lkml/20220523065909.883444-4-hsinyi@chromium.org/
> v2: https://lore.kernel.org/lkml/20220517082650.2005840-4-hsinyi@chromium.org/
> v1: https://lore.kernel.org/lkml/20220516105100.1412740-3-hsinyi@chromium.org/
> ---
> fs/squashfs/file.c | 124 ++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 123 insertions(+), 1 deletion(-)
>
> diff --git a/fs/squashfs/file.c b/fs/squashfs/file.c
> index a8e495d8eb86..fbd096cd15f4 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,128 @@ 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;
> + unsigned short 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;
> + int i, 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 (;;) {
> + pgoff_t index;
> + int res, bsize;
> + u64 block = 0;
> + unsigned int expected;
> +
> + nr_pages = __readahead_batch(ractl, pages, max_pages);
> + if (!nr_pages)
> + break;
> +
> + if (readahead_pos(ractl) >= i_size_read(inode))
> + goto skip_pages;
> +
> + index = pages[0]->index >> shift;
> + if ((pages[nr_pages - 1]->index >> shift) != index)
> + goto skip_pages;
> +
> + expected = index == file_end ?
> + (i_size_read(inode) & (msblk->block_size -
1)) :
> + msblk->block_size;
> +
> + bsize = read_blocklist(inode, index, &block);
> + if (bsize == 0)
> + goto skip_pages;
> +
> + if (nr_pages < max_pages) {
> + struct squashfs_cache_entry *buffer;
> + unsigned int block_mask = max_pages - 1;
> + int offset = pages[0]->index - (pages[0]-
>index & ~block_mask);
> +
> + buffer = squashfs_get_datablock(inode->i_sb,
block,
> +
bsize);
> + if (buffer->error) {
> + squashfs_cache_put(buffer);
> + goto skip_pages;
> + }
> +
> + expected -= offset * PAGE_SIZE;
> + for (i = 0; i < nr_pages && expected > 0; i+
+,
> + expected -=
PAGE_SIZE, offset++) {
> + int avail = min_t(int, expected,
PAGE_SIZE);
> +
> + squashfs_fill_page(pages[i],
buffer,
> + offset *
PAGE_SIZE, avail);
> + unlock_page(pages[i]);
> + }
> +
> + squashfs_cache_put(buffer);
> + continue;
> + }
> +
> + res = squashfs_read_data(inode->i_sb, block, bsize,
NULL,
> + actor);
> +
> + if (res == expected) {
> + int bytes;
> +
> + /* Last page may have trailing bytes not
filled */
> + bytes = res % PAGE_SIZE;
> + if (bytes) {
> + void *pageaddr;
> +
> + pageaddr =
kmap_atomic(pages[nr_pages - 1]);
> + memset(pageaddr + bytes, 0,
PAGE_SIZE - bytes);
> + kunmap_atomic(pageaddr);
> + }
Hi Hsin-Yi,
kmap_atomic() shouldn't be used in new code, unless there are special
reasons that I am not able to spot here.
Why not use kmap_local_page(), preferably via memzero_page?
Thanks,
Fabio
> +
> + for (i = 0; i < nr_pages; i++) {
> + flush_dcache_page(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.1.255.ge46751e96f-goog
>
>
>
next prev parent reply other threads:[~2022-06-07 19:29 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-06 15:03 [PATCH v5 0/3] Implement readahead for squashfs Hsin-Yi Wang
2022-06-06 15:03 ` [PATCH v5 1/3] Revert "squashfs: provide backing_dev_info in order to disable read-ahead" Hsin-Yi Wang
2022-06-06 15:03 ` [PATCH v5 2/3] squashfs: always build "file direct" version of page actor Hsin-Yi Wang
2022-06-06 15:03 ` [PATCH v5 3/3] squashfs: implement readahead Hsin-Yi Wang
2022-06-07 3:59 ` Phillip Lougher
2022-06-07 19:29 ` Fabio M. De Francesco [this message]
2022-06-08 10:20 ` Hsin-Yi Wang
2022-06-09 14:46 ` Xiongwei Song
2022-06-10 1:32 ` Xiongwei Song
2022-06-10 7:42 ` Phillip Lougher
2022-06-13 1:36 ` Xiongwei Song
2022-06-13 8:35 ` Hsin-Yi Wang
2022-07-15 1:45 ` Xiongwei Song
2022-07-29 5:22 ` Xiongwei Song
2022-08-01 4:53 ` Phillip Lougher
2022-06-11 5:23 ` Phillip Lougher
2022-06-12 11:51 ` 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=1794711.atdPhlSkOF@opensuse \
--to=fmdefrancesco@gmail.com \
--cc=Xiongwei.Song@windriver.com \
--cc=akpm@linux-foundation.org \
--cc=houtao1@huawei.com \
--cc=hsinyi@chromium.org \
--cc=ira.weiny@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=m.szyprowski@samsung.com \
--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 \
/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 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.