]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
f2fs: zone: introduce first_zoned_segno in f2fs_sb_info
authorChao Yu <chao@kernel.org>
Fri, 18 Oct 2024 06:26:36 +0000 (14:26 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Fri, 1 Nov 2024 01:19:00 +0000 (01:19 +0000)
first_zoned_segno() returns a fixed value, let's cache it in
structure f2fs_sb_info to avoid redundant calculation.

Signed-off-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/f2fs.h
fs/f2fs/segment.c
fs/f2fs/segment.h
fs/f2fs/super.c

index f3ef4dc509921cb1a3eec15eb73c357a1dc2b14f..3c6f3cce577904020419e21e0c027163f9bee93c 100644 (file)
@@ -1759,6 +1759,7 @@ struct f2fs_sb_info {
        unsigned int dirty_device;              /* for checkpoint data flush */
        spinlock_t dev_lock;                    /* protect dirty_device */
        bool aligned_blksize;                   /* all devices has the same logical blksize */
+       unsigned int first_zoned_segno;         /* first zoned segno */
 
        /* For write statistics */
        u64 sectors_written_start;
index 859d70bbc5e70294b56cc0194b6befaf34a3549e..216762a10e5a677317fde503d411ba18ac0f156d 100644 (file)
@@ -2711,7 +2711,7 @@ static int get_new_segment(struct f2fs_sb_info *sbi,
                if (sbi->blkzone_alloc_policy == BLKZONE_ALLOC_PRIOR_CONV || pinning)
                        segno = 0;
                else
-                       segno = max(first_zoned_segno(sbi), *newseg);
+                       segno = max(sbi->first_zoned_segno, *newseg);
                hint = GET_SEC_FROM_SEG(sbi, segno);
        }
 #endif
@@ -2723,7 +2723,7 @@ find_other_zone:
        if (secno >= MAIN_SECS(sbi) && f2fs_sb_has_blkzoned(sbi)) {
                /* Write only to sequential zones */
                if (sbi->blkzone_alloc_policy == BLKZONE_ALLOC_ONLY_SEQ) {
-                       hint = GET_SEC_FROM_SEG(sbi, first_zoned_segno(sbi));
+                       hint = GET_SEC_FROM_SEG(sbi, sbi->first_zoned_segno);
                        secno = find_next_zero_bit(free_i->free_secmap, MAIN_SECS(sbi), hint);
                } else
                        secno = find_first_zero_bit(free_i->free_secmap,
index 55a01da6c4be58e87b670e08cc5ef1bcec6992dd..8bf09fb67841cdc779ed35241532c55643d29d10 100644 (file)
@@ -974,13 +974,3 @@ wake_up:
        dcc->discard_wake = true;
        wake_up_interruptible_all(&dcc->discard_wait_queue);
 }
-
-static inline unsigned int first_zoned_segno(struct f2fs_sb_info *sbi)
-{
-       int devi;
-
-       for (devi = 0; devi < sbi->s_ndevs; devi++)
-               if (bdev_is_zoned(FDEV(devi).bdev))
-                       return GET_SEGNO(sbi, FDEV(devi).start_blk);
-       return 0;
-}
index aa14c8fce7d9f8d56fb64a8b1fe69cdc7723fe33..80a53dbf1c38c0452c14ff83c353486ff19b9f02 100644 (file)
@@ -4221,6 +4221,16 @@ static void f2fs_record_error_work(struct work_struct *work)
        f2fs_record_stop_reason(sbi);
 }
 
+static inline unsigned int get_first_zoned_segno(struct f2fs_sb_info *sbi)
+{
+       int devi;
+
+       for (devi = 0; devi < sbi->s_ndevs; devi++)
+               if (bdev_is_zoned(FDEV(devi).bdev))
+                       return GET_SEGNO(sbi, FDEV(devi).start_blk);
+       return 0;
+}
+
 static int f2fs_scan_devices(struct f2fs_sb_info *sbi)
 {
        struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi);
@@ -4621,6 +4631,9 @@ try_onemore:
        /* For write statistics */
        sbi->sectors_written_start = f2fs_get_sectors_written(sbi);
 
+       /* get segno of first zoned block device */
+       sbi->first_zoned_segno = get_first_zoned_segno(sbi);
+
        /* Read accumulated write IO statistics if exists */
        seg_i = CURSEG_I(sbi, CURSEG_HOT_NODE);
        if (__exist_node_summaries(sbi))