]> git.baikalelectronics.ru Git - kernel.git/commitdiff
btrfs: voluntarily relinquish cpu when doing a full fsync
authorFilipe Manana <fdmanana@suse.com>
Thu, 17 Feb 2022 12:12:05 +0000 (12:12 +0000)
committerDavid Sterba <dsterba@suse.com>
Mon, 14 Mar 2022 12:13:52 +0000 (13:13 +0100)
Doing a full fsync may require processing many leaves of metadata, which
can take some time and result in a task monopolizing a cpu for too long.
So add a cond_resched() after processing a leaf when doing a full fsync,
while not holding any locks on any tree (a subvolume or a log tree).

Signed-off-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/tree-log.c

index 0b841eab616934fc99fb56b54157ca750652f87a..b6abc716aff2878ab6192b99929f1255e79fa776 100644 (file)
@@ -5712,6 +5712,13 @@ next_key:
                } else {
                        break;
                }
+
+               /*
+                * We may process many leaves full of items for our inode, so
+                * avoid monopolizing a cpu for too long by rescheduling while
+                * not holding locks on any tree.
+                */
+               cond_resched();
        }
        if (ins_nr) {
                ret = copy_items(trans, inode, dst_path, path, ins_start_slot,