The patch titled Subject: mm/page_alloc: disassociate the pcp->high from pcp->batch -fix has been removed from the -mm tree. Its filename was mm-page_alloc-disassociate-the-pcp-high-from-pcp-batch-fix-2.patch This patch was dropped because it was folded into mm-page_alloc-disassociate-the-pcp-high-from-pcp-batch.patch ------------------------------------------------------ From: Mel Gorman <mgorman@xxxxxxxxxxxxxxxxxxx> Subject: mm/page_alloc: disassociate the pcp->high from pcp->batch -fix Vlastimil Babka noted that __setup_per_zone_wmarks updating pcp->high did not protect watermark-related sysctl handlers from a parallel memory hotplug operations. This patch moves the PCP update to setup_per_zone_wmarks and updates the PCP high value while protected by the pcp_batch_high_lock mutex. As a side-effect, the zone_pcp_update calls during memory hotplug operations becomes redundant and can be removed. This is a fix to the mmotm patch mm-page_alloc-disassociate-the-pcp-high-from-pcp-batch.patch. It'll cause a conflict with mm-page_alloc-adjust-pcp-high-after-cpu-hotplug-events.patch but the resolution is simple as the zone_pcp_update callers in setup_per_zone_wmarks no longer exist. Link: https://lkml.kernel.org/r/20210528105925.GN30378@xxxxxxxxxxxxxxxxxxx Signed-off-by: Mel Gorman <mgorman@xxxxxxxxxxxxxxxxxxx> Acked-by: Vlastimil Babka <vbabka@xxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- mm/memory_hotplug.c | 6 +++--- mm/page_alloc.c | 14 ++++++++------ 2 files changed, 11 insertions(+), 9 deletions(-) --- a/mm/memory_hotplug.c~mm-page_alloc-disassociate-the-pcp-high-from-pcp-batch-fix-2 +++ a/mm/memory_hotplug.c @@ -961,7 +961,6 @@ int __ref online_pages(unsigned long pfn node_states_set_node(nid, &arg); if (need_zonelists_rebuild) build_all_zonelists(NULL); - zone_pcp_update(zone); /* Basic onlining is complete, allow allocation of onlined pages. */ undo_isolate_page_range(pfn, pfn + nr_pages, MIGRATE_MOVABLE); @@ -974,6 +973,7 @@ int __ref online_pages(unsigned long pfn */ shuffle_zone(zone); + /* reinitialise watermarks and update pcp limits */ init_per_zone_wmark_min(); kswapd_run(nid); @@ -1829,13 +1829,13 @@ int __ref offline_pages(unsigned long st adjust_managed_page_count(pfn_to_page(start_pfn), -nr_pages); adjust_present_page_count(zone, -nr_pages); + /* reinitialise watermarks and update pcp limits */ init_per_zone_wmark_min(); if (!populated_zone(zone)) { zone_pcp_reset(zone); build_all_zonelists(NULL); - } else - zone_pcp_update(zone); + } node_states_clear_node(node, &arg); if (arg.status_change_nid >= 0) { --- a/mm/page_alloc.c~mm-page_alloc-disassociate-the-pcp-high-from-pcp-batch-fix-2 +++ a/mm/page_alloc.c @@ -8224,12 +8224,6 @@ static void __setup_per_zone_wmarks(void zone->_watermark[WMARK_LOW] = min_wmark_pages(zone) + tmp; zone->_watermark[WMARK_HIGH] = min_wmark_pages(zone) + tmp * 2; - /* - * The watermark size have changed so update the pcpu batch - * and high limits or the limits may be inappropriate. - */ - zone_set_pageset_high_and_batch(zone); - spin_unlock_irqrestore(&zone->lock, flags); } @@ -8246,11 +8240,19 @@ static void __setup_per_zone_wmarks(void */ void setup_per_zone_wmarks(void) { + struct zone *zone; static DEFINE_SPINLOCK(lock); spin_lock(&lock); __setup_per_zone_wmarks(); spin_unlock(&lock); + + /* + * The watermark size have changed so update the pcpu batch + * and high limits or the limits may be inappropriate. + */ + for_each_zone(zone) + zone_pcp_update(zone); } /* _ Patches currently in -mm which might be from mgorman@xxxxxxxxxxxxxxxxxxx are mm-page_alloc-correct-return-value-of-populated-elements-if-bulk-array-is-populated.patch mm-page_alloc-split-per-cpu-page-lists-and-zone-stats.patch mm-page_alloc-convert-per-cpu-list-protection-to-local_lock.patch mm-vmstat-convert-numa-statistics-to-basic-numa-counters.patch mm-vmstat-inline-numa-event-counter-updates.patch mm-page_alloc-batch-the-accounting-updates-in-the-bulk-allocator.patch mm-page_alloc-reduce-duration-that-irqs-are-disabled-for-vm-counters.patch mm-page_alloc-explicitly-acquire-the-zone-lock-in-__free_pages_ok.patch mm-page_alloc-avoid-conflating-irqs-disabled-with-zone-lock.patch mm-page_alloc-update-pgfree-outside-the-zone-lock-in-__free_pages_ok.patch mm-page_alloc-delete-vmpercpu_pagelist_fraction.patch mm-page_alloc-disassociate-the-pcp-high-from-pcp-batch.patch mm-page_alloc-adjust-pcp-high-after-cpu-hotplug-events.patch mm-page_alloc-scale-the-number-of-pages-that-are-batch-freed.patch mm-page_alloc-limit-the-number-of-pages-on-pcp-lists-when-reclaim-is-active.patch mm-page_alloc-introduce-vmpercpu_pagelist_high_fraction.patch mm-page_alloc-introduce-vmpercpu_pagelist_high_fraction-fix.patch mm-page_alloc-move-free_the_page.patch mm-page_alloc-allow-high-order-pages-to-be-stored-on-the-per-cpu-lists.patch mm-page_alloc-split-pcp-high-across-all-online-cpus-for-cpuless-nodes.patch mm-vmscan-remove-kerneldoc-like-comment-from-isolate_lru_pages.patch mm-vmalloc-include-header-for-prototype-of-set_iounmap_nonlazy.patch mm-page_alloc-make-should_fail_alloc_page-a-static-function-should_fail_alloc_page-static.patch mm-mapping_dirty_helpers-remove-double-note-in-kerneldoc.patch mm-memcontrolc-fix-kerneldoc-comment-for-mem_cgroup_calculate_protection.patch mm-memory_hotplug-fix-kerneldoc-comment-for-__try_online_node.patch mm-memory_hotplug-fix-kerneldoc-comment-for-__remove_memory.patch mm-zbud-add-kerneldoc-fields-for-zbud_pool.patch mm-z3fold-add-kerneldoc-fields-for-z3fold_pool.patch mm-swap-make-swap_address_space-an-inline-function.patch mm-mmap_lock-remove-dead-code-for-config_tracing-configurations.patch mm-page_alloc-move-prototype-for-find_suitable_fallback.patch mm-swap-make-node_data-an-inline-function-on-config_flatmem.patch