From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id A30F6C3DA79 for ; Tue, 27 Dec 2022 03:09:06 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id BB9B68E000F; Mon, 26 Dec 2022 22:08:58 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id B4D3C8E000E; Mon, 26 Dec 2022 22:08:58 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 91FCE8E000F; Mon, 26 Dec 2022 22:08:58 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 729748E000E for ; Mon, 26 Dec 2022 22:08:58 -0500 (EST) Received: from smtpin16.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id F0AA4120612 for ; Tue, 27 Dec 2022 03:08:57 +0000 (UTC) X-FDA: 80286604314.16.DBE63DB Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by imf23.hostedemail.com (Postfix) with ESMTP id 1BB1314000D for ; Tue, 27 Dec 2022 03:08:55 +0000 (UTC) Authentication-Results: imf23.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=kZD0SWF3; spf=none (imf23.hostedemail.com: domain of kirill.shutemov@linux.intel.com has no SPF policy when checking 134.134.136.24) smtp.mailfrom=kirill.shutemov@linux.intel.com; dmarc=pass (policy=none) header.from=intel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1672110536; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=+IRLHyVHXI80YSVYaqVuD5iuaMqaAmx3HLnreDtNbNE=; b=L0nf4kgVC41Y68aAa+60FykUH/PyJBv3OGYyaUAbBfZLigWliPwpnRIn9m78P2ymQt9hJw 9+n/lCI9jm1fGK3Iv7SeQT7DPXxm7WaCErsCcPC9LVM9F7D/laPlULklvQXUZE3NJAypFl cE+OblHR/dAW2aiAfN1uuE/u5nuictA= ARC-Authentication-Results: i=1; imf23.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=kZD0SWF3; spf=none (imf23.hostedemail.com: domain of kirill.shutemov@linux.intel.com has no SPF policy when checking 134.134.136.24) smtp.mailfrom=kirill.shutemov@linux.intel.com; dmarc=pass (policy=none) header.from=intel.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1672110536; a=rsa-sha256; cv=none; b=6HnwCAyH3+584hVy2fJJbnluYsbGtJiMNybwYxPLPppQX9sqtb+Y1xHNch4wWUJE11O0ja /iMH9HgAXWlYjM4dZFHw9nzfwO6uyig71feu3KJnaNSLgcCqG23V6GSjUA9XIYLX812q1r vrgRPswmCi/a7gwsV7rV+0mM3dMmo+0= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1672110536; x=1703646536; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=NXgfwVMopqIsMq8iO8GLDE0ia9jK476IcYsVpRyLMg4=; b=kZD0SWF3v8mn1m8Jbc9w8OcHqZ4plspSPPFawpHX97/7DJPjEeYLEHca TPtY2VMFv1qh6ycPPG6jRXiQ7QvCTrkK49U1Um+lxNCg1TTvQian7uhgs kU679JrobMokRdgN0vWOlg+ok/qs/aktnesa953C9ADzZRYnLdMqyLC1H 7M3eeCtFsJo1vkXsakBw6e8zAE2i4sFeJfYc1g1RWN89ZvJViZtKgGdqA yjFPKXMD7kf7UHFV31aJVEw3tALJn9q4sUmHzDxUvAYsQH9y/6xc7sDQE Iy1RejypHeoUyXlqQcR8H++jn6H5Z+D0H0Wndz0t9xsRKcOiKdEYk5Vri g==; X-IronPort-AV: E=McAfee;i="6500,9779,10572"; a="321869799" X-IronPort-AV: E=Sophos;i="5.96,277,1665471600"; d="scan'208";a="321869799" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Dec 2022 19:08:53 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10572"; a="652917550" X-IronPort-AV: E=Sophos;i="5.96,277,1665471600"; d="scan'208";a="652917550" Received: from ppogotov-mobl.ger.corp.intel.com (HELO box.shutemov.name) ([10.252.62.152]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Dec 2022 19:08:47 -0800 Received: by box.shutemov.name (Postfix, from userid 1000) id DEAA810BBB7; Tue, 27 Dec 2022 06:08:36 +0300 (+03) From: "Kirill A. Shutemov" To: Dave Hansen , Andy Lutomirski , Peter Zijlstra Cc: x86@kernel.org, Kostya Serebryany , Andrey Ryabinin , Andrey Konovalov , Alexander Potapenko , Taras Madan , Dmitry Vyukov , "H . J . Lu" , Andi Kleen , Rick Edgecombe , Bharata B Rao , Jacob Pan , Ashok Raj , Linus Torvalds , linux-mm@kvack.org, linux-kernel@vger.kernel.org, "Kirill A. Shutemov" Subject: [PATCHv13 10/16] x86/mm/iommu/sva: Make LAM and SVA mutually exclusive Date: Tue, 27 Dec 2022 06:08:23 +0300 Message-Id: <20221227030829.12508-11-kirill.shutemov@linux.intel.com> X-Mailer: git-send-email 2.38.2 In-Reply-To: <20221227030829.12508-1-kirill.shutemov@linux.intel.com> References: <20221227030829.12508-1-kirill.shutemov@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: 1BB1314000D X-Stat-Signature: ukjcre86e8op4jj8q4pru9wxwfhhciae X-Rspam-User: X-Rspamd-Server: rspam08 X-HE-Tag: 1672110535-624770 X-HE-Meta: U2FsdGVkX19FXcdkvixAZjYLID94qkAKzvM7FwcL7v2PYqPjnK7o6vO0JHDc6yd3MTyjHq34XQIvww4ZFWEoEXnRomVx97ZFaRX6qIlI7Pk4pAjddfc/Ue7hvfZ578DjvQnTUBl3no1xVS8bb6jeSqCBH1y2U43Milgfo1vfFzHmXo8f5+odR1MbEw4z44hglaaZ/lZH7Jx0GfsbthFszLJmATm7xGcLiQEi/UdquzT6piAsb3CF4hClwUPQ052n9BPufZSzeUnUuPqpyUFC1hU2tzzIOO4KAtc3ohJQ565A/BR721inJLU4ltJfgSD0+Wa+a/d8J+nDiV/q2/nV9qY7J55aWw1qUvxTf4ybCV1DlpgrMtRgpz7Pokfghup1iHkgw1j7n76DtxLPX00BvRK6f2mBWl4npNl8JixKJKXBfo2Oh+oYuaLucWXCwfUvEsl1dsSnODHJ+j9pXJPnw7Or5iTWduuiYOY0BXzRFeNFuaR+4JSqePJx8rP/784t2NfP4O0jWmkGwIB73Ga0QvFGCdOMa9ZcT3ALfaot1MT635WsBJkv2WioHqXgQyTTWy9y3o48GkeQkEPkMzv2YJtpFNkDeUdsnviMJlAVgtpoQs2zjQmrGYSwAJgZuGUkn1FxPK2NSSQqPiHVhZ3p/SDwkW9nJkF3jEr36muviCa+th+bzMZG/07nod2nf1WORHHnG6WpnYpFxmWfb9NIwDuy7Q0SB28DQooiVBDaFwfNDzNq8ejCcY9Mjzkh5W8hTWJcKr8B34LeGjGB4N5NuqFtqOmmMenZONROKn2KqFXwqUaYxR75Se+I6kQsjZKYXnblYP4kRIp7gDrGEjJ8eAWbuFC4aSPTWBUM1fb2WDHcEPvZTejbWYRxTBs4UQFclZwbG3ntoB4+ZkATDBzm6A19caXnw5ndHawPBd1vOi03BT/0Yiebh+gjQGfo16F6UywroNEWXJ8= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: IOMMU and SVA-capable devices know nothing about LAM and only expect canonical addresses. An attempt to pass down tagged pointer will lead to address translation failure. By default do not allow to enable both LAM and use SVA in the same process. The new ARCH_FORCE_TAGGED_SVA arch_prctl() overrides the limitation. By using the arch_prctl() userspace takes responsibility to never pass tagged address to the device. Signed-off-by: Kirill A. Shutemov Reviewed-by: Ashok Raj Reviewed-by: Jacob Pan --- arch/x86/include/asm/mmu.h | 2 ++ arch/x86/include/asm/mmu_context.h | 6 ++++++ arch/x86/include/uapi/asm/prctl.h | 1 + arch/x86/kernel/process_64.c | 7 +++++++ drivers/iommu/iommu-sva.c | 4 ++++ include/linux/mmu_context.h | 7 +++++++ 6 files changed, 27 insertions(+) diff --git a/arch/x86/include/asm/mmu.h b/arch/x86/include/asm/mmu.h index 54e4a3e9b5c5..90d20679e4d7 100644 --- a/arch/x86/include/asm/mmu.h +++ b/arch/x86/include/asm/mmu.h @@ -14,6 +14,8 @@ #define MM_CONTEXT_HAS_VSYSCALL 1 /* Do not allow changing LAM mode */ #define MM_CONTEXT_LOCK_LAM 2 +/* Allow LAM and SVA coexisting */ +#define MM_CONTEXT_FORCE_TAGGED_SVA 3 /* * x86 has arch-specific MMU state beyond what lives in mm_struct. diff --git a/arch/x86/include/asm/mmu_context.h b/arch/x86/include/asm/mmu_context.h index 7f9f9978c811..4bc95c35cbd3 100644 --- a/arch/x86/include/asm/mmu_context.h +++ b/arch/x86/include/asm/mmu_context.h @@ -114,6 +114,12 @@ static inline void mm_reset_untag_mask(struct mm_struct *mm) mm->context.untag_mask = -1UL; } +#define arch_pgtable_dma_compat arch_pgtable_dma_compat +static inline bool arch_pgtable_dma_compat(struct mm_struct *mm) +{ + return !mm_lam_cr3_mask(mm) || + test_bit(MM_CONTEXT_FORCE_TAGGED_SVA, &mm->context.flags); +} #else static inline unsigned long mm_lam_cr3_mask(struct mm_struct *mm) diff --git a/arch/x86/include/uapi/asm/prctl.h b/arch/x86/include/uapi/asm/prctl.h index a31e27b95b19..eb290d89cb32 100644 --- a/arch/x86/include/uapi/asm/prctl.h +++ b/arch/x86/include/uapi/asm/prctl.h @@ -23,5 +23,6 @@ #define ARCH_GET_UNTAG_MASK 0x4001 #define ARCH_ENABLE_TAGGED_ADDR 0x4002 #define ARCH_GET_MAX_TAG_BITS 0x4003 +#define ARCH_FORCE_TAGGED_SVA 0x4004 #endif /* _ASM_X86_PRCTL_H */ diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 09e7f3d3fb5c..add85615d5ae 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c @@ -756,6 +756,10 @@ static int prctl_enable_tagged_addr(struct mm_struct *mm, unsigned long nr_bits) if (test_bit(MM_CONTEXT_LOCK_LAM, &mm->context.flags)) return -EBUSY; + if (mm_valid_pasid(mm) && + !test_bit(MM_CONTEXT_FORCE_TAGGED_SVA, &mm->context.flags)) + return -EINTR; + if (mmap_write_lock_killable(mm)) return -EINTR; @@ -872,6 +876,9 @@ long do_arch_prctl_64(struct task_struct *task, int option, unsigned long arg2) (unsigned long __user *)arg2); case ARCH_ENABLE_TAGGED_ADDR: return prctl_enable_tagged_addr(task->mm, arg2); + case ARCH_FORCE_TAGGED_SVA: + set_bit(MM_CONTEXT_FORCE_TAGGED_SVA, &task->mm->context.flags); + return 0; case ARCH_GET_MAX_TAG_BITS: if (!cpu_feature_enabled(X86_FEATURE_LAM)) return put_user(0, (unsigned long __user *)arg2); diff --git a/drivers/iommu/iommu-sva.c b/drivers/iommu/iommu-sva.c index 4ee2929f0d7a..dd76a1a09cf7 100644 --- a/drivers/iommu/iommu-sva.c +++ b/drivers/iommu/iommu-sva.c @@ -2,6 +2,7 @@ /* * Helpers for IOMMU drivers implementing SVA */ +#include #include #include #include @@ -32,6 +33,9 @@ int iommu_sva_alloc_pasid(struct mm_struct *mm, ioasid_t min, ioasid_t max) min == 0 || max < min) return -EINVAL; + if (!arch_pgtable_dma_compat(mm)) + return -EBUSY; + mutex_lock(&iommu_sva_lock); /* Is a PASID already associated with this mm? */ if (mm_valid_pasid(mm)) { diff --git a/include/linux/mmu_context.h b/include/linux/mmu_context.h index 14b9c1fa05c4..f2b7a3f04099 100644 --- a/include/linux/mmu_context.h +++ b/include/linux/mmu_context.h @@ -35,4 +35,11 @@ static inline unsigned long mm_untag_mask(struct mm_struct *mm) } #endif +#ifndef arch_pgtable_dma_compat +static inline bool arch_pgtable_dma_compat(struct mm_struct *mm) +{ + return true; +} +#endif + #endif -- 2.38.2