FAILED: patch "[PATCH] powerpc: Chunk calls to flush_dcache_range in arch_*_memory" failed to apply to 4.19-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 076265907cf9633bbef861c7c2a1c26a8209f283 Mon Sep 17 00:00:00 2001
From: Alastair D'Silva <[email protected]>
Date: Mon, 4 Nov 2019 13:32:57 +1100
Subject: [PATCH] powerpc: Chunk calls to flush_dcache_range in arch_*_memory
When presented with large amounts of memory being hotplugged (in my test case, ~890GB), the call to flush_dcache_range takes a while (~50 seconds), triggering RCU stalls.
This patch breaks up the call into 1GB chunks, calling cond_resched() inbetween to allow the scheduler to run.
arch/powerpc/mm/mem.c +25 -2
@@ -104,6 +104,27 @@ int __weak remove_section_mapping(unsigned long start, unsigned long end)return -ENODEV ; } +#define FLUSH_CHUNK_SIZE SZ_1G +/** +* flush_dcache_range_chunked(): Write any modified data cache blocks out to +* memory and invalidate them, in chunks of up to FLUSH_CHUNK_SIZE +* Does not invalidate the corresponding instruction cache blocks. +* +* @start: the start address +* @stop: the stop address (exclusive) +* @chunk: the max size of the chunks +*/ +static void flush_dcache_range_chunked (unsigned long start,unsigned long stop, +unsigned long chunk) +{ +unsigned long i; + +for (i = start; i < stop; i += chunk) { +flush_dcache_range (i,min (stop, start + chunk)); +cond_resched (); + } +} +int __ref arch_add_memory (int nid,u64 start,u64 size,struct mhp_restrictions *restrictions) {
@@ -120,7 +141,8 @@ int __ref arch_add_memory(int nid, u64 start, u64 size, start, start + size, rc);return -EFAULT ; } -flush_dcache_range (start, start + size); + +flush_dcache_range_chunked (start, start + size,FLUSH_CHUNK_SIZE );return __add_pages (nid, start_pfn, nr_pages, restrictions); }
@@ -137,7 +159,8 @@ void __ref arch_remove_memory(int nid, u64 start, u64 size,/* Remove htab bolted mappings for this section of memory */ start = (unsigned long )__va (start); -flush_dcache_range (start, start + size); +flush_dcache_range_chunked (start, start + size,FLUSH_CHUNK_SIZE ); + ret =remove_section_mapping (start, start + size);WARN_ON_ONCE (ret);