Received: by 10.192.165.148 with SMTP id m20csp762911imm; Fri, 20 Apr 2018 15:28:27 -0700 (PDT) X-Google-Smtp-Source: AIpwx4+ufCLzkJAtlCaZi906QhQlSuEK/GEjf0A9/QMZId2ies6ij0KFjuiNGQmmmIwd0ec4xz14 X-Received: by 2002:a17:902:b203:: with SMTP id t3-v6mr11991198plr.171.1524263307917; Fri, 20 Apr 2018 15:28:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524263307; cv=none; d=google.com; s=arc-20160816; b=RTE31v7Z3KDyurdHKL36D2NYj/FlqNAB+7p2mIiQdw5Ebg8QTLolfGUxLXUI88XCIY gvxQHfoTWTp5wJ2FHYAXENb4PlQi1Lbw3sCfWD7Eu1NsLrYqyF9J0ErzOmI/GAJJkmcZ zIbJg8x4yKK1Ljor5ZePQfgTfqfvgr20bihDnlPtp8GaFb97ZoAffBevXXyKJnO1RzGB N/U7wzoRlGtWZ360zaIFKTO2enbIUtWJ9tOXYgbT0MHMo0wwRgen2Bh8udBEy0ns0USc Xqss21Qi3zKAye5ZgNKPobx0Lc5fwRChL9a+pWHaIyYVIsRiIMF6JAtPohirOw500vKN vNHg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:in-reply-to:references:date :from:cc:to:subject:arc-authentication-results; bh=ZoDlV98xxnhfdh+wkeXiDLhckcvHR8v7Y94WNfUUPxo=; b=E0CZuRbT3v1fPlbFwbJ0HCnPaEMFEtsrSPIUUMRRhufhZK6bPqaNbUDsrGMgE1+N/N 4S1Wc0cNLTxRS6UF6v2b/VF/XVZQpqXDtacXPyKk3C7STqgVtiKe2FVTly97DKKCEg09 WBvYqyRBB2r80vBoKFzZiJ1q8M4c2551mXi/ym/XYkiWWeMuMZj3iDzpwaLY778OYHNv HVYUfX9RaO5rmPyku+kSCJJbmdnnEVsBhwpIsihaNA8xhwxdHS+ZbbAg/h6TnLPn9ZDD /t95exsFL5NMrHYIDWOEg7feoJF/DsKNBPdS8nkvboH4BZemFaKjuXr4aK86JOg6B5SJ Hjkw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v15si2690494pfn.366.2018.04.20.15.27.50; Fri, 20 Apr 2018 15:28:27 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753087AbeDTWYT (ORCPT + 99 others); Fri, 20 Apr 2018 18:24:19 -0400 Received: from mga05.intel.com ([192.55.52.43]:60778 "EHLO mga05.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751227AbeDTWYO (ORCPT ); Fri, 20 Apr 2018 18:24:14 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 20 Apr 2018 15:24:13 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.49,303,1520924400"; d="scan'208";a="222137282" Received: from viggo.jf.intel.com (HELO localhost.localdomain) ([10.54.39.119]) by fmsmga006.fm.intel.com with ESMTP; 20 Apr 2018 15:24:12 -0700 Subject: [PATCH 2/5] x86, pti: fix boot warning from Global-bit setting To: linux-kernel@vger.kernel.org Cc: linux-mm@kvack.org, Dave Hansen , mceier@gmail.com, aaro.koskinen@nokia.com, aarcange@redhat.com, luto@kernel.org, arjan@linux.intel.com, bp@alien8.de, dan.j.williams@intel.com, dwmw2@infradead.org, gregkh@linuxfoundation.org, hughd@google.com, jpoimboe@redhat.com, jgross@suse.com, keescook@google.com, torvalds@linux-foundation.org, namit@vmware.com, peterz@infradead.org, tglx@linutronix.de From: Dave Hansen Date: Fri, 20 Apr 2018 15:20:21 -0700 References: <20180420222018.E7646EE1@viggo.jf.intel.com> In-Reply-To: <20180420222018.E7646EE1@viggo.jf.intel.com> Message-Id: <20180420222021.1C7D2B3F@viggo.jf.intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Dave Hansen The pageattr.c code attempts to process "faults" when it goes looking for PTEs to change and finds non-present entries. It allows these faults in the linear map which is "expected to have holes", but WARN()s about them elsewhere, like when called on the kernel image. However, we are now calling change_page_attr_clear() on the kernel image in the process of trying to clear the Global bit. This trips the warning in __cpa_process_fault() if a non-present PTE is encountered in the kernel image. The "holes" in the kernel image result from free_init_pages()'s use of set_memory_np(). These holes are totally fine, and result from normal operation, just as they would be in the kernel linear map. Just silence the warning when holes in the kernel image are encountered. Signed-off-by: Dave Hansen Fixes: 39114b7a7 (x86/pti: Never implicitly clear _PAGE_GLOBAL for kernel image) Reported-by: Mariusz Ceier Reported-by: Aaro Koskinen Cc: Andrea Arcangeli Cc: Andy Lutomirski Cc: Arjan van de Ven Cc: Borislav Petkov Cc: Dan Williams Cc: David Woodhouse Cc: Greg Kroah-Hartman Cc: Hugh Dickins Cc: Josh Poimboeuf Cc: Juergen Gross Cc: Kees Cook Cc: Linus Torvalds Cc: Nadav Amit Cc: Peter Zijlstra Cc: Thomas Gleixner Cc: linux-mm@kvack.org --- b/arch/x86/mm/pageattr.c | 41 +++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) diff -puN arch/x86/mm/pageattr.c~pti-glb-warning-inpageattr arch/x86/mm/pageattr.c --- a/arch/x86/mm/pageattr.c~pti-glb-warning-inpageattr 2018-04-20 14:10:01.619749168 -0700 +++ b/arch/x86/mm/pageattr.c 2018-04-20 14:10:01.623749168 -0700 @@ -93,6 +93,18 @@ void arch_report_meminfo(struct seq_file static inline void split_page_count(int level) { } #endif +static inline int +within(unsigned long addr, unsigned long start, unsigned long end) +{ + return addr >= start && addr < end; +} + +static inline int +within_inclusive(unsigned long addr, unsigned long start, unsigned long end) +{ + return addr >= start && addr <= end; +} + #ifdef CONFIG_X86_64 static inline unsigned long highmap_start_pfn(void) @@ -106,20 +118,26 @@ static inline unsigned long highmap_end_ return __pa_symbol(roundup(_brk_end, PMD_SIZE) - 1) >> PAGE_SHIFT; } -#endif - -static inline int -within(unsigned long addr, unsigned long start, unsigned long end) +static bool __cpa_pfn_in_highmap(unsigned long pfn) { - return addr >= start && addr < end; + /* + * Kernel text has an alias mapping at a high address, known + * here as "highmap". + */ + return within_inclusive(pfn, highmap_start_pfn(), + highmap_end_pfn()); } -static inline int -within_inclusive(unsigned long addr, unsigned long start, unsigned long end) +#else + +static bool __cpa_pfn_in_highmap(unsigned long pfn) { - return addr >= start && addr <= end; + /* There is no highmap on 32-bit */ + return false; } +#endif + /* * Flushing functions */ @@ -1183,6 +1201,10 @@ static int __cpa_process_fault(struct cp cpa->numpages = 1; cpa->pfn = __pa(vaddr) >> PAGE_SHIFT; return 0; + + } else if (__cpa_pfn_in_highmap(cpa->pfn)) { + /* Faults in the highmap are OK, so do not warn: */ + return -EFAULT; } else { WARN(1, KERN_WARNING "CPA: called for zero pte. " "vaddr = %lx cpa->vaddr = %lx\n", vaddr, @@ -1335,8 +1357,7 @@ static int cpa_process_alias(struct cpa_ * to touch the high mapped kernel as well: */ if (!within(vaddr, (unsigned long)_text, _brk_end) && - within_inclusive(cpa->pfn, highmap_start_pfn(), - highmap_end_pfn())) { + __cpa_pfn_in_highmap(cpa->pfn)) { unsigned long temp_cpa_vaddr = (cpa->pfn << PAGE_SHIFT) + __START_KERNEL_map - phys_base; alias_cpa = *cpa; _