]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
f2fs: reduce cmd_lock coverage in __issue_discard_cmd
authorChao Yu <yuchao0@huawei.com>
Wed, 4 Oct 2017 01:08:35 +0000 (09:08 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Thu, 26 Oct 2017 08:44:09 +0000 (10:44 +0200)
__submit_discard_cmd may lead long latency due to exhaustion of I/O
request resource in block layer, so issuing all discard under cmd_lock
may lead to hangtask, in order to avoid that, let's reduce it's coverage.

Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/segment.c

index dbbfae77cb1e1ff2d972474ddb28c4b125049909..1bb7417b4ebbeb27f5cafb4c22d9c8cc1c2030d9 100644 (file)
@@ -1158,14 +1158,14 @@ static int __issue_discard_cmd(struct f2fs_sb_info *sbi,
        int i, iter = 0, issued = 0;
        bool io_interrupted = false;
 
-       mutex_lock(&dcc->cmd_lock);
-       f2fs_bug_on(sbi,
-               !__check_rb_tree_consistence(sbi, &dcc->root));
-       blk_start_plug(&plug);
        for (i = MAX_PLIST_NUM - 1; i >= 0; i--) {
                if (i + 1 < dpolicy->granularity)
                        break;
                pend_list = &dcc->pend_list[i];
+
+               mutex_lock(&dcc->cmd_lock);
+               f2fs_bug_on(sbi, !__check_rb_tree_consistence(sbi, &dcc->root));
+               blk_start_plug(&plug);
                list_for_each_entry_safe(dc, tmp, pend_list, list) {
                        f2fs_bug_on(sbi, dc->state != D_PREP);
 
@@ -1179,12 +1179,14 @@ static int __issue_discard_cmd(struct f2fs_sb_info *sbi,
                        issued++;
 skip:
                        if (++iter >= dpolicy->max_requests)
-                               goto out;
+                               break;
                }
+               blk_finish_plug(&plug);
+               mutex_unlock(&dcc->cmd_lock);
+
+               if (iter >= dpolicy->max_requests)
+                       break;
        }
-out:
-       blk_finish_plug(&plug);
-       mutex_unlock(&dcc->cmd_lock);
 
        if (!issued && io_interrupted)
                issued = -1;