From: Yue Hu <zbestahu@gmail.com>
To: Gao Xiang <hsiangkao@linux.alibaba.com>
Cc: geshifei@coolpad.com, LKML <linux-kernel@vger.kernel.org>,
huyue@coolpad.com, zhangwen@coolpad.com,
Liu Bo <bo.liu@linux.alibaba.com>,
linux-erofs@lists.ozlabs.org, shaojunjun@coolpad.com
Subject: Re: [PATCH 3/5] erofs: use meta buffers for super operations
Date: Thu, 30 Dec 2021 12:11:09 +0800 [thread overview]
Message-ID: <20211230121109.00000328.zbestahu@gmail.com> (raw)
In-Reply-To: <20211229041405.45921-4-hsiangkao@linux.alibaba.com>
On Wed, 29 Dec 2021 12:14:03 +0800
Gao Xiang <hsiangkao@linux.alibaba.com> wrote:
> Get rid of old erofs_get_meta_page() within super operations by
> using on-stack meta buffers in order to prepare subpage and folio
> features.
>
> Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
> ---
> fs/erofs/super.c | 105 ++++++++++++-----------------------------------
> 1 file changed, 26 insertions(+), 79 deletions(-)
>
> diff --git a/fs/erofs/super.c b/fs/erofs/super.c
> index 0724ad5fd6cf..38305fa2969b 100644
> --- a/fs/erofs/super.c
> +++ b/fs/erofs/super.c
> @@ -2,6 +2,7 @@
> /*
> * Copyright (C) 2017-2018 HUAWEI, Inc.
> * https://www.huawei.com/
> + * Copyright (C) 2021, Alibaba Cloud
> */
> #include <linux/module.h>
> #include <linux/buffer_head.h>
> @@ -124,80 +125,48 @@ static bool check_layout_compatibility(struct super_block *sb,
>
> #ifdef CONFIG_EROFS_FS_ZIP
> /* read variable-sized metadata, offset will be aligned by 4-byte */
> -static void *erofs_read_metadata(struct super_block *sb, struct page **pagep,
> +static void *erofs_read_metadata(struct super_block *sb, struct erofs_buf *buf,
> erofs_off_t *offset, int *lengthp)
> {
> - struct page *page = *pagep;
> u8 *buffer, *ptr;
> int len, i, cnt;
> - erofs_blk_t blk;
>
> *offset = round_up(*offset, 4);
> - blk = erofs_blknr(*offset);
> + ptr = erofs_read_metabuf(buf, sb, erofs_blknr(*offset), EROFS_KMAP);
> + if (IS_ERR(ptr))
> + return ptr;
>
> - if (!page || page->index != blk) {
> - if (page) {
> - unlock_page(page);
> - put_page(page);
> - }
> - page = erofs_get_meta_page(sb, blk);
> - if (IS_ERR(page))
> - goto err_nullpage;
> - }
> -
> - ptr = kmap(page);
> len = le16_to_cpu(*(__le16 *)&ptr[erofs_blkoff(*offset)]);
> if (!len)
> len = U16_MAX + 1;
> buffer = kmalloc(len, GFP_KERNEL);
> - if (!buffer) {
> - buffer = ERR_PTR(-ENOMEM);
> - goto out;
> - }
> + if (!buffer)
> + return ERR_PTR(-ENOMEM);
> *offset += sizeof(__le16);
> *lengthp = len;
>
> for (i = 0; i < len; i += cnt) {
> cnt = min(EROFS_BLKSIZ - (int)erofs_blkoff(*offset), len - i);
> - blk = erofs_blknr(*offset);
> -
> - if (!page || page->index != blk) {
> - if (page) {
> - kunmap(page);
> - unlock_page(page);
> - put_page(page);
> - }
> - page = erofs_get_meta_page(sb, blk);
> - if (IS_ERR(page)) {
> - kfree(buffer);
> - goto err_nullpage;
> - }
> - ptr = kmap(page);
> - }
> + ptr = erofs_read_metabuf(buf, sb, erofs_blknr(*offset),
> + EROFS_KMAP);
> + if (IS_ERR(ptr))
> + return ptr;
> memcpy(buffer + i, ptr + erofs_blkoff(*offset), cnt);
> *offset += cnt;
> }
> -out:
> - kunmap(page);
> - *pagep = page;
> return buffer;
> -err_nullpage:
> - *pagep = NULL;
> - return page;
> }
>
> static int erofs_load_compr_cfgs(struct super_block *sb,
> struct erofs_super_block *dsb)
> {
> - struct erofs_sb_info *sbi;
> - struct page *page;
> + struct erofs_sb_info *sbi = EROFS_SB(sb);
> + struct erofs_buf buf = __EROFS_BUF_INITIALIZER;
> unsigned int algs, alg;
> erofs_off_t offset;
> - int size, ret;
> + int size, ret = 0;
>
> - sbi = EROFS_SB(sb);
> sbi->available_compr_algs = le16_to_cpu(dsb->u1.available_compr_algs);
> -
> if (sbi->available_compr_algs & ~Z_EROFS_ALL_COMPR_ALGS) {
> erofs_err(sb, "try to load compressed fs with unsupported algorithms %x",
> sbi->available_compr_algs & ~Z_EROFS_ALL_COMPR_ALGS);
> @@ -205,21 +174,16 @@ static int erofs_load_compr_cfgs(struct super_block *sb,
> }
>
> offset = EROFS_SUPER_OFFSET + sbi->sb_size;
> - page = NULL;
> alg = 0;
> - ret = 0;
> -
> for (algs = sbi->available_compr_algs; algs; algs >>= 1, ++alg) {
> void *data;
>
> if (!(algs & 1))
> continue;
>
> - data = erofs_read_metadata(sb, &page, &offset, &size);
> - if (IS_ERR(data)) {
> - ret = PTR_ERR(data);
> - goto err;
> - }
> + data = erofs_read_metadata(sb, &buf, &offset, &size);
> + if (IS_ERR(data))
> + return PTR_ERR(data);
>
> switch (alg) {
> case Z_EROFS_COMPRESSION_LZ4:
> @@ -234,13 +198,9 @@ static int erofs_load_compr_cfgs(struct super_block *sb,
> }
> kfree(data);
> if (ret)
> - goto err;
> - }
> -err:
> - if (page) {
> - unlock_page(page);
> - put_page(page);
> + break;
> }
> + erofs_put_metabuf(&buf);
> return ret;
> }
> #else
> @@ -261,7 +221,7 @@ static int erofs_init_devices(struct super_block *sb,
> struct erofs_sb_info *sbi = EROFS_SB(sb);
> unsigned int ondisk_extradevs;
> erofs_off_t pos;
> - struct page *page = NULL;
> + struct erofs_buf buf = __EROFS_BUF_INITIALIZER;
> struct erofs_device_info *dif;
> struct erofs_deviceslot *dis;
> void *ptr;
> @@ -285,22 +245,13 @@ static int erofs_init_devices(struct super_block *sb,
> pos = le16_to_cpu(dsb->devt_slotoff) * EROFS_DEVT_SLOT_SIZE;
> down_read(&sbi->devs->rwsem);
> idr_for_each_entry(&sbi->devs->tree, dif, id) {
> - erofs_blk_t blk = erofs_blknr(pos);
> struct block_device *bdev;
>
> - if (!page || page->index != blk) {
> - if (page) {
> - kunmap(page);
> - unlock_page(page);
> - put_page(page);
> - }
> -
> - page = erofs_get_meta_page(sb, blk);
> - if (IS_ERR(page)) {
> - up_read(&sbi->devs->rwsem);
> - return PTR_ERR(page);
> - }
> - ptr = kmap(page);
> + ptr = erofs_read_metabuf(&buf, sb, erofs_blknr(pos),
> + EROFS_KMAP);
> + if (IS_ERR(ptr)) {
> + up_read(&sbi->devs->rwsem);
> + return PTR_ERR(ptr);
> }
> dis = ptr + erofs_blkoff(pos);
>
> @@ -320,11 +271,7 @@ static int erofs_init_devices(struct super_block *sb,
> }
> err_out:
> up_read(&sbi->devs->rwsem);
> - if (page) {
> - kunmap(page);
> - unlock_page(page);
> - put_page(page);
> - }
> + erofs_put_metabuf(&buf);
> return err;
> }
>
Reviewed-by: Yue Hu <huyue2@yulong.com>
WARNING: multiple messages have this Message-ID (diff)
From: Yue Hu <zbestahu@gmail.com>
To: Gao Xiang <hsiangkao@linux.alibaba.com>
Cc: linux-erofs@lists.ozlabs.org, Chao Yu <chao@kernel.org>,
Liu Bo <bo.liu@linux.alibaba.com>,
LKML <linux-kernel@vger.kernel.org>,
huyue@coolpad.com, geshifei@coolpad.com, zhangwen@coolpad.com,
shaojunjun@coolpad.com
Subject: Re: [PATCH 3/5] erofs: use meta buffers for super operations
Date: Thu, 30 Dec 2021 12:11:09 +0800 [thread overview]
Message-ID: <20211230121109.00000328.zbestahu@gmail.com> (raw)
In-Reply-To: <20211229041405.45921-4-hsiangkao@linux.alibaba.com>
On Wed, 29 Dec 2021 12:14:03 +0800
Gao Xiang <hsiangkao@linux.alibaba.com> wrote:
> Get rid of old erofs_get_meta_page() within super operations by
> using on-stack meta buffers in order to prepare subpage and folio
> features.
>
> Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
> ---
> fs/erofs/super.c | 105 ++++++++++++-----------------------------------
> 1 file changed, 26 insertions(+), 79 deletions(-)
>
> diff --git a/fs/erofs/super.c b/fs/erofs/super.c
> index 0724ad5fd6cf..38305fa2969b 100644
> --- a/fs/erofs/super.c
> +++ b/fs/erofs/super.c
> @@ -2,6 +2,7 @@
> /*
> * Copyright (C) 2017-2018 HUAWEI, Inc.
> * https://www.huawei.com/
> + * Copyright (C) 2021, Alibaba Cloud
> */
> #include <linux/module.h>
> #include <linux/buffer_head.h>
> @@ -124,80 +125,48 @@ static bool check_layout_compatibility(struct super_block *sb,
>
> #ifdef CONFIG_EROFS_FS_ZIP
> /* read variable-sized metadata, offset will be aligned by 4-byte */
> -static void *erofs_read_metadata(struct super_block *sb, struct page **pagep,
> +static void *erofs_read_metadata(struct super_block *sb, struct erofs_buf *buf,
> erofs_off_t *offset, int *lengthp)
> {
> - struct page *page = *pagep;
> u8 *buffer, *ptr;
> int len, i, cnt;
> - erofs_blk_t blk;
>
> *offset = round_up(*offset, 4);
> - blk = erofs_blknr(*offset);
> + ptr = erofs_read_metabuf(buf, sb, erofs_blknr(*offset), EROFS_KMAP);
> + if (IS_ERR(ptr))
> + return ptr;
>
> - if (!page || page->index != blk) {
> - if (page) {
> - unlock_page(page);
> - put_page(page);
> - }
> - page = erofs_get_meta_page(sb, blk);
> - if (IS_ERR(page))
> - goto err_nullpage;
> - }
> -
> - ptr = kmap(page);
> len = le16_to_cpu(*(__le16 *)&ptr[erofs_blkoff(*offset)]);
> if (!len)
> len = U16_MAX + 1;
> buffer = kmalloc(len, GFP_KERNEL);
> - if (!buffer) {
> - buffer = ERR_PTR(-ENOMEM);
> - goto out;
> - }
> + if (!buffer)
> + return ERR_PTR(-ENOMEM);
> *offset += sizeof(__le16);
> *lengthp = len;
>
> for (i = 0; i < len; i += cnt) {
> cnt = min(EROFS_BLKSIZ - (int)erofs_blkoff(*offset), len - i);
> - blk = erofs_blknr(*offset);
> -
> - if (!page || page->index != blk) {
> - if (page) {
> - kunmap(page);
> - unlock_page(page);
> - put_page(page);
> - }
> - page = erofs_get_meta_page(sb, blk);
> - if (IS_ERR(page)) {
> - kfree(buffer);
> - goto err_nullpage;
> - }
> - ptr = kmap(page);
> - }
> + ptr = erofs_read_metabuf(buf, sb, erofs_blknr(*offset),
> + EROFS_KMAP);
> + if (IS_ERR(ptr))
> + return ptr;
> memcpy(buffer + i, ptr + erofs_blkoff(*offset), cnt);
> *offset += cnt;
> }
> -out:
> - kunmap(page);
> - *pagep = page;
> return buffer;
> -err_nullpage:
> - *pagep = NULL;
> - return page;
> }
>
> static int erofs_load_compr_cfgs(struct super_block *sb,
> struct erofs_super_block *dsb)
> {
> - struct erofs_sb_info *sbi;
> - struct page *page;
> + struct erofs_sb_info *sbi = EROFS_SB(sb);
> + struct erofs_buf buf = __EROFS_BUF_INITIALIZER;
> unsigned int algs, alg;
> erofs_off_t offset;
> - int size, ret;
> + int size, ret = 0;
>
> - sbi = EROFS_SB(sb);
> sbi->available_compr_algs = le16_to_cpu(dsb->u1.available_compr_algs);
> -
> if (sbi->available_compr_algs & ~Z_EROFS_ALL_COMPR_ALGS) {
> erofs_err(sb, "try to load compressed fs with unsupported algorithms %x",
> sbi->available_compr_algs & ~Z_EROFS_ALL_COMPR_ALGS);
> @@ -205,21 +174,16 @@ static int erofs_load_compr_cfgs(struct super_block *sb,
> }
>
> offset = EROFS_SUPER_OFFSET + sbi->sb_size;
> - page = NULL;
> alg = 0;
> - ret = 0;
> -
> for (algs = sbi->available_compr_algs; algs; algs >>= 1, ++alg) {
> void *data;
>
> if (!(algs & 1))
> continue;
>
> - data = erofs_read_metadata(sb, &page, &offset, &size);
> - if (IS_ERR(data)) {
> - ret = PTR_ERR(data);
> - goto err;
> - }
> + data = erofs_read_metadata(sb, &buf, &offset, &size);
> + if (IS_ERR(data))
> + return PTR_ERR(data);
>
> switch (alg) {
> case Z_EROFS_COMPRESSION_LZ4:
> @@ -234,13 +198,9 @@ static int erofs_load_compr_cfgs(struct super_block *sb,
> }
> kfree(data);
> if (ret)
> - goto err;
> - }
> -err:
> - if (page) {
> - unlock_page(page);
> - put_page(page);
> + break;
> }
> + erofs_put_metabuf(&buf);
> return ret;
> }
> #else
> @@ -261,7 +221,7 @@ static int erofs_init_devices(struct super_block *sb,
> struct erofs_sb_info *sbi = EROFS_SB(sb);
> unsigned int ondisk_extradevs;
> erofs_off_t pos;
> - struct page *page = NULL;
> + struct erofs_buf buf = __EROFS_BUF_INITIALIZER;
> struct erofs_device_info *dif;
> struct erofs_deviceslot *dis;
> void *ptr;
> @@ -285,22 +245,13 @@ static int erofs_init_devices(struct super_block *sb,
> pos = le16_to_cpu(dsb->devt_slotoff) * EROFS_DEVT_SLOT_SIZE;
> down_read(&sbi->devs->rwsem);
> idr_for_each_entry(&sbi->devs->tree, dif, id) {
> - erofs_blk_t blk = erofs_blknr(pos);
> struct block_device *bdev;
>
> - if (!page || page->index != blk) {
> - if (page) {
> - kunmap(page);
> - unlock_page(page);
> - put_page(page);
> - }
> -
> - page = erofs_get_meta_page(sb, blk);
> - if (IS_ERR(page)) {
> - up_read(&sbi->devs->rwsem);
> - return PTR_ERR(page);
> - }
> - ptr = kmap(page);
> + ptr = erofs_read_metabuf(&buf, sb, erofs_blknr(pos),
> + EROFS_KMAP);
> + if (IS_ERR(ptr)) {
> + up_read(&sbi->devs->rwsem);
> + return PTR_ERR(ptr);
> }
> dis = ptr + erofs_blkoff(pos);
>
> @@ -320,11 +271,7 @@ static int erofs_init_devices(struct super_block *sb,
> }
> err_out:
> up_read(&sbi->devs->rwsem);
> - if (page) {
> - kunmap(page);
> - unlock_page(page);
> - put_page(page);
> - }
> + erofs_put_metabuf(&buf);
> return err;
> }
>
Reviewed-by: Yue Hu <huyue2@yulong.com>
next prev parent reply other threads:[~2021-12-30 4:14 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-29 4:14 [PATCH 0/5] erofs: get rid of erofs_get_meta_page() Gao Xiang
2021-12-29 4:14 ` Gao Xiang
2021-12-29 4:14 ` [PATCH 1/5] erofs: introduce meta buffer operations Gao Xiang
2021-12-29 4:14 ` Gao Xiang
2021-12-29 4:14 ` [PATCH 2/5] erofs: use meta buffers for inode operations Gao Xiang
2021-12-29 4:14 ` Gao Xiang
2021-12-30 4:05 ` Yue Hu
2021-12-30 4:05 ` Yue Hu
2021-12-29 4:14 ` [PATCH 3/5] erofs: use meta buffers for super operations Gao Xiang
2021-12-29 4:14 ` Gao Xiang
2021-12-30 4:11 ` Yue Hu [this message]
2021-12-30 4:11 ` Yue Hu
2021-12-30 22:49 ` kernel test robot
2022-01-06 15:08 ` Dan Carpenter
2022-01-06 15:08 ` Dan Carpenter
2022-01-06 15:08 ` Dan Carpenter
2022-01-06 16:40 ` Gao Xiang
2022-01-06 16:40 ` Gao Xiang
2022-01-06 16:40 ` Gao Xiang
2021-12-29 4:14 ` [PATCH 4/5] erofs: use meta buffers for xattr operations Gao Xiang
2021-12-29 4:14 ` Gao Xiang
2021-12-30 4:14 ` Gao Xiang
2021-12-29 4:14 ` [PATCH 5/5] erofs: use meta buffers for zmap operations Gao Xiang
2021-12-29 4:14 ` Gao Xiang
2021-12-29 5:19 ` Yue Hu
2021-12-29 5:19 ` Yue Hu
2021-12-29 5:28 ` Gao Xiang
2021-12-29 5:28 ` Gao Xiang
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=20211230121109.00000328.zbestahu@gmail.com \
--to=zbestahu@gmail.com \
--cc=bo.liu@linux.alibaba.com \
--cc=geshifei@coolpad.com \
--cc=hsiangkao@linux.alibaba.com \
--cc=huyue@coolpad.com \
--cc=linux-erofs@lists.ozlabs.org \
--cc=linux-kernel@vger.kernel.org \
--cc=shaojunjun@coolpad.com \
--cc=zhangwen@coolpad.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.