From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754982AbdESQ7X (ORCPT ); Fri, 19 May 2017 12:59:23 -0400 Received: from mx1.redhat.com ([209.132.183.28]:58506 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750892AbdESQ7T (ORCPT ); Fri, 19 May 2017 12:59:19 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 05C3164361 Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=jglisse@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 05C3164361 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= To: , linux-mm@kvack.org Cc: =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , "Kirill A. Shutemov" , Andrew Morton , Ingo Molnar , Michal Hocko , Mel Gorman Subject: [PATCH] x86/mm: synchronize pgd in vmemmap_free() Date: Fri, 19 May 2017 14:01:27 -0400 Message-Id: <1495216887-3175-2-git-send-email-jglisse@redhat.com> In-Reply-To: <1495216887-3175-1-git-send-email-jglisse@redhat.com> References: <1495216887-3175-1-git-send-email-jglisse@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Fri, 19 May 2017 16:58:31 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When we free kernel virtual map we should synchronize p4d/pud for all the pgds to avoid any stall entry in non canonical pgd. Signed-off-by: Jérôme Glisse Cc: Kirill A. Shutemov Cc: Andrew Morton Cc: Ingo Molnar Cc: Michal Hocko Cc: Mel Gorman --- arch/x86/mm/init_64.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index ff95fe8..df753f8 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c @@ -108,8 +108,6 @@ void sync_global_pgds(unsigned long start, unsigned long end) BUILD_BUG_ON(pgd_none(*pgd_ref)); p4d_ref = p4d_offset(pgd_ref, address); - if (p4d_none(*p4d_ref)) - continue; spin_lock(&pgd_lock); list_for_each_entry(page, &pgd_list, lru) { @@ -123,12 +121,16 @@ void sync_global_pgds(unsigned long start, unsigned long end) pgt_lock = &pgd_page_get_mm(page)->page_table_lock; spin_lock(pgt_lock); - if (!p4d_none(*p4d_ref) && !p4d_none(*p4d)) - BUG_ON(p4d_page_vaddr(*p4d) - != p4d_page_vaddr(*p4d_ref)); - - if (p4d_none(*p4d)) + if (p4d_none(*p4d_ref)) { set_p4d(p4d, *p4d_ref); + } else { + if (!p4d_none(*p4d_ref) && !p4d_none(*p4d)) + BUG_ON(p4d_page_vaddr(*p4d) + != p4d_page_vaddr(*p4d_ref)); + + if (p4d_none(*p4d)) + set_p4d(p4d, *p4d_ref); + } spin_unlock(pgt_lock); } @@ -1024,6 +1026,7 @@ remove_pagetable(unsigned long start, unsigned long end, bool direct) void __ref vmemmap_free(unsigned long start, unsigned long end) { remove_pagetable(start, end, false); + sync_global_pgds(start, end - 1); } #ifdef CONFIG_MEMORY_HOTREMOVE -- 2.4.11