From: Gao Xiang <hsiangkao@linux.alibaba.com>
To: Hongzhen Luo <hongzhen@linux.alibaba.com>, linux-erofs@lists.ozlabs.org
Cc: linux-kernel@vger.kernel.org
Subject: Re: [RFC PATCH v5 3/4] erofs: apply the page cache share feature
Date: Mon, 6 Jan 2025 10:15:15 +0800 [thread overview]
Message-ID: <19cfa3ca-ee9e-4017-b34b-11073064dea5@linux.alibaba.com> (raw)
In-Reply-To: <20250105151208.3797385-4-hongzhen@linux.alibaba.com>
On 2025/1/5 23:12, Hongzhen Luo wrote:
...
>
> diff --git a/fs/erofs/data.c b/fs/erofs/data.c
> index 0cd6b5c4df98..fb08acbeaab6 100644
> --- a/fs/erofs/data.c
> +++ b/fs/erofs/data.c
> @@ -5,6 +5,7 @@
> * Copyright (C) 2021, Alibaba Cloud
> */
> #include "internal.h"
> +#include "pagecache_share.h"
> #include <linux/sched/mm.h>
> #include <trace/events/erofs.h>
>
> @@ -370,12 +371,21 @@ int erofs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
> */
> static int erofs_read_folio(struct file *file, struct folio *folio)
> {
> - return iomap_read_folio(folio, &erofs_iomap_ops);
> + int ret, pcshr;
> +
> + pcshr = erofs_pcshr_read_begin(file, folio);
> + ret = iomap_read_folio(folio, &erofs_iomap_ops);
> + erofs_pcshr_read_end(file, folio, pcshr);
> + return ret;
> }
>
> static void erofs_readahead(struct readahead_control *rac)
> {
> - return iomap_readahead(rac, &erofs_iomap_ops);
> + int pcshr;
> +
> + pcshr = erofs_pcshr_readahead_begin(rac);
> + iomap_readahead(rac, &erofs_iomap_ops);
> + erofs_pcshr_readahead_end(rac, pcshr);
> }
>
> static sector_t erofs_bmap(struct address_space *mapping, sector_t block)
> diff --git a/fs/erofs/inode.c b/fs/erofs/inode.c
> index d4b89407822a..0b070f4b46b8 100644
> --- a/fs/erofs/inode.c
> +++ b/fs/erofs/inode.c
> @@ -5,6 +5,7 @@
> * Copyright (C) 2021, Alibaba Cloud
> */
> #include "xattr.h"
> +#include "pagecache_share.h"
> #include <trace/events/erofs.h>
>
> static int erofs_fill_symlink(struct inode *inode, void *kaddr,
> @@ -212,7 +213,9 @@ static int erofs_fill_inode(struct inode *inode)
> switch (inode->i_mode & S_IFMT) {
> case S_IFREG:
> inode->i_op = &erofs_generic_iops;
> - if (erofs_inode_is_data_compressed(vi->datalayout))
> + if (erofs_pcshr_fill_inode(inode) == 0)
> + inode->i_fop = &erofs_pcshr_fops;
> + else if (erofs_inode_is_data_compressed(vi->datalayout))
> inode->i_fop = &generic_ro_fops;
> else
> inode->i_fop = &erofs_file_fops;
> diff --git a/fs/erofs/pagecache_share.c b/fs/erofs/pagecache_share.c
> index 703fd17c002c..22172b5e21c7 100644
> --- a/fs/erofs/pagecache_share.c
> +++ b/fs/erofs/pagecache_share.c
> @@ -22,6 +22,7 @@ struct erofs_pcshr_counter {
>
> struct erofs_pcshr_private {
> char fprt[PCSHR_FPRT_MAXLEN];
> + struct mutex mutex;
> };
>
> static struct erofs_pcshr_counter mnt_counter = {
> @@ -84,6 +85,7 @@ static int erofs_fprt_set(struct inode *inode, void *data)
> if (!ano_private)
> return -ENOMEM;
> memcpy(ano_private, data, sizeof(size_t) + *(size_t *)data);
> + mutex_init(&ano_private->mutex);
> inode->i_private = ano_private;
> return 0;
> }
> @@ -226,3 +228,64 @@ const struct file_operations erofs_pcshr_fops = {
> .get_unmapped_area = thp_get_unmapped_area,
> .splice_read = filemap_splice_read,
> };
> +
> +int erofs_pcshr_read_begin(struct file *file, struct folio *folio)
> +{
> + struct erofs_inode *vi;
> + struct erofs_pcshr_private *ano_private;
> +
> + if (!(file && file->private_data))
> + return 0;
> +
> + vi = file->private_data;
> + if (vi->ano_inode != file_inode(file))
> + return 0;
> +
> + ano_private = vi->ano_inode->i_private;
> + mutex_lock(&ano_private->mutex);
> + folio->mapping->host = &vi->vfs_inode;
you shouldn't change `folio->mapping->host` directly.
> + return 1;
> +}
> +
> +void erofs_pcshr_read_end(struct file *file, struct folio *folio, int pcshr)
> +{
> + struct erofs_pcshr_private *ano_private;
> +
> + if (pcshr == 0)
> + return;
> +
> + ano_private = file_inode(file)->i_private;
> + folio->mapping->host = file_inode(file);
you shouldn't change `folio->mapping->host` directly
and then switch back. It's too hacky.
> + mutex_unlock(&ano_private->mutex);
> +}
> +
> +int erofs_pcshr_readahead_begin(struct readahead_control *rac)
> +{
> + struct erofs_inode *vi;
> + struct file *file = rac->file;
> + struct erofs_pcshr_private *ano_private;
> +
> + if (!(file && file->private_data))
> + return 0;
> +
> + vi = file->private_data;
> + if (vi->ano_inode != file_inode(file))
> + return 0;
> +
> + ano_private = file_inode(file)->i_private;
> + mutex_lock(&ano_private->mutex);
> + rac->mapping->host = &vi->vfs_inode;
Same here.
Thanks,
Gao Xiang
next prev parent reply other threads:[~2025-01-06 2:15 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-05 15:12 [RFC PATCH v5 0/4] erofs: " Hongzhen Luo
2025-01-05 15:12 ` [RFC PATCH v5 1/4] erofs: move `struct erofs_anon_fs_type` to super.c Hongzhen Luo
2025-01-05 15:12 ` [RFC PATCH v5 2/4] erofs: introduce the page cache share feature Hongzhen Luo
2025-01-06 2:27 ` Gao Xiang
2025-01-06 3:03 ` Hongzhen Luo
2025-01-05 15:12 ` [RFC PATCH v5 3/4] erofs: apply " Hongzhen Luo
2025-01-06 2:15 ` Gao Xiang [this message]
2025-01-21 11:59 ` Hongbo Li
2025-01-21 12:16 ` Gao Xiang
2025-01-21 14:48 ` Hongzhen Luo
2025-01-05 15:12 ` [RFC PATCH v5 4/4] erofs: introduce .fadvise for page cache share Hongzhen Luo
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=19cfa3ca-ee9e-4017-b34b-11073064dea5@linux.alibaba.com \
--to=hsiangkao@linux.alibaba.com \
--cc=hongzhen@linux.alibaba.com \
--cc=linux-erofs@lists.ozlabs.org \
--cc=linux-kernel@vger.kernel.org \
/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
all inboxes | Powered by JetHome®