All of lore.kernel.org
 help / color / mirror / Atom feed
* [patch 036/119] mm, page_alloc: remove stop_machine from build_all_zonelists
@ 2017-09-06 23:20 akpm
  0 siblings, 0 replies; only message in thread
From: akpm @ 2017-09-06 23:20 UTC (permalink / raw)
  To: akpm, hannes, js1304, mgorman, mhocko, mm-commits, shaohua.li,
	tglx, torvalds, toshi.kani, vbabka

From: Michal Hocko <mhocko@suse.com>
Subject: mm, page_alloc: remove stop_machine from build_all_zonelists

build_all_zonelists has been (ab)using stop_machine to make sure that
zonelists do not change while somebody is looking at them.  This is is
just a gross hack because a) it complicates the context from which we can
call build_all_zonelists (see 3f906ba23689 ("mm/memory-hotplug: switch
locking to a percpu rwsem")) and b) is is not really necessary especially
after "mm, page_alloc: simplify zonelist initialization" and c) it doesn't
really provide the protection it claims (see below).

Updates of the zonelists happen very seldom, basically only when a zone
becomes populated during memory online or when it loses all the memory
during offline.  A racing iteration over zonelists could either miss a
zone or try to work on one zone twice.  Both of these are something we can
live with occasionally because there will always be at least one zone
visible so we are not likely to fail allocation too easily for example.

Please note that the original stop_machine approach doesn't really provide
a better exclusion because the iteration might be interrupted half way
(unless the whole iteration is preempt disabled which is not the case in
most cases) so the some zones could still be seen twice or a zone missed.

I have run the pathological online/offline of the single memblock in the
movable zone while stressing the same small node with some memory
pressure.

Node 1, zone      DMA
  pages free     0
        min      0
        low      0
        high     0
        spanned  0
        present  0
        managed  0
        protection: (0, 943, 943, 943)
Node 1, zone    DMA32
  pages free     227310
        min      8294
        low      10367
        high     12440
        spanned  262112
        present  262112
        managed  241436
        protection: (0, 0, 0, 0)
Node 1, zone   Normal
  pages free     0
        min      0
        low      0
        high     0
        spanned  0
        present  0
        managed  0
        protection: (0, 0, 0, 1024)
Node 1, zone  Movable
  pages free     32722
        min      85
        low      117
        high     149
        spanned  32768
        present  32768
        managed  32768
        protection: (0, 0, 0, 0)

root@test1:/sys/devices/system/node/node1# while true
do
	echo offline > memory34/state
	echo online_movable > memory34/state
done

root@test1:/mnt/data/test/linux-3.7-rc5# numactl --preferred=1 make -j4

and it survived without any unexpected behavior.  While this is not really
a great testing coverage it should exercise the allocation path quite a
lot.

Link: http://lkml.kernel.org/r/20170721143915.14161-8-mhocko@kernel.org
Signed-off-by: Michal Hocko <mhocko@suse.com>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Joonsoo Kim <js1304@gmail.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Shaohua Li <shaohua.li@intel.com>
Cc: Toshi Kani <toshi.kani@hpe.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---

 mm/page_alloc.c |    9 ++-------
 1 file changed, 2 insertions(+), 7 deletions(-)

diff -puN mm/page_alloc.c~mm-page_alloc-remove-stop_machine-from-build_all_zonelists mm/page_alloc.c
--- a/mm/page_alloc.c~mm-page_alloc-remove-stop_machine-from-build_all_zonelists
+++ a/mm/page_alloc.c
@@ -5137,8 +5137,7 @@ static DEFINE_PER_CPU(struct per_cpu_nod
  */
 DEFINE_MUTEX(zonelists_mutex);
 
-/* return values int ....just for stop_machine() */
-static int __build_all_zonelists(void *data)
+static void __build_all_zonelists(void *data)
 {
 	int nid;
 	int __maybe_unused cpu;
@@ -5174,8 +5173,6 @@ static int __build_all_zonelists(void *d
 			set_cpu_numa_mem(cpu, local_memory_node(cpu_to_node(cpu)));
 #endif
 	}

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2017-09-06 23:20 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-09-06 23:20 [patch 036/119] mm, page_alloc: remove stop_machine from build_all_zonelists akpm

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.