ext4: add test_mb_mark_used_cost to estimate cost of mb_mark_used
authorKemeng Shi <shikemeng@huaweicloud.com>
Wed, 24 Apr 2024 06:19:01 +0000 (14:19 +0800)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 3 May 2024 04:12:32 +0000 (00:12 -0400)
Add test_mb_mark_used_cost to estimate cost of mb_mark_used

Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com>
Link: https://lore.kernel.org/r/20240424061904.987525-3-shikemeng@huaweicloud.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/mballoc-test.c

index 49aabcfe6b46d478606047f0b3109898ce7b1e1d..bb2a223b207c19e39b66485bc9a4cb47c82b21c6 100644 (file)
@@ -883,6 +883,56 @@ static void test_mb_free_blocks(struct kunit *test)
        ext4_mb_unload_buddy(&e4b);
 }
 
+#define COUNT_FOR_ESTIMATE 100000
+static void test_mb_mark_used_cost(struct kunit *test)
+{
+       struct ext4_buddy e4b;
+       struct super_block *sb = (struct super_block *)test->priv;
+       struct ext4_free_extent ex;
+       int ret;
+       struct test_range ranges[TEST_RANGE_COUNT];
+       int i, j;
+       unsigned long start, end, all = 0;
+
+       /* buddy cache assumes that each page contains at least one block */
+       if (sb->s_blocksize > PAGE_SIZE)
+               kunit_skip(test, "blocksize exceeds pagesize");
+
+       ret = ext4_mb_load_buddy(sb, TEST_GOAL_GROUP, &e4b);
+       KUNIT_ASSERT_EQ(test, ret, 0);
+
+       ex.fe_group = TEST_GOAL_GROUP;
+       for (j = 0; j < COUNT_FOR_ESTIMATE; j++) {
+               mbt_generate_test_ranges(sb, ranges, TEST_RANGE_COUNT);
+               start = jiffies;
+               for (i = 0; i < TEST_RANGE_COUNT; i++) {
+                       if (ranges[i].len == 0)
+                               continue;
+
+                       ex.fe_start = ranges[i].start;
+                       ex.fe_len = ranges[i].len;
+                       ext4_lock_group(sb, TEST_GOAL_GROUP);
+                       mb_mark_used(&e4b, &ex);
+                       ext4_unlock_group(sb, TEST_GOAL_GROUP);
+               }
+               end = jiffies;
+               all += (end - start);
+
+               for (i = 0; i < TEST_RANGE_COUNT; i++) {
+                       if (ranges[i].len == 0)
+                               continue;
+
+                       ext4_lock_group(sb, TEST_GOAL_GROUP);
+                       mb_free_blocks(NULL, &e4b, ranges[i].start,
+                                      ranges[i].len);
+                       ext4_unlock_group(sb, TEST_GOAL_GROUP);
+               }
+       }
+
+       kunit_info(test, "costed jiffies %lu\n", all);
+       ext4_mb_unload_buddy(&e4b);
+}
+
 static const struct mbt_ext4_block_layout mbt_test_layouts[] = {
        {
                .blocksize_bits = 10,
@@ -925,6 +975,8 @@ static struct kunit_case mbt_test_cases[] = {
        KUNIT_CASE_PARAM(test_mb_mark_used, mbt_layouts_gen_params),
        KUNIT_CASE_PARAM(test_mb_free_blocks, mbt_layouts_gen_params),
        KUNIT_CASE_PARAM(test_mark_diskspace_used, mbt_layouts_gen_params),
+       KUNIT_CASE_PARAM_ATTR(test_mb_mark_used_cost, mbt_layouts_gen_params,
+                             { .speed = KUNIT_SPEED_SLOW }),
        {}
 };