From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: David Hildenbrand Subject: [PATCH v1 5/9] s390/vmemmap: take the vmem_mutex when populating/freeing Date: Fri, 3 Jul 2020 15:39:13 +0200 Message-Id: <20200703133917.39045-6-david@redhat.com> In-Reply-To: <20200703133917.39045-1-david@redhat.com> References: <20200703133917.39045-1-david@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: To: linux-kernel@vger.kernel.org Cc: linux-s390@vger.kernel.org, linux-mm@kvack.org, David Hildenbrand , Heiko Carstens , Vasily Gorbik , Christian Borntraeger , Gerald Schaefer Let's synchronize all accesses to the 1:1 and vmemmap mappings. This will be especially relevant when wanting to cleanup empty page tables that could be shared by both. Avoid races when removing tables that might be just about to get reused. Cc: Heiko Carstens Cc: Vasily Gorbik Cc: Christian Borntraeger Cc: Gerald Schaefer Signed-off-by: David Hildenbrand --- arch/s390/mm/vmem.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/arch/s390/mm/vmem.c b/arch/s390/mm/vmem.c index bcddabd509da8..aa968f67d7f9f 100644 --- a/arch/s390/mm/vmem.c +++ b/arch/s390/mm/vmem.c @@ -293,6 +293,7 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node, pte_t *pt_dir; int ret = -ENOMEM; + mutex_lock(&vmem_mutex); pgt_prot = pgprot_val(PAGE_KERNEL); sgt_prot = pgprot_val(SEGMENT_KERNEL); if (!MACHINE_HAS_NX) { @@ -364,6 +365,7 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node, } ret = 0; out: + mutex_unlock(&vmem_mutex); if (ret) vmemmap_free(start, end, altmap); return ret; @@ -372,7 +374,9 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node, void vmemmap_free(unsigned long start, unsigned long end, struct vmem_altmap *altmap) { + mutex_lock(&vmem_mutex); remove_pagetable(start, end, false); + mutex_unlock(&vmem_mutex); } void vmem_remove_mapping(unsigned long start, unsigned long size) -- 2.26.2