mm/memory_hotplug: remove broken locking of zone PCP structures during hot remove
zone_pcp_reset allegedly protects against a race with drain_pages using local_irq_save but this is bogus. local_irq_save only operates on the local CPU. If memory hotplug is running on CPU A and drain_pages is running on CPU B, disabling IRQs on CPU A does not affect CPU B and offers no protection. This patch deletes IRQ disable/enable on the grounds that IRQs protect nothing and assumes the existing hotplug paths guarantees the PCP cannot be used after zone_pcp_enable(). That should be the case already because all the pages have been freed and there is no page to put on the PCP lists. Link: https://lkml.kernel.org/r/20210412090346.GQ3697@techsingularity.net Signed-off-by: Mel Gorman <mgorman@techsingularity.net> Acked-by: Michal Hocko <mhocko@suse.com> Reviewed-by: Oscar Salvador <osalvador@suse.de> Cc: "Michael S. Tsirkin" <mst@redhat.com> Cc: Vlastimil Babka <vbabka@suse.cz> Cc: Alexander Duyck <alexander.h.duyck@linux.intel.com> Cc: Minchan Kim <minchan@kernel.org> Cc: David Hildenbrand <david@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
e44605a8b1
commit
8ca559132a
|
@ -9020,12 +9020,9 @@ void zone_pcp_enable(struct zone *zone)
|
|||
|
||||
void zone_pcp_reset(struct zone *zone)
|
||||
{
|
||||
unsigned long flags;
|
||||
int cpu;
|
||||
struct per_cpu_pageset *pset;
|
||||
|
||||
/* avoid races with drain_pages() */
|
||||
local_irq_save(flags);
|
||||
if (zone->pageset != &boot_pageset) {
|
||||
for_each_online_cpu(cpu) {
|
||||
pset = per_cpu_ptr(zone->pageset, cpu);
|
||||
|
@ -9034,7 +9031,6 @@ void zone_pcp_reset(struct zone *zone)
|
|||
free_percpu(zone->pageset);
|
||||
zone->pageset = &boot_pageset;
|
||||
}
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MEMORY_HOTREMOVE
|
||||
|
|
Loading…
Reference in New Issue