Whamcloud - gitweb
LU-13915 ldiskfs: Avoid atomic operation while bitmap prefetch 97/39697/2
authorYang Sheng <ys@whamcloud.com>
Thu, 20 Aug 2020 07:39:40 +0000 (15:39 +0800)
committerOleg Drokin <green@whamcloud.com>
Tue, 8 Sep 2020 18:09:07 +0000 (18:09 +0000)
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 <ys@whamcloud.com>
Change-Id: I2ff2c39f1dd3b351462ed66cbd3ebb36e6af4bea
Reviewed-on: https://review.whamcloud.com/39697
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Artem Blagodarenko <artem.blagodarenko@hpe.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
ldiskfs/kernel_patches/patches/rhel7.6/ext4-mballoc-prefetch.patch
ldiskfs/kernel_patches/patches/rhel7.7/ext4-mballoc-prefetch.patch
ldiskfs/kernel_patches/patches/rhel8.1/ext4-mballoc-prefetch.patch
ldiskfs/kernel_patches/patches/rhel8/ext4-mballoc-prefetch.patch

index dd9baa9..adeb497 100644 (file)
 
  #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)))
  
 +      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
index 5bb1d04..ca5390c 100644 (file)
 
  #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)))
  
 +      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
index e0715dd..a523b18 100644 (file)
 
  #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)))
  
 +      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
index a382280..4eb355e 100644 (file)
 
  #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)))
  
 +      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