]> git.ipfire.org Git - people/ms/linux.git/blobdiff - fs/ext4/mballoc.c
ext4: avoid unnecessary spreading of allocations among groups
[people/ms/linux.git] / fs / ext4 / mballoc.c
index 41e1cfecac3b1bf6bcd8df1893e5dd8f494b38b6..6251b4a6cc63c8a85e14582866ae0d23d4501ea6 100644 (file)
@@ -1077,23 +1077,25 @@ mb_set_largest_free_order(struct super_block *sb, struct ext4_group_info *grp)
        struct ext4_sb_info *sbi = EXT4_SB(sb);
        int i;
 
-       if (test_opt2(sb, MB_OPTIMIZE_SCAN) && grp->bb_largest_free_order >= 0) {
+       for (i = MB_NUM_ORDERS(sb) - 1; i >= 0; i--)
+               if (grp->bb_counters[i] > 0)
+                       break;
+       /* No need to move between order lists? */
+       if (!test_opt2(sb, MB_OPTIMIZE_SCAN) ||
+           i == grp->bb_largest_free_order) {
+               grp->bb_largest_free_order = i;
+               return;
+       }
+
+       if (grp->bb_largest_free_order >= 0) {
                write_lock(&sbi->s_mb_largest_free_orders_locks[
                                              grp->bb_largest_free_order]);
                list_del_init(&grp->bb_largest_free_order_node);
                write_unlock(&sbi->s_mb_largest_free_orders_locks[
                                              grp->bb_largest_free_order]);
        }
-       grp->bb_largest_free_order = -1; /* uninit */
-
-       for (i = MB_NUM_ORDERS(sb) - 1; i >= 0; i--) {
-               if (grp->bb_counters[i] > 0) {
-                       grp->bb_largest_free_order = i;
-                       break;
-               }
-       }
-       if (test_opt2(sb, MB_OPTIMIZE_SCAN) &&
-           grp->bb_largest_free_order >= 0 && grp->bb_free) {
+       grp->bb_largest_free_order = i;
+       if (grp->bb_largest_free_order >= 0 && grp->bb_free) {
                write_lock(&sbi->s_mb_largest_free_orders_locks[
                                              grp->bb_largest_free_order]);
                list_add_tail(&grp->bb_largest_free_order_node,