From: Chao Yu <chao@kernel.org>
To: Liao Yuanhong <liaoyuanhong@vivo.com>, Jaegeuk Kim <jaegeuk@kernel.org>
Cc: linux-kernel@vger.kernel.org, bo.wu@vivo.com,
linux-f2fs-devel@lists.sourceforge.net
Subject: Re: [f2fs-dev] [PATCH] f2fs:Add write priority option based on zone UFS
Date: Thu, 4 Jul 2024 16:46:28 +0800 [thread overview]
Message-ID: <cbc18f90-9c5a-49b0-9c6f-d1fbab0f2df1@kernel.org> (raw)
In-Reply-To: <20240702062952.28859-1-liaoyuanhong@vivo.com>
On 2024/7/2 14:29, Liao Yuanhong wrote:
> Currently, we are using a mix of traditional UFS and zone UFS to support
> some functionalities that cannot be achieved on zone UFS alone. However,
> there are some issues with this approach. There exists a significant
> performance difference between traditional UFS and zone UFS. Under normal
> usage, we prioritize writes to zone UFS. However, in critical conditions
> (such as when the entire UFS is almost full), we cannot determine whether
> data will be written to traditional UFS or zone UFS. This can lead to
> significant performance fluctuations, which is not conducive to
> development and testing. To address this, we have added an option
> zlu_io_enable under sys with the following three modes:
> 1) zlu_io_enable == 0:Normal mode, prioritize writing to zone UFS;
> 2) zlu_io_enable == 1:Zone UFS only mode, only allow writing to zone UFS;
> 3) zlu_io_enable == 2:Traditional UFS priority mode, prioritize writing to
> traditional UFS.
Use blkzone_alloc_policy instead of zlu_io_enable? Not sure.
Should update manual of f2fs sysfs entry.
>
> Signed-off-by: Liao Yuanhong <liaoyuanhong@vivo.com>
> Signed-off-by: Wu Bo <bo.wu@vivo.com>
> ---
> fs/f2fs/f2fs.h | 5 +++++
> fs/f2fs/segment.c | 23 ++++++++++++++++++++++-
> fs/f2fs/sysfs.c | 13 +++++++++++++
> 3 files changed, 40 insertions(+), 1 deletion(-)
>
> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
> index f7ee6c5e371e..7ba782bd15b2 100644
> --- a/fs/f2fs/f2fs.h
> +++ b/fs/f2fs/f2fs.h
> @@ -1781,6 +1781,11 @@ struct f2fs_sb_info {
> u64 committed_atomic_block;
> u64 revoked_atomic_block;
>
> +#ifdef CONFIG_BLK_DEV_ZONED
> + /* For adjust the priority writing position of data in zone UFS */
> + unsigned int zlu_io_enable; /* data write mode */
> +#endif
#ifdef CONFIG_BLK_DEV_ZONED
unsigned int blocks_per_blkz; /* F2FS blocks per zone */
unsigned int max_open_zones; /* max open zone resources of the zoned device */
/* For adjust the priority writing position of data in zone UFS */
unsigned int zlu_io_enable; /* data write mode */
#endif
> +
> #ifdef CONFIG_F2FS_FS_COMPRESSION
> struct kmem_cache *page_array_slab; /* page array entry */
> unsigned int page_array_slab_size; /* default page array slab size */
> diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
> index 4db1add43e36..327457c28700 100644
> --- a/fs/f2fs/segment.c
> +++ b/fs/f2fs/segment.c
> @@ -2686,17 +2686,38 @@ static int get_new_segment(struct f2fs_sb_info *sbi,
> goto got_it;
> }
>
> +#ifdef CONFIG_BLK_DEV_ZONED
> /*
> * If we format f2fs on zoned storage, let's try to get pinned sections
> * from beginning of the storage, which should be a conventional one.
> */
> if (f2fs_sb_has_blkzoned(sbi)) {
> - segno = pinning ? 0 : max(first_zoned_segno(sbi), *newseg);
> + if (sbi->zlu_io_enable == 2) /* Prioritize writing to traditional UFS */
Please use a macro instead of magic number.
> + segno = 0;
> + else
> + segno = pinning ? 0 : max(first_zoned_segno(sbi), *newseg);
> hint = GET_SEC_FROM_SEG(sbi, segno);
> }
> +#endif
>
> find_other_zone:
> secno = find_next_zero_bit(free_i->free_secmap, MAIN_SECS(sbi), hint);
> +
> +#ifdef CONFIG_BLK_DEV_ZONED
> + if (secno >= MAIN_SECS(sbi) && f2fs_sb_has_blkzoned(sbi)) {
> + if (sbi->zlu_io_enable == 1) { /* Write only to zone UFS */
Ditto.
And we'd better initialize it w/ default policy in somewhere.
> + hint = GET_SEC_FROM_SEG(sbi, first_zoned_segno(sbi));
> + secno = find_next_zero_bit(free_i->free_secmap, MAIN_SECS(sbi), hint);
> + } else
> + secno = find_first_zero_bit(free_i->free_secmap,
> + MAIN_SECS(sbi));
> + if (secno >= MAIN_SECS(sbi)) {
> + ret = -ENOSPC;
> + goto out_unlock;
> + }
> + }
> +#endif
> +
> if (secno >= MAIN_SECS(sbi)) {
> secno = find_first_zero_bit(free_i->free_secmap,
> MAIN_SECS(sbi));
> diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c
> index fee7ee45ceaa..bc9e5e8bb749 100644
> --- a/fs/f2fs/sysfs.c
> +++ b/fs/f2fs/sysfs.c
> @@ -627,6 +627,13 @@ static ssize_t __sbi_store(struct f2fs_attr *a,
> }
> #endif
>
> +#ifdef CONFIG_BLK_DEV_ZONED
> + if (!strcmp(a->attr.name, "zlu_io_enable")) {
Should check validation of new value?
> + sbi->zlu_io_enable = t;
> + return count;
> + }
> +#endif
> +
> #ifdef CONFIG_F2FS_FS_COMPRESSION
> if (!strcmp(a->attr.name, "compr_written_block") ||
> !strcmp(a->attr.name, "compr_saved_block")) {
> @@ -1006,6 +1013,9 @@ F2FS_SBI_GENERAL_RW_ATTR(dir_level);
> F2FS_SBI_GENERAL_RW_ATTR(iostat_enable);
> F2FS_SBI_GENERAL_RW_ATTR(iostat_period_ms);
> #endif
> +#ifdef CONFIG_BLK_DEV_ZONED
> +F2FS_SBI_GENERAL_RW_ATTR(zlu_io_enable);
#ifdef CONFIG_BLK_DEV_ZONED
F2FS_SBI_GENERAL_RO_ATTR(unusable_blocks_per_sec);
F2FS_SBI_GENERAL_RW_ATTR(zlu_io_enable);
#endif
Thanks,
> +#endif
> F2FS_SBI_GENERAL_RW_ATTR(readdir_ra);
> F2FS_SBI_GENERAL_RW_ATTR(max_io_bytes);
> F2FS_SBI_GENERAL_RW_ATTR(data_io_flag);
> @@ -1153,6 +1163,9 @@ static struct attribute *f2fs_attrs[] = {
> #ifdef CONFIG_F2FS_IOSTAT
> ATTR_LIST(iostat_enable),
> ATTR_LIST(iostat_period_ms),
> +#endif
> +#ifdef CONFIG_BLK_DEV_ZONED
> + ATTR_LIST(zlu_io_enable),
> #endif
> ATTR_LIST(readdir_ra),
> ATTR_LIST(max_io_bytes),
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
next prev parent reply other threads:[~2024-07-04 8:46 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-02 6:29 [f2fs-dev] [PATCH] f2fs:Add write priority option based on zone UFS Liao Yuanhong via Linux-f2fs-devel
2024-07-04 8:46 ` Chao Yu [this message]
2024-07-05 9:46 ` [f2fs-dev] [PATCH v2] " Liao Yuanhong via Linux-f2fs-devel
2024-07-08 4:00 ` Chao Yu
2024-07-09 2:16 ` [f2fs-dev] [PATCH v3] " Liao Yuanhong via Linux-f2fs-devel
2024-07-09 9:44 ` Chao Yu
2024-07-10 3:06 ` [f2fs-dev] [PATCH v4] " Liao Yuanhong via Linux-f2fs-devel
2024-07-12 7:39 ` Chao Yu
2024-07-15 12:34 ` [f2fs-dev] [PATCH v5] " Liao Yuanhong via Linux-f2fs-devel
2024-07-22 1:31 ` Chao Yu
2024-08-05 23:30 ` patchwork-bot+f2fs
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=cbc18f90-9c5a-49b0-9c6f-d1fbab0f2df1@kernel.org \
--to=chao@kernel.org \
--cc=bo.wu@vivo.com \
--cc=jaegeuk@kernel.org \
--cc=liaoyuanhong@vivo.com \
--cc=linux-f2fs-devel@lists.sourceforge.net \
--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;
as well as URLs for NNTP newsgroup(s).