linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Vlastimil Babka <vbabka@suse.cz>
To: linux-mm@kvack.org
Cc: linux-kernel@vger.kernel.org, Michal Hocko <mhocko@kernel.org>,
	Pavel Tatashin <pasha.tatashin@soleen.com>,
	David Hildenbrand <david@redhat.com>,
	Oscar Salvador <osalvador@suse.de>,
	Joonsoo Kim <iamjoonsoo.kim@lge.com>,
	Vlastimil Babka <vbabka@suse.cz>
Subject: [PATCH 5/9] mm, page_alloc: make per_cpu_pageset accessible only after init
Date: Tue, 22 Sep 2020 16:37:08 +0200	[thread overview]
Message-ID: <20200922143712.12048-6-vbabka@suse.cz> (raw)
In-Reply-To: <20200922143712.12048-1-vbabka@suse.cz>

setup_zone_pageset() replaces the boot_pageset by allocating and initializing a
proper percpu one. Currently it assigns zone->pageset with the newly allocated
one before initializing it. That's currently not an issue, because the zone
should not be in any zonelist, thus not visible to allocators at this point.

Memory ordering between the pcplist contents and its visibility is also not
guaranteed here, but that also shouldn't be an issue because online_pages()
does a spin_unlock(pgdat->node_size_lock) before building the zonelists.

However it's best that we don't silently rely on operations that can be changed
in the future. Make sure only properly initialized pcplists are visible, using
smp_store_release(). The read side has a data dependency via the zone->pageset
pointer instead of an explicit read barrier.

Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
---
 mm/page_alloc.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 99b74c1c2b0a..de3b48bda45c 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -6246,15 +6246,17 @@ static void zone_set_pageset_high_and_batch(struct zone *zone)
 
 void __meminit setup_zone_pageset(struct zone *zone)
 {
+	struct per_cpu_pageset __percpu * new_pageset;
 	struct per_cpu_pageset *p;
 	int cpu;
 
-	zone->pageset = alloc_percpu(struct per_cpu_pageset);
+	new_pageset = alloc_percpu(struct per_cpu_pageset);
 	for_each_possible_cpu(cpu) {
-		p = per_cpu_ptr(zone->pageset, cpu);
+		p = per_cpu_ptr(new_pageset, cpu);
 		pageset_init(p);
 	}
 
+	smp_store_release(&zone->pageset, new_pageset);
 	zone_set_pageset_high_and_batch(zone);
 }
 
-- 
2.28.0


  parent reply	other threads:[~2020-09-22 14:37 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-22 14:37 [PATCH 0/9] disable pcplists during memory offline Vlastimil Babka
2020-09-22 14:37 ` [PATCH 1/9] mm, page_alloc: clean up pageset high and batch update Vlastimil Babka
2020-09-25 10:18   ` David Hildenbrand
2020-10-05 12:03   ` Michal Hocko
2020-09-22 14:37 ` [PATCH 2/9] mm, page_alloc: calculate pageset high and batch once per zone Vlastimil Babka
2020-10-05 12:52   ` Michal Hocko
2020-10-06 22:04     ` Vlastimil Babka
2020-09-22 14:37 ` [PATCH 3/9] mm, page_alloc: remove setup_pageset() Vlastimil Babka
2020-09-25 10:19   ` David Hildenbrand
2020-10-05 12:59   ` Michal Hocko
2020-10-06 22:11     ` Vlastimil Babka
2020-09-22 14:37 ` [PATCH 4/9] mm, page_alloc: simplify pageset_update() Vlastimil Babka
2020-09-25 10:23   ` David Hildenbrand
2020-10-05 13:20   ` Michal Hocko
2020-09-22 14:37 ` Vlastimil Babka [this message]
2020-09-25 10:25   ` [PATCH 5/9] mm, page_alloc: make per_cpu_pageset accessible only after init David Hildenbrand
2020-10-05 13:24   ` Michal Hocko
2020-10-06 22:28     ` Vlastimil Babka
2020-09-22 14:37 ` [PATCH 6/9] mm, page_alloc: cache pageset high and batch in struct zone Vlastimil Babka
2020-09-25 10:34   ` David Hildenbrand
2020-10-06 22:31     ` Vlastimil Babka
2020-10-05 13:28   ` Michal Hocko
2020-10-06 22:34     ` Vlastimil Babka
2020-09-22 14:37 ` [PATCH 7/9] mm, page_alloc: move draining pcplists to page isolation users Vlastimil Babka
2020-09-25 10:39   ` David Hildenbrand
2020-10-05 13:57   ` Michal Hocko
2020-09-22 14:37 ` [PATCH 8/9] mm, page_alloc: drain all pcplists during memory offline Vlastimil Babka
2020-09-25 10:46   ` David Hildenbrand
2020-10-05 14:03     ` Michal Hocko
2020-09-22 14:37 ` [PATCH 9/9] mm, page_alloc: optionally disable pcplists during page isolation Vlastimil Babka
2020-09-25 10:53   ` David Hildenbrand
2020-09-25 10:54     ` David Hildenbrand
2020-09-25 11:10       ` Vlastimil Babka
2020-10-01  8:47         ` David Hildenbrand
2020-10-05 14:05         ` Michal Hocko
2020-10-05 14:22           ` Vlastimil Babka
2020-10-05 16:56             ` Michal Hocko
2020-10-06  8:34   ` Michal Hocko
2020-10-06  8:40     ` David Hildenbrand
2020-10-06 10:05       ` Michal Hocko
2020-09-22 17:15 ` [PATCH 0/9] disable pcplists during memory offline David Hildenbrand

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200922143712.12048-6-vbabka@suse.cz \
    --to=vbabka@suse.cz \
    --cc=david@redhat.com \
    --cc=iamjoonsoo.kim@lge.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mhocko@kernel.org \
    --cc=osalvador@suse.de \
    --cc=pasha.tatashin@soleen.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).