Received: by 10.223.185.116 with SMTP id b49csp423727wrg; Fri, 16 Feb 2018 01:05:15 -0800 (PST) X-Google-Smtp-Source: AH8x227vLw4Vq8NL3sLkGIQKjf+MbnEPsvg6aPhsOxJ/nnGPsTkBPLJitasT9vvi133oTTNa+SAb X-Received: by 2002:a17:902:6b81:: with SMTP id p1-v6mr3625740plk.348.1518771915088; Fri, 16 Feb 2018 01:05:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518771915; cv=none; d=google.com; s=arc-20160816; b=TpdfK6zZpJ4nrScFE/el1JelPkF60E8l48c5SiyoGKtdJDHWXNTa+mqcIJul06MUaN bO59ymfjUp3C5z6BRchOuGofIWa8yP1dmd5BniwzGAFqwTqZkpcrRcKJAylwno/Eegbr yrw3EFXKubb6iwdMlocnvgzJVtJ/GbWgT2a0Ma+CBpO/Yc1rSyp5fuWTbUhfmbm1c76e aVwQE4qoAh89Y4xh1xAOuXLMn1boNkkHhTZrjBhVvvt+NCqm5U9BHclw3z3v06HmfjOp gp56p6FvyAWLXcx/+IYprq8hG23S9La3wmhnzegml8JbLBmV4tMUL02V2BSoGn2PmL6T koTg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:arc-authentication-results; bh=PXtOrTA1GtMlHKeSjSjIOYt3IF7/gdJvkzFx1BPD9gg=; b=FqyvfS0Bi9VdxZVuePS0PxRHf2DH2OA1Vl8Q68j3wLu+KR0UbovRgz7BGZMsYzZkAy W54WgCYIxEPZHbEtoWOje9HNtCQx0TomRQJ9zIcDIXCM63Cus/ifuVHxpRS+Acg09/h9 KAKAbw4nfl4HJksERUMWUdCppPNjqi5UCHbmFUhMqKhv9UvR9xV4r/ZOixJHZuSuLN9h xqCsfkP/Mg4aBOsE0QGNSGwyhcgKxK/AZY6MTYTDrMTQodNUeN+EQXMjv6PSSytotDOn mZXiOx3x72F4CeBAX4aPTiaLX0i7iL4n1myjRWt7CeHc7xHmPBnaBW0mIx9CGZVYPJVa 3NPw== 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 w20-v6si1768297plp.638.2018.02.16.01.05.00; Fri, 16 Feb 2018 01:05:15 -0800 (PST) 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 S1426076AbeBOQha (ORCPT + 99 others); Thu, 15 Feb 2018 11:37:30 -0500 Received: from ex13-edg-ou-002.vmware.com ([208.91.0.190]:37394 "EHLO EX13-EDG-OU-002.vmware.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1426074AbeBOQgS (ORCPT ); Thu, 15 Feb 2018 11:36:18 -0500 Received: from sc9-mailhost3.vmware.com (10.113.161.73) by EX13-EDG-OU-002.vmware.com (10.113.208.156) with Microsoft SMTP Server id 15.0.1156.6; Thu, 15 Feb 2018 08:36:07 -0800 Received: from ubuntu.localdomain (unknown [10.2.101.129]) by sc9-mailhost3.vmware.com (Postfix) with ESMTP id BC81740B35; Thu, 15 Feb 2018 08:36:15 -0800 (PST) From: Nadav Amit To: Ingo Molnar CC: Thomas Gleixner , Andy Lutomirski , Peter Zijlstra , Dave Hansen , Willy Tarreau , Nadav Amit , , , Nadav Amit Subject: [PATCH RFC v2 2/6] x86: Save pti_disable for each mm_context Date: Thu, 15 Feb 2018 08:35:58 -0800 Message-ID: <20180215163602.61162-3-namit@vmware.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180215163602.61162-1-namit@vmware.com> References: <20180215163602.61162-1-namit@vmware.com> MIME-Version: 1.0 Content-Type: text/plain Received-SPF: None (EX13-EDG-OU-002.vmware.com: namit@vmware.com does not designate permitted sender hosts) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Save for each mm->context whether page-table isolation should be disabled. In order not to make intrusive changes, the information is saved in the PGD page metadata. Signed-off-by: Nadav Amit --- arch/x86/include/asm/mmu.h | 3 +++ arch/x86/include/asm/pti.h | 9 +++++++++ arch/x86/mm/pgtable.c | 4 +++- arch/x86/mm/pti.c | 9 +++++++-- 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/arch/x86/include/asm/mmu.h b/arch/x86/include/asm/mmu.h index 5ff3e8af2c20..fb8db4a09d8a 100644 --- a/arch/x86/include/asm/mmu.h +++ b/arch/x86/include/asm/mmu.h @@ -36,6 +36,9 @@ typedef struct { /* True if mm supports a task running in 32 bit compatibility mode. */ unsigned short ia32_compat; #endif +#ifdef CONFIG_PAGE_TABLE_ISOLATION + unsigned short pti_disable; +#endif struct mutex lock; void __user *vdso; /* vdso base address */ diff --git a/arch/x86/include/asm/pti.h b/arch/x86/include/asm/pti.h index 0b5ef05b2d2d..96a5fbfedf7a 100644 --- a/arch/x86/include/asm/pti.h +++ b/arch/x86/include/asm/pti.h @@ -4,9 +4,18 @@ #ifndef __ASSEMBLY__ #ifdef CONFIG_PAGE_TABLE_ISOLATION +static inline unsigned short mm_pti_disable(struct mm_struct *mm) +{ + if (mm == NULL) + return 0; + + return mm->context.pti_disable; +} + extern void pti_init(void); extern void pti_check_boottime_disable(void); #else +static inline unsigned short mm_pti_disable(struct mm_struct *mm) { return 0; } static inline void pti_check_boottime_disable(void) { } #endif diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c index 004abf9ebf12..ef0394a97adb 100644 --- a/arch/x86/mm/pgtable.c +++ b/arch/x86/mm/pgtable.c @@ -139,7 +139,9 @@ static void pgd_ctor(struct mm_struct *mm, pgd_t *pgd) if (!SHARED_KERNEL_PMD) { pgd_set_mm(pgd, mm); pgd_list_add(pgd); - } + } else if (IS_ENABLED(CONFIG_PAGE_TABLE_ISOLATION) && + static_cpu_has(X86_FEATURE_PTI)) + pgd_set_mm(pgd, mm); } static void pgd_dtor(pgd_t *pgd) diff --git a/arch/x86/mm/pti.c b/arch/x86/mm/pti.c index ce38f165489b..a973a291a34d 100644 --- a/arch/x86/mm/pti.c +++ b/arch/x86/mm/pti.c @@ -134,10 +134,15 @@ pgd_t __pti_set_user_pgd(pgd_t *pgdp, pgd_t pgd) * may execute from it * - we don't have NX support * - we're clearing the PGD (i.e. the new pgd is not present). + * - PTI is disabled. */ if ((pgd.pgd & (_PAGE_USER|_PAGE_PRESENT)) == (_PAGE_USER|_PAGE_PRESENT) && - (__supported_pte_mask & _PAGE_NX)) - pgd.pgd |= _PAGE_NX; + (__supported_pte_mask & _PAGE_NX)) { + struct mm_struct *mm = pgd_page_get_mm(virt_to_page(pgdp)); + + if (!mm_pti_disable(mm)) + pgd.pgd |= _PAGE_NX; + } /* return the copy of the PGD we want the kernel to use: */ return pgd; -- 2.14.1