Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp4368744pxj; Tue, 8 Jun 2021 12:35:31 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzenbfiuJbG4aDVpiVszy9gDpqGZRYN9TW9Zjeb1267XLvp1KQD1Ep1oTupguxtrST/I15W X-Received: by 2002:a05:6402:b76:: with SMTP id cb22mr27394915edb.112.1623180931191; Tue, 08 Jun 2021 12:35:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623180931; cv=none; d=google.com; s=arc-20160816; b=Emtt747xDVyaP4W5V8GquoS+Ky7Uo68O1Or0YaxEf8n7Fa+dfcI6j5wNAf3bBOcfKs 8ToSHd4z1uC+7VsNNYu6v7VbrnP0dUh2PWKTLzqIDP5yAngC5Knck9Zzg/Lgg3/NlEcJ PRXEwlEYUZTj0Y4AusA+n8PVPbX2OLszLzk9+Xeo07nxJcXeW6I0dcBt4cDmEIASra8s M0WVZt46gF4Ame1yvzRryp1QbwsOzsIASinEupx6KO4B0SThayp7RAC1cLkfVrTaovtO IQtykwVOHRvndqdEK/qhqpU4HCclU/3G0ZQ+3zdHUAhWMyXKY6zbJt5esSy8hBoBQ5G7 UBWQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=bD0TLP0GZ+6VuFnrvUwfPl0mz7WCh/MI/SIrwOv1YJY=; b=KMwzE6cdDvomlyyBUoSa9U3Ng6XTBhfyN2QD+H/PHdxTEzxAkvi/O9X8G0fX2pSs1+ H4CMJDPsMQM0ep9zIu/AgzTGvLXyB3PHadKjvJBQkVGWU8QsPcOynbdY9O7K87Wy9ANW yjOleRHoNWiHJOw2vLNKe3+m9BXbG16YVx36+d0loh4pa+SkqMiZIc+U9eGVzCIcxOmF f4braBcKqL0RNmdF9+I3ZuCOTCzc8DdDEl5y3RN/hF29rV3VkdF056x08EucvxnW7fnt AgqmF2aVdEv2RLp3iCg8shD8uoDgph9t7JT08W7n9AI9iXX2H5BRiwDtCsGqW/OCPVs9 WCHw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=WPeUv+hz; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id qn16si500332ejb.312.2021.06.08.12.35.07; Tue, 08 Jun 2021 12:35:31 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=WPeUv+hz; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237212AbhFHTdn (ORCPT + 99 others); Tue, 8 Jun 2021 15:33:43 -0400 Received: from mail.kernel.org ([198.145.29.99]:39606 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237954AbhFHTSH (ORCPT ); Tue, 8 Jun 2021 15:18:07 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id EA1B861001; Tue, 8 Jun 2021 18:51:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1623178295; bh=9J1/dpukLuQWMaWW5TRWh50vVzgLt5AVietmdb8el2g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WPeUv+hzfos06G3tDHDeneQSXnHtZjlRbHWzFRzDq7IBwdY0XtCb8Vbcx8zbzVc9B dyEPqEuVYAvvE/JsRPmVQ87yGoCSxtSCYPuzpVJ4jRsRiNwaJTPtQtA2F6Z3Q53+yq EEO99lvJaO8TEgtRDMv53PdSNznrLEcJrQ4FGs+A= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Zhou Yanjie , Thomas Bogendoerfer , Huang Pei , Nicholas Piggin , Andrew Morton , Linus Torvalds Subject: [PATCH 5.12 122/161] Revert "MIPS: make userspace mapping young by default" Date: Tue, 8 Jun 2021 20:27:32 +0200 Message-Id: <20210608175949.567896171@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210608175945.476074951@linuxfoundation.org> References: <20210608175945.476074951@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Thomas Bogendoerfer commit 50c25ee97cf6ab011542167ab590c17012cea4ed upstream. This reverts commit f685a533a7fab35c5d069dcd663f59c8e4171a75. The MIPS cache flush logic needs to know whether the mapping was already established to decide how to flush caches. This is done by checking the valid bit in the PTE. The commit above breaks this logic by setting the valid in the PTE in new mappings, which causes kernel crashes. Link: https://lkml.kernel.org/r/20210526094335.92948-1-tsbogend@alpha.franken.de Fixes: f685a533a7f ("MIPS: make userspace mapping young by default") Reported-by: Zhou Yanjie Signed-off-by: Thomas Bogendoerfer Cc: Huang Pei Cc: Nicholas Piggin Cc: Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds Signed-off-by: Greg Kroah-Hartman --- arch/mips/mm/cache.c | 30 ++++++++++++++---------------- include/linux/pgtable.h | 8 ++++++++ mm/memory.c | 4 ++++ 3 files changed, 26 insertions(+), 16 deletions(-) --- a/arch/mips/mm/cache.c +++ b/arch/mips/mm/cache.c @@ -157,31 +157,29 @@ unsigned long _page_cachable_default; EXPORT_SYMBOL(_page_cachable_default); #define PM(p) __pgprot(_page_cachable_default | (p)) -#define PVA(p) PM(_PAGE_VALID | _PAGE_ACCESSED | (p)) static inline void setup_protection_map(void) { protection_map[0] = PM(_PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_NO_READ); - protection_map[1] = PVA(_PAGE_PRESENT | _PAGE_NO_EXEC); - protection_map[2] = PVA(_PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_NO_READ); - protection_map[3] = PVA(_PAGE_PRESENT | _PAGE_NO_EXEC); - protection_map[4] = PVA(_PAGE_PRESENT); - protection_map[5] = PVA(_PAGE_PRESENT); - protection_map[6] = PVA(_PAGE_PRESENT); - protection_map[7] = PVA(_PAGE_PRESENT); + protection_map[1] = PM(_PAGE_PRESENT | _PAGE_NO_EXEC); + protection_map[2] = PM(_PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_NO_READ); + protection_map[3] = PM(_PAGE_PRESENT | _PAGE_NO_EXEC); + protection_map[4] = PM(_PAGE_PRESENT); + protection_map[5] = PM(_PAGE_PRESENT); + protection_map[6] = PM(_PAGE_PRESENT); + protection_map[7] = PM(_PAGE_PRESENT); protection_map[8] = PM(_PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_NO_READ); - protection_map[9] = PVA(_PAGE_PRESENT | _PAGE_NO_EXEC); - protection_map[10] = PVA(_PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_WRITE | + protection_map[9] = PM(_PAGE_PRESENT | _PAGE_NO_EXEC); + protection_map[10] = PM(_PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_WRITE | _PAGE_NO_READ); - protection_map[11] = PVA(_PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_WRITE); - protection_map[12] = PVA(_PAGE_PRESENT); - protection_map[13] = PVA(_PAGE_PRESENT); - protection_map[14] = PVA(_PAGE_PRESENT); - protection_map[15] = PVA(_PAGE_PRESENT); + protection_map[11] = PM(_PAGE_PRESENT | _PAGE_NO_EXEC | _PAGE_WRITE); + protection_map[12] = PM(_PAGE_PRESENT); + protection_map[13] = PM(_PAGE_PRESENT); + protection_map[14] = PM(_PAGE_PRESENT | _PAGE_WRITE); + protection_map[15] = PM(_PAGE_PRESENT | _PAGE_WRITE); } -#undef _PVA #undef PM void cpu_cache_init(void) --- a/include/linux/pgtable.h +++ b/include/linux/pgtable.h @@ -432,6 +432,14 @@ static inline void ptep_set_wrprotect(st * To be differentiate with macro pte_mkyoung, this macro is used on platforms * where software maintains page access bit. */ +#ifndef pte_sw_mkyoung +static inline pte_t pte_sw_mkyoung(pte_t pte) +{ + return pte; +} +#define pte_sw_mkyoung pte_sw_mkyoung +#endif + #ifndef pte_savedwrite #define pte_savedwrite pte_write #endif --- a/mm/memory.c +++ b/mm/memory.c @@ -2896,6 +2896,7 @@ static vm_fault_t wp_page_copy(struct vm } flush_cache_page(vma, vmf->address, pte_pfn(vmf->orig_pte)); entry = mk_pte(new_page, vma->vm_page_prot); + entry = pte_sw_mkyoung(entry); entry = maybe_mkwrite(pte_mkdirty(entry), vma); /* @@ -3561,6 +3562,7 @@ static vm_fault_t do_anonymous_page(stru __SetPageUptodate(page); entry = mk_pte(page, vma->vm_page_prot); + entry = pte_sw_mkyoung(entry); if (vma->vm_flags & VM_WRITE) entry = pte_mkwrite(pte_mkdirty(entry)); @@ -3745,6 +3747,8 @@ void do_set_pte(struct vm_fault *vmf, st if (prefault && arch_wants_old_prefaulted_pte()) entry = pte_mkold(entry); + else + entry = pte_sw_mkyoung(entry); if (write) entry = maybe_mkwrite(pte_mkdirty(entry), vma);