writeback: factor out wb_dirty_freerun to remove more repeated freerun code
authorKemeng Shi <shikemeng@huaweicloud.com>
Tue, 14 May 2024 12:52:51 +0000 (20:52 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Thu, 4 Jul 2024 02:29:54 +0000 (19:29 -0700)
Factor out wb_dirty_freerun to remove more repeated freerun code.

Link: https://lkml.kernel.org/r/20240514125254.142203-6-shikemeng@huaweicloud.com
Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com>
Acked-by: Tejun Heo <tj@kernel.org>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/page-writeback.c

index 72d55c2fe4324a30d3a19c29fa88033cf1539284..a93505cadd4ee8241682fcd7b8a5eab00a8a1969 100644 (file)
@@ -1746,6 +1746,27 @@ static void domain_dirty_freerun(struct dirty_throttle_control *dtc,
        dtc->freerun = dirty <= dirty_freerun_ceiling(thresh, bg_thresh);
 }
 
+static void wb_dirty_freerun(struct dirty_throttle_control *dtc,
+                            bool strictlimit)
+{
+       dtc->freerun = false;
+
+       /* was already handled in domain_dirty_freerun */
+       if (strictlimit)
+               return;
+
+       wb_dirty_limits(dtc);
+       /*
+        * LOCAL_THROTTLE tasks must not be throttled when below the per-wb
+        * freerun ceiling.
+        */
+       if (!(current->flags & PF_LOCAL_THROTTLE))
+               return;
+
+       dtc->freerun = dtc->wb_dirty <
+                      dirty_freerun_ceiling(dtc->wb_thresh, dtc->wb_bg_thresh);
+}
+
 /*
  * balance_dirty_pages() must be called by processes which are generating dirty
  * data.  It looks at the number of dirty pages in the machine and will force
@@ -1838,19 +1859,9 @@ free_running:
                 * Calculate global domain's pos_ratio and select the
                 * global dtc by default.
                 */
-               if (!strictlimit) {
-                       wb_dirty_limits(gdtc);
-
-                       if ((current->flags & PF_LOCAL_THROTTLE) &&
-                           gdtc->wb_dirty <
-                           dirty_freerun_ceiling(gdtc->wb_thresh,
-                                                 gdtc->wb_bg_thresh))
-                               /*
-                                * LOCAL_THROTTLE tasks must not be throttled
-                                * when below the per-wb freerun ceiling.
-                                */
-                               goto free_running;
-               }
+               wb_dirty_freerun(gdtc, strictlimit);
+               if (gdtc->freerun)
+                       goto free_running;
 
                dirty_exceeded = (gdtc->wb_dirty > gdtc->wb_thresh) &&
                        ((gdtc->dirty > gdtc->thresh) || strictlimit);
@@ -1865,20 +1876,10 @@ free_running:
                         * both global and memcg domains.  Choose the one
                         * w/ lower pos_ratio.
                         */
-                       if (!strictlimit) {
-                               wb_dirty_limits(mdtc);
-
-                               if ((current->flags & PF_LOCAL_THROTTLE) &&
-                                   mdtc->wb_dirty <
-                                   dirty_freerun_ceiling(mdtc->wb_thresh,
-                                                         mdtc->wb_bg_thresh))
-                                       /*
-                                        * LOCAL_THROTTLE tasks must not be
-                                        * throttled when below the per-wb
-                                        * freerun ceiling.
-                                        */
-                                       goto free_running;
-                       }
+                       wb_dirty_freerun(mdtc, strictlimit);
+                       if (mdtc->freerun)
+                               goto free_running;
+
                        dirty_exceeded |= (mdtc->wb_dirty > mdtc->wb_thresh) &&
                                ((mdtc->dirty > mdtc->thresh) || strictlimit);