From f2637c8f2df1492645404706bef3753442f4cc4b Mon Sep 17 00:00:00 2001 From: Yang Sheng Date: Thu, 20 Aug 2020 15:39:40 +0800 Subject: [PATCH] LU-13915 ldiskfs: Avoid atomic operation while bitmap prefetch It is expensive since test_and_set_bit is a atomic operation. So use test_bit while bitmap prefetch to avoid call it frequently. Signed-off-by: Yang Sheng Change-Id: I2ff2c39f1dd3b351462ed66cbd3ebb36e6af4bea Reviewed-on: https://review.whamcloud.com/39697 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Artem Blagodarenko Reviewed-by: Oleg Drokin --- ldiskfs/kernel_patches/patches/rhel7.6/ext4-mballoc-prefetch.patch | 6 ++++-- ldiskfs/kernel_patches/patches/rhel7.7/ext4-mballoc-prefetch.patch | 6 ++++-- ldiskfs/kernel_patches/patches/rhel8.1/ext4-mballoc-prefetch.patch | 6 ++++-- ldiskfs/kernel_patches/patches/rhel8/ext4-mballoc-prefetch.patch | 6 ++++-- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/ldiskfs/kernel_patches/patches/rhel7.6/ext4-mballoc-prefetch.patch b/ldiskfs/kernel_patches/patches/rhel7.6/ext4-mballoc-prefetch.patch index dd9baa9..adeb497 100644 --- a/ldiskfs/kernel_patches/patches/rhel7.6/ext4-mballoc-prefetch.patch +++ b/ldiskfs/kernel_patches/patches/rhel7.6/ext4-mballoc-prefetch.patch @@ -62,10 +62,12 @@ #define EXT4_MB_GRP_NEED_INIT(grp) \ (test_bit(EXT4_GROUP_INFO_NEED_INIT_BIT, &((grp)->bb_state))) -@@ -3065,6 +3070,8 @@ struct ext4_group_info { +@@ -3065,6 +3070,10 @@ struct ext4_group_info { (set_bit(EXT4_GROUP_INFO_WAS_TRIMMED_BIT, &((grp)->bb_state))) #define EXT4_MB_GRP_CLEAR_TRIMMED(grp) \ (clear_bit(EXT4_GROUP_INFO_WAS_TRIMMED_BIT, &((grp)->bb_state))) ++#define EXT4_MB_GRP_TEST(grp) \ ++ (test_bit(EXT4_GROUP_INFO_BBITMAP_READ_BIT, &((grp)->bb_state))) +#define EXT4_MB_GRP_TEST_AND_SET_READ(grp) \ + (test_and_set_bit(EXT4_GROUP_INFO_BBITMAP_READ_BIT, &((grp)->bb_state))) @@ -128,7 +130,7 @@ + while (nr-- > 0) { + grp = ext4_get_group_info(sb, group); + /* prevent expensive getblk() on groups w/ IO in progress */ -+ if (EXT4_MB_GRP_TEST_AND_SET_READ(grp)) ++ if (EXT4_MB_GRP_TEST(grp) || EXT4_MB_GRP_TEST_AND_SET_READ(grp)) + goto next; + + /* ignore empty groups - those will be skipped diff --git a/ldiskfs/kernel_patches/patches/rhel7.7/ext4-mballoc-prefetch.patch b/ldiskfs/kernel_patches/patches/rhel7.7/ext4-mballoc-prefetch.patch index 5bb1d04..ca5390c 100644 --- a/ldiskfs/kernel_patches/patches/rhel7.7/ext4-mballoc-prefetch.patch +++ b/ldiskfs/kernel_patches/patches/rhel7.7/ext4-mballoc-prefetch.patch @@ -62,10 +62,12 @@ #define EXT4_MB_GRP_NEED_INIT(grp) \ (test_bit(EXT4_GROUP_INFO_NEED_INIT_BIT, &((grp)->bb_state))) -@@ -3065,6 +3070,8 @@ struct ext4_group_info { +@@ -3065,6 +3070,10 @@ struct ext4_group_info { (set_bit(EXT4_GROUP_INFO_WAS_TRIMMED_BIT, &((grp)->bb_state))) #define EXT4_MB_GRP_CLEAR_TRIMMED(grp) \ (clear_bit(EXT4_GROUP_INFO_WAS_TRIMMED_BIT, &((grp)->bb_state))) ++#define EXT4_MB_GRP_TEST(grp) \ ++ (test_bit(EXT4_GROUP_INFO_BBITMAP_READ_BIT, &((grp)->bb_state))) +#define EXT4_MB_GRP_TEST_AND_SET_READ(grp) \ + (test_and_set_bit(EXT4_GROUP_INFO_BBITMAP_READ_BIT, &((grp)->bb_state))) @@ -128,7 +130,7 @@ + while (nr-- > 0) { + grp = ext4_get_group_info(sb, group); + /* prevent expensive getblk() on groups w/ IO in progress */ -+ if (EXT4_MB_GRP_TEST_AND_SET_READ(grp)) ++ if (EXT4_MB_GRP_TEST(grp) || EXT4_MB_GRP_TEST_AND_SET_READ(grp)) + goto next; + + /* ignore empty groups - those will be skipped diff --git a/ldiskfs/kernel_patches/patches/rhel8.1/ext4-mballoc-prefetch.patch b/ldiskfs/kernel_patches/patches/rhel8.1/ext4-mballoc-prefetch.patch index e0715dd..a523b18 100644 --- a/ldiskfs/kernel_patches/patches/rhel8.1/ext4-mballoc-prefetch.patch +++ b/ldiskfs/kernel_patches/patches/rhel8.1/ext4-mballoc-prefetch.patch @@ -62,10 +62,12 @@ #define EXT4_MB_GRP_NEED_INIT(grp) \ (test_bit(EXT4_GROUP_INFO_NEED_INIT_BIT, &((grp)->bb_state))) -@@ -3065,6 +3070,8 @@ struct ext4_group_info { +@@ -3065,6 +3070,10 @@ struct ext4_group_info { (set_bit(EXT4_GROUP_INFO_WAS_TRIMMED_BIT, &((grp)->bb_state))) #define EXT4_MB_GRP_CLEAR_TRIMMED(grp) \ (clear_bit(EXT4_GROUP_INFO_WAS_TRIMMED_BIT, &((grp)->bb_state))) ++#define EXT4_MB_GRP_TEST(grp) \ ++ (test_bit(EXT4_GROUP_INFO_BBITMAP_READ_BIT, &((grp)->bb_state))) +#define EXT4_MB_GRP_TEST_AND_SET_READ(grp) \ + (test_and_set_bit(EXT4_GROUP_INFO_BBITMAP_READ_BIT, &((grp)->bb_state))) @@ -128,7 +130,7 @@ + while (nr-- > 0) { + grp = ext4_get_group_info(sb, group); + /* prevent expensive getblk() on groups w/ IO in progress */ -+ if (EXT4_MB_GRP_TEST_AND_SET_READ(grp)) ++ if (EXT4_MB_GRP_TEST(grp) || EXT4_MB_GRP_TEST_AND_SET_READ(grp)) + goto next; + + /* ignore empty groups - those will be skipped diff --git a/ldiskfs/kernel_patches/patches/rhel8/ext4-mballoc-prefetch.patch b/ldiskfs/kernel_patches/patches/rhel8/ext4-mballoc-prefetch.patch index a382280..4eb355e 100644 --- a/ldiskfs/kernel_patches/patches/rhel8/ext4-mballoc-prefetch.patch +++ b/ldiskfs/kernel_patches/patches/rhel8/ext4-mballoc-prefetch.patch @@ -62,10 +62,12 @@ #define EXT4_MB_GRP_NEED_INIT(grp) \ (test_bit(EXT4_GROUP_INFO_NEED_INIT_BIT, &((grp)->bb_state))) -@@ -3065,6 +3070,8 @@ struct ext4_group_info { +@@ -3065,6 +3070,10 @@ struct ext4_group_info { (set_bit(EXT4_GROUP_INFO_WAS_TRIMMED_BIT, &((grp)->bb_state))) #define EXT4_MB_GRP_CLEAR_TRIMMED(grp) \ (clear_bit(EXT4_GROUP_INFO_WAS_TRIMMED_BIT, &((grp)->bb_state))) ++#define EXT4_MB_GRP_TEST(grp) \ ++ (test_bit(EXT4_GROUP_INFO_BBITMAP_READ_BIT, &((grp)->bb_state))) +#define EXT4_MB_GRP_TEST_AND_SET_READ(grp) \ + (test_and_set_bit(EXT4_GROUP_INFO_BBITMAP_READ_BIT, &((grp)->bb_state))) @@ -128,7 +130,7 @@ + while (nr-- > 0) { + grp = ext4_get_group_info(sb, group); + /* prevent expensive getblk() on groups w/ IO in progress */ -+ if (EXT4_MB_GRP_TEST_AND_SET_READ(grp)) ++ if (EXT4_MB_GRP_TEST(grp) || EXT4_MB_GRP_TEST_AND_SET_READ(grp)) + goto next; + + /* ignore empty groups - those will be skipped -- 1.8.3.1