The updates to pcplists' high and batch valued are handled by multiple
functions that make the calculations hard to follow. Consolidate everything
to pageset_set_high_and_batch() and remove pageset_set_batch() and
pageset_set_high() wrappers.

The only special case using one of the removed wrappers was:
build_all_zonelists_init()
  setup_pageset()
    pageset_set_batch()
which was hardcoding batch as 0, so we can just open-code a call to
pageset_update() with constant parameters instead.

No functional change.

Signed-off-by: Vlastimil Babka <vba...@suse.cz>
---
 mm/page_alloc.c | 51 +++++++++++++++++++------------------------------
 1 file changed, 20 insertions(+), 31 deletions(-)

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index fab5e97dc9ca..0b516208afda 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -5834,7 +5834,7 @@ static void build_zonelists(pg_data_t *pgdat)
  * not check if the processor is online before following the pageset pointer.
  * Other parts of the kernel may not check if the zone is available.
  */
-static void setup_pageset(struct per_cpu_pageset *p, unsigned long batch);
+static void setup_pageset(struct per_cpu_pageset *p);
 static DEFINE_PER_CPU(struct per_cpu_pageset, boot_pageset);
 static DEFINE_PER_CPU(struct per_cpu_nodestat, boot_nodestats);
 
@@ -5902,7 +5902,7 @@ build_all_zonelists_init(void)
         * (a chicken-egg dilemma).
         */
        for_each_possible_cpu(cpu)
-               setup_pageset(&per_cpu(boot_pageset, cpu), 0);
+               setup_pageset(&per_cpu(boot_pageset, cpu));
 
        mminit_verify_zonelist();
        cpuset_init_current_mems_allowed();
@@ -6218,12 +6218,6 @@ static void pageset_update(struct per_cpu_pages *pcp, 
unsigned long high,
        pcp->batch = batch;
 }
 
-/* a companion to pageset_set_high() */
-static void pageset_set_batch(struct per_cpu_pageset *p, unsigned long batch)
-{
-       pageset_update(&p->pcp, 6 * batch, max(1UL, 1 * batch));
-}
-
 static void pageset_init(struct per_cpu_pageset *p)
 {
        struct per_cpu_pages *pcp;
@@ -6236,35 +6230,30 @@ static void pageset_init(struct per_cpu_pageset *p)
                INIT_LIST_HEAD(&pcp->lists[migratetype]);
 }
 
-static void setup_pageset(struct per_cpu_pageset *p, unsigned long batch)
+static void setup_pageset(struct per_cpu_pageset *p)
 {
        pageset_init(p);
-       pageset_set_batch(p, batch);
-}
-
-/*
- * pageset_set_high() sets the high water mark for hot per_cpu_pagelist
- * to the value high for the pageset p.
- */
-static void pageset_set_high(struct per_cpu_pageset *p,
-                               unsigned long high)
-{
-       unsigned long batch = max(1UL, high / 4);
-       if ((high / 4) > (PAGE_SHIFT * 8))
-               batch = PAGE_SHIFT * 8;
-
-       pageset_update(&p->pcp, high, batch);
+       pageset_update(&p->pcp, 0, 1);
 }
 
 static void pageset_set_high_and_batch(struct zone *zone,
-                                      struct per_cpu_pageset *pcp)
+                                      struct per_cpu_pageset *p)
 {
-       if (percpu_pagelist_fraction)
-               pageset_set_high(pcp,
-                       (zone_managed_pages(zone) /
-                               percpu_pagelist_fraction));
-       else
-               pageset_set_batch(pcp, zone_batchsize(zone));
+       unsigned long new_high;
+       unsigned long new_batch;
+       int fraction = READ_ONCE(percpu_pagelist_fraction);
+
+       if (fraction) {
+               new_high = zone_managed_pages(zone) / fraction;
+               new_batch = max(1UL, new_high / 4);
+               if ((new_high / 4) > (PAGE_SHIFT * 8))
+                       new_batch = PAGE_SHIFT * 8;
+       } else {
+               new_batch = zone_batchsize(zone);
+               new_high = 6 * new_batch;
+               new_batch = max(1UL, 1 * new_batch);
+       }
+       pageset_update(&p->pcp, new_high, new_batch);
 }
 
 static void __meminit zone_pageset_init(struct zone *zone, int cpu)
-- 
2.28.0

Reply via email to