Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757700AbcDELJx (ORCPT ); Tue, 5 Apr 2016 07:09:53 -0400 Received: from mx2.suse.de ([195.135.220.15]:58785 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755228AbcDELJv (ORCPT ); Tue, 5 Apr 2016 07:09:51 -0400 Date: Tue, 5 Apr 2016 13:09:47 +0200 From: Borislav Petkov To: Toshi Kani Cc: mingo@kernel.org, hpa@zytor.com, tglx@linutronix.de, ying.huang@linux.intel.com, x86@kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] x86/mm/pat: Fix BUG_ON in mmap_mem on QEMU/i386 Message-ID: <20160405110947.GB10109@pd.tnic> References: <1459549185-14911-1-git-send-email-toshi.kani@hpe.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1459549185-14911-1-git-send-email-toshi.kani@hpe.com> User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2606 Lines: 86 On Fri, Apr 01, 2016 at 04:19:45PM -0600, Toshi Kani wrote: > The following BUG_ON error was reported on QEMU/i386: > > kernel BUG at arch/x86/mm/physaddr.c:79! > Call Trace: > phys_mem_access_prot_allowed > mmap_mem > ? mmap_region > mmap_region > do_mmap > vm_mmap_pgoff > SyS_mmap_pgoff > do_int80_syscall_32 > entry_INT80_32 > > after commit edfe63ec97ed ("x86/mtrr: Fix Xorg crashes in Qemu > sessions"). > > PAT is now set to disabled state when MTRRs are disabled... "... thus reactivating the __pa(high_memory) check in phys_mem_access_prot_allowed()." > When the system does not have much memory, 'high_memory' points to What does "much memory" mean, exactly? > the maximum memory address + 1, which is empty. When > CONFIG_DEBUG_VIRTUAL is also set, __pa() calls __phys_addr(), which > in turn calls slow_virt_to_phys() for high_memory. Because > high_memory does not point to a valid memory address, this address > is not mapped... "... and slow_virt_to_phys() returns 0." > Hence, BUG_ON. > > Use __pa_nodebug() as the code does not expect a valid virtual > mapping for high_memory. > > Reported-by: kernel test robot > Link: https://lkml.org/lkml/2016/4/1/608 > Signed-off-by: Toshi Kani > Thomas Gleixner > Ingo Molnar > H. Peter Anvin > Borislav Petkov > --- > This patch is based on -tip. > --- > arch/x86/mm/pat.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c > index c4c3ddc..26b7202 100644 > --- a/arch/x86/mm/pat.c > +++ b/arch/x86/mm/pat.c > @@ -792,7 +792,7 @@ int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn, > boot_cpu_has(X86_FEATURE_K6_MTRR) || > boot_cpu_has(X86_FEATURE_CYRIX_ARR) || > boot_cpu_has(X86_FEATURE_CENTAUR_MCR)) && > - (pfn << PAGE_SHIFT) >= __pa(high_memory)) { > + (pfn << PAGE_SHIFT) >= __pa_nodebug(high_memory)) { > pcm = _PAGE_CACHE_MODE_UC; > } > #endif Modulo the minor formulations issues above, Reviewed-by: Borislav Petkov AFAIU, it makes sense to do the "nodebug" check here anyway - we basically only want to *check* the address and if outside of available memory, map UC. We shouldn't be exploding just because we're checking. But this is just me, someone should doublecheck this train of thought for sanity. Thanks. -- Regards/Gruss, Boris. SUSE Linux GmbH, GF: Felix Imendörffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nürnberg) --