Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp837445pxf; Thu, 1 Apr 2021 15:13:38 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz9ObJFg7Yz2tYjIU/dsL5xRPYOo9WMKb6gzPjju8jG8om3WMIOZQfS5ZDUYzFbtmjt7sG0 X-Received: by 2002:a17:906:33da:: with SMTP id w26mr11330306eja.302.1617315218463; Thu, 01 Apr 2021 15:13:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1617315218; cv=none; d=google.com; s=arc-20160816; b=ktc5khpkSY+Akx7HfNiWOsbWIYLJfQgUU5towF5ExJ+bk9EiM+O/Ftmmzoc/i1DfR8 hoYbq/z727G1qGOkVkvU3KJ18MM9d4Q9DHG4kR9wNv/lATeZ22E94n2eIq234K9jtu7s 7TiWJRIGgfHhtMqGbGRkDHly+wCrOYHR0fcpt4NMiBIKL3Xu0fKuVoZQEaNFsOOQVUZF V3ViT2W8gGT8GZHBjmpoDLxhYVztJgQmSoW3BgxN2hCL9EtHkUDt0wUyHw1JMa2PRpQD /YZLtYRPDGVnE70jNepaoXaX0WH2B09+fMkVjh9nU930gXguTcE3CqKpIhLVMuedcLa0 OmRQ== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :ironport-sdr:ironport-sdr; bh=WGaY/a5UvxLv6hhE60jOm+ha6Dryc6dG/noziwFwbRA=; b=pzYNizgO9CCeOKwoKlb5Th9cozDZkZJXD+SBPzZnoKARJwnAtI7fOiw5dLa/EHA6tM 46rAs0yLDi/t6Tv9VW2/htGoBA1e+5sK2ldtSo2sOo30ZcP1KyKyjk+hb/M3foMRJCLy nTgvmPe4DWuG988gTu0BSycMdiGuRn0FlR1r8u9Gjkm9aPqiVVmHa2ODsW//ao+9ccn8 UjiSf5w8M426llReS/kcpQlihDNQgGkfUu0W7ijd0MWpR3A6p/Akb5ZjTTC3V7X3UI+5 ZB3pA1y0RgILD/bIdSqP0ir+zjiccsxDsfgiIojtHm7YCmHircZwBsCoIUptkJXfDtRF RPpQ== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id ji5si5194227ejc.360.2021.04.01.15.13.15; Thu, 01 Apr 2021 15:13:38 -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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235222AbhDAWM3 (ORCPT + 99 others); Thu, 1 Apr 2021 18:12:29 -0400 Received: from mga11.intel.com ([192.55.52.93]:34676 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235080AbhDAWLh (ORCPT ); Thu, 1 Apr 2021 18:11:37 -0400 IronPort-SDR: XOgB9hMqtdyp06CdSj3FkRuLCmDjDEjWVGTp7JW5SsWZJ2R2wbsRxj7nI1GIXcwGYl4meJOxY2 +/V2g7nqyu+Q== X-IronPort-AV: E=McAfee;i="6000,8403,9941"; a="189084579" X-IronPort-AV: E=Sophos;i="5.81,296,1610438400"; d="scan'208";a="189084579" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Apr 2021 15:11:24 -0700 IronPort-SDR: mpWU7ZRZ10LDWKSod+5CSr0sTZSexKKRE2GvtO5cH2swVdThcqVjhzlRY2XkNJWjgaeqv6nbN3 SXU97KX1bJ/w== X-IronPort-AV: E=Sophos;i="5.81,296,1610438400"; d="scan'208";a="517513915" Received: from yyu32-desk.sc.intel.com ([143.183.136.146]) by fmsmga001-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Apr 2021 15:11:24 -0700 From: Yu-cheng Yu To: x86@kernel.org, "H. Peter Anvin" , Thomas Gleixner , Ingo Molnar , linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-mm@kvack.org, linux-arch@vger.kernel.org, linux-api@vger.kernel.org, Arnd Bergmann , Andy Lutomirski , Balbir Singh , Borislav Petkov , Cyrill Gorcunov , Dave Hansen , Eugene Syromiatnikov , Florian Weimer , "H.J. Lu" , Jann Horn , Jonathan Corbet , Kees Cook , Mike Kravetz , Nadav Amit , Oleg Nesterov , Pavel Machek , Peter Zijlstra , Randy Dunlap , "Ravi V. Shankar" , Vedvyas Shanbhogue , Dave Martin , Weijiang Yang , Pengfei Xu , Haitao Huang Cc: Yu-cheng Yu , "Kirill A . Shutemov" Subject: [PATCH v24 16/30] mm: Fixup places that call pte_mkwrite() directly Date: Thu, 1 Apr 2021 15:10:50 -0700 Message-Id: <20210401221104.31584-17-yu-cheng.yu@intel.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20210401221104.31584-1-yu-cheng.yu@intel.com> References: <20210401221104.31584-1-yu-cheng.yu@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When serving a page fault, maybe_mkwrite() makes a PTE writable if it is in a writable vma. A shadow stack vma is writable, but its PTEs need _PAGE_DIRTY to be set to become writable. For this reason, maybe_mkwrite() has been updated. There are a few places that call pte_mkwrite() directly, but have the same result as from maybe_mkwrite(). These sites need to be updated for shadow stack as well. Thus, change them to maybe_mkwrite(): - do_anonymous_page() and migrate_vma_insert_page() check VM_WRITE directly and call pte_mkwrite(), which is the same as maybe_mkwrite(). Change them to maybe_mkwrite(). - In do_numa_page(), if the numa entry was writable, then pte_mkwrite() is called directly. Fix it by doing maybe_mkwrite(). - In change_pte_range(), pte_mkwrite() is called directly. Replace it with maybe_mkwrite(). A shadow stack vma is writable but has different vma flags, and handled accordingly in maybe_mkwrite(). Signed-off-by: Yu-cheng Yu Reviewed-by: Kees Cook Cc: Kirill A. Shutemov --- mm/memory.c | 5 ++--- mm/migrate.c | 3 +-- mm/mprotect.c | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/mm/memory.c b/mm/memory.c index 5efa07fb6cdc..c70c3847f79d 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -3561,8 +3561,7 @@ static vm_fault_t do_anonymous_page(struct vm_fault *vmf) __SetPageUptodate(page); entry = mk_pte(page, vma->vm_page_prot); - if (vma->vm_flags & VM_WRITE) - entry = pte_mkwrite(pte_mkdirty(entry)); + entry = maybe_mkwrite(pte_mkdirty(entry), vma); vmf->pte = pte_offset_map_lock(vma->vm_mm, vmf->pmd, vmf->address, &vmf->ptl); @@ -4125,7 +4124,7 @@ static vm_fault_t do_numa_page(struct vm_fault *vmf) pte = pte_modify(old_pte, vma->vm_page_prot); pte = pte_mkyoung(pte); if (was_writable) - pte = pte_mkwrite(pte); + pte = maybe_mkwrite(pte, vma); ptep_modify_prot_commit(vma, vmf->address, vmf->pte, old_pte, pte); update_mmu_cache(vma, vmf->address, vmf->pte); diff --git a/mm/migrate.c b/mm/migrate.c index 62b81d5257aa..7251c88a3d64 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -2976,8 +2976,7 @@ static void migrate_vma_insert_page(struct migrate_vma *migrate, } } else { entry = mk_pte(page, vma->vm_page_prot); - if (vma->vm_flags & VM_WRITE) - entry = pte_mkwrite(pte_mkdirty(entry)); + entry = maybe_mkwrite(pte_mkdirty(entry), vma); } ptep = pte_offset_map_lock(mm, pmdp, addr, &ptl); diff --git a/mm/mprotect.c b/mm/mprotect.c index 94188df1ee55..c1ce78d688b6 100644 --- a/mm/mprotect.c +++ b/mm/mprotect.c @@ -135,7 +135,7 @@ static unsigned long change_pte_range(struct vm_area_struct *vma, pmd_t *pmd, if (dirty_accountable && pte_dirty(ptent) && (pte_soft_dirty(ptent) || !(vma->vm_flags & VM_SOFTDIRTY))) { - ptent = pte_mkwrite(ptent); + ptent = maybe_mkwrite(ptent, vma); } ptep_modify_prot_commit(vma, addr, pte, oldpte, ptent); pages++; -- 2.21.0