From patchwork Wed Oct 11 23:25:37 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418054 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 05FC7CDB465 for ; Wed, 11 Oct 2023 23:26:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=klq5Wspo8IQi3//TxTeBtD9dO6ihvWJ/GPpRX9DClK8=; b=uWworPZZmWbN6c Oh6apUHjOTeLYsG+JNSkhz7mJ0tsAuQF4qOcpVccuDsZ8WCjYYkqk+FJeBqdaGkHXIEqv/XnHiPYZ stWgQ+hNBTZIVbuewRMoGk8D0mCtGamwCIZmlr6yLi88V5ps0z7Y/BWzKPw5nCCFBOGcqr50tZeYf 9ryCIPl7AEaWfgslhigJG14M1ldtJnLPuxnCvXE9PKUXQqvgZ5hUauSEJPpwvr0tBZGuxLbimCv47 syjRPk9ceK2adhv6iaGtUIgILJCLaNYxCCSAoXQw83fJF+iNNquwavznz+I4Aa2JOb3ok+tp6zG7/ lt9t31pIPi7vTpaXZUgw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqiaq-00GvUG-0q; Wed, 11 Oct 2023 23:26:20 +0000 Received: from mail-dm6nam10on20625.outbound.protection.outlook.com ([2a01:111:f400:7e88::625] helo=NAM10-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqiaj-00GvP6-3C for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:15 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Lf83AqQUEibIfvB6hvFZCL1o0kI3okM9insBV/KB5nzkkl+Jub/a9DkAcpkoJcsF8EQab677X28d8aD+hwL3fhbmlSYoFCCtSzyZmQnyeFaIsM83qMOFM/+eo0y1ADSHls92UBxO1E8rq5jUfEAlpZo72AotwyXXKV3+++hCt9fDmAgO5dopMq9WCWmvmmnpRd/CtoZsX315+QISPG/RW4/Vl9qPrh83kWoIXSIZlbB7hbOw/ejl2ikFyz+CodSvJ56iOJfdK4fo8IKpr685Ayy527rissAF8FB3Jb56TI3UZ0puzDaTompHnjKq69irgppVNq0gJIuqljFdR1Wltw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=faqLUxZh7NGFr2pnYkK/vyMmkHr32wqLExBAGN5GGAQ=; b=H3hgEvZnly/ddAExmIR6IXvrDwGJDk+ZFJGlaJ8koZfhaQG4zwsDsVGOjBpmgvoIXQdchbHd0KjFD2EpNafQQg/9p7NLkCDo9wktYoq9MF2Mp/79+dDAVxWJ2k0W96vvHH13rSrufERMjET5O/ysB2rXuxFfpGA+dhWpjQQWVYmLtnLVjNV3LVNRdJtKhZTiC274UdxT8CZHkoqyUQ/xKngJvNl++msGxfB0H8ezKoNle59EbVc32kTHH16oJTpWyzkechruMfFtzC17bF4CsA9KUrDlBiyKc1Fj4UaLB8igU7XlV3BLhZswyGGmqAxFEA5eZrxmZSTN/RHwSIrkiQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=faqLUxZh7NGFr2pnYkK/vyMmkHr32wqLExBAGN5GGAQ=; b=Kt2oRRwvkvHSrr4UXHxm2ch5SBp1jgRJ1sJVcllFVCLul7Dj1jOTFWO6n5JFs0rdMoMllayWE7QqDLXkxijnnhdftykGt5LsNBKxY8TvJPtAlgvJlQl4bPm+pmFbWZvPxBbaVV3ctTABizIG/wAA9Jo/mpEASkQPoKE6k6KtqIAm8cP5adwhvYWIYhfhm2180hop/iZ6+292T64VoQsb/Y49qBpZr9bmcjMZ4Mv+2EJbi22/4zUYwkdGDgTdvZqxtuQmjyqjGYw3d1WutqFqXarYBulLn4SqYjtPr+3C9l9eau7pOOsKh8BUCm4+n3u4LWd4JjJVn/UczwXdF/Kwbg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by CH0PR12MB8488.namprd12.prod.outlook.com (2603:10b6:610:18d::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.38; Wed, 11 Oct 2023 23:26:09 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:09 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 01/27] iommu/arm-smmu-v3: Check that the RID domain is S1 in SVA Date: Wed, 11 Oct 2023 20:25:37 -0300 Message-ID: <1-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: BL1PR13CA0277.namprd13.prod.outlook.com (2603:10b6:208:2bc::12) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|CH0PR12MB8488:EE_ X-MS-Office365-Filtering-Correlation-Id: a128b72a-1010-4ef8-f3fa-08dbcab1705e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: PD3q61PB0HMSGZ0jXooUiNRerKoU/gEgZC98daXIjtcBohpS/b8aIYB06QCvrvFes2v1M+BYZrlZAj3Xmt8q/TrB372yRNkwo8uSSiYPxsvqYXYDNKsdLYs1RLDRnJ8egFNCYE+OPmS/l5MDnYdC6dEv4fiCL367xMdWZPWbkeMAqjmxN6i7eWkMln5ouymhnNQDTHWt02lyW0yqcv/Ilvy9CkeiJsgV2RnhoaAgWVO4xpIS9twAPH3insn7EzUkucJyIPr1CHNCzfcFaawjnGQPsf786TP1ZgIJR27d6eOopeT2+GkC0c+DNEScmhHKICvF3bVk7xuWTBjBKSYMGgzuQiPdc1BtscgoIMgtkqSK70BBdQUQikefpU8k6V0LvkbARVJ5zBJsl7ALa/+q2RvRhHRmDFVujTWbId88Vg8loE+N/0wu+87RYvfbqCzTmzcA8RelAtMq34ip8pQQIQXMo4M5I29LmtAzXB1cFOq1ZIh/0KVcTU+c/CLbPT9uHSSI1C7apZL2lMOR6SAgQMrAWEhcTa4LVZOBspHhA9LqYk+cCy4C69F/Lcs+uxTfhaaU3eh2zhwC59RcmxKJ7w0rmyV8TPe6+UOjvVIZgJ4= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(366004)(396003)(39860400002)(376002)(346002)(136003)(230922051799003)(1800799009)(451199024)(64100799003)(186009)(66476007)(66556008)(8936002)(66946007)(316002)(54906003)(110136005)(2906002)(5660300002)(41300700001)(8676002)(4326008)(6486002)(38100700002)(2616005)(6666004)(107886003)(36756003)(26005)(6512007)(83380400001)(478600001)(86362001)(6506007)(4216001);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 0z+zWeFTm4pf1JcArytT0b8BzXIDduqsqwyxREvuI26UbObuSGf2Defp5dSdETCDZfHnmYBrB4Sy86KfP0QkKDuZUC+craGrtcoUUBazeltZFX2PEvFtTgVIxmIx+1a1W5Ug52Gll6iV/hsM07QKN2g8rS8VY5mo2Q3kmetyvnbsDWfSCWJSV2+0Gli9zv3A8f9qrp2DllIxRM0P8XrIBs8+55ilPWrLQj9WAagCrKD53dm5Dz6BbaYdESgTasWHHPZ74XilDibolFWtNZnkIJPNxikLuVAEXOEt8ijYQSGbjLeOw/J9K2bX1CPv1qFquBeZd5gYdhITuGxhJlczqhZcOCmrvuZIJZzgBeWd9SzsnBwf4Z61onC73dcV4Zf1iGvwqxPRORgaXctSHLkcmcEpV7Ae/AwEUMk/OSsBT7M+0XIpOyNBmclW1zhKtX5FN2jTw1CZNtPaYWFNSPRfP9mjRD2F1EGSO2/i8DGQIILRSEhKjKcZ8mgLln4EegWBvL9iXmn5l3pjz4drkxIDhDZGMJpHQYk5jlpVMxFkkr/izzHEf4jZtYaJTAyXYbn1CaFuWyDr8HK+4HlcJJ5GuoKtnnZ8JTpr8sDK4aEUD5lZNZerdtnm2kDK8YdfakujVi3irR85EGFfbtIpt+ijCfm8gxkXaPpce0T9qzAxNUvWkyqaTr3Mje0X9I6dXcoI48GjE8Mx3izwFx0YCYH7GEy1jUqtOKGlYfk+pMRswLa4R8cjwrhgqSzGgywA0gVJGSA17sJ154a/LX6fvVQuTGsaln7aXD/4nYGPMUuKMO+MYUbQBbd3lp5v9fhPQO1ECqYiI9iJIrBs9plqQUg/6C4r0l3oUVRthUXDesclQsbYy4dwDYix2c0m+2E/bBUSxE1cffGIMUgCKj8XTCbwzqmHS01uHshHRFkzhoT32JmPDIcdg4oPzahmAqlomNX0rqI6En9h6QpAUPhiN/gAyChytPa5yqRosVKBTXB3+7502/c9Qd6VCFRBU5fBS+61akD1dojHs2WyubJ+jcLd6eXGjHzuuVZRPqOC6EwNBhl9Zg3VmyjdfSqpJSkFo0f6AlRbvq9wckm/h3shTkFbuUH9aWt4aYi2Yb35xhxoL0HseEMVCf7GRRdS/zdSJ+4/QdJrC0BzEkh8os6vlJkuDa0RUJGkDjaC0+jDIMwrd4KRv0CTNT3SyuBTRGdgqSdnOomIcuSNaTM5QgL7JwVftxFSXtnGFYRZ/C1d08gxashuWkOogFl+rmd3GLMI8BaWsnlSaum4dbqq4yh36SwOyMDC8Ttp6ZUvqnyoZ+WbI4183IaQEKmtzWCcbbqPRGcw1L9Mm2qkh2lCcm8suYHxZ00sL2v3CRfU8UB01/6IsY82YJL4XE5F/hikYmvU3ezONxUcyVLaoqsuceqdgEVuOUPYlgvcZQLsxIdk9E08Nz/VyGUTnV/K9OnuwohpfKJFTYFPmjEBYHgPhVCFG9yJklIaIL5kpHp1z41t4b7A/0xV7q17KAwePbJNO1V40iW8Iz+ufhlR7Ov2kycJBGkmQ/TWKVsOvpoyBcGZKjvcjjuX/PhGss342QhPIDKl/wip X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: a128b72a-1010-4ef8-f3fa-08dbcab1705e X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:04.7724 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: +tH2yg+YZlT2Mi/4HFF3bYs/vVrHw5LPUEf/8t0rpVbY/jS6ubUhNL6jdyG+FuVn X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR12MB8488 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162614_032287_D22CCCED X-CRM114-Status: GOOD ( 11.80 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org This code only works if the RID domain is a S1 domain and has already installed the cdtable. Add a to_smmu_domain_safe() which does a robust conversion from struct iommu_domain to the struct arm_smmu_domain. Signed-off-by: Jason Gunthorpe --- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 7 +++++-- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 7 +++---- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c index df66fe43a9853f..6b1896b18d54c7 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c @@ -382,8 +382,11 @@ __arm_smmu_sva_bind(struct device *dev, struct mm_struct *mm) int ret; struct arm_smmu_bond *bond; struct arm_smmu_master *master = dev_iommu_priv_get(dev); - struct iommu_domain *domain = iommu_get_domain_for_dev(dev); - struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain); + struct arm_smmu_domain *smmu_domain = + to_smmu_domain_safe(iommu_get_domain_for_dev(dev)); + + if (!smmu_domain || smmu_domain->stage != ARM_SMMU_DOMAIN_S1) + return ERR_PTR(-ENODEV); if (!master || !master->sva_enabled) return ERR_PTR(-ENODEV); diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index 3952fd062c523e..b527e635a3043c 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -2461,14 +2461,13 @@ static void arm_smmu_disable_pasid(struct arm_smmu_master *master) static void arm_smmu_detach_dev(struct arm_smmu_master *master) { - struct iommu_domain *domain = iommu_get_domain_for_dev(master->dev); - struct arm_smmu_domain *smmu_domain; + struct arm_smmu_domain *smmu_domain = + to_smmu_domain_safe(iommu_get_domain_for_dev(master->dev)); unsigned long flags; - if (!domain || !(domain->type & __IOMMU_DOMAIN_PAGING)) + if (!smmu_domain) return; - smmu_domain = to_smmu_domain(domain); arm_smmu_disable_ats(master, smmu_domain); spin_lock_irqsave(&smmu_domain->devices_lock, flags); diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h index 154808f96718df..6f62184eaa2434 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h @@ -740,6 +740,20 @@ static inline struct arm_smmu_domain *to_smmu_domain(struct iommu_domain *dom) return container_of(dom, struct arm_smmu_domain, domain); } +/* + * Check that the domain type has an arm_smmu_domain struct. The global static + * IDENTITY and BLOCKED domains do not. + */ +static inline struct arm_smmu_domain * +to_smmu_domain_safe(struct iommu_domain *domain) +{ + if (!domain) + return NULL; + if (domain->type & __IOMMU_DOMAIN_PAGING) + return to_smmu_domain(domain); + return NULL; +} + extern struct xarray arm_smmu_asid_xa; extern struct mutex arm_smmu_asid_lock; extern struct arm_smmu_ctx_desc quiet_cd; From patchwork Wed Oct 11 23:25:38 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418055 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 0AFFDCDB46E for ; Wed, 11 Oct 2023 23:26:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=52/QcVu9kRQe9TUdN7b4RQ0cpIBryviRhKV2eVhVx7g=; b=TT+nhF/scmTeBG QIYpFpWu7D+Muj46YL9NDfsBQQvnJqlI/yW40f6+EwrFi/uQzrBEJwF7HeLH7Xyod6NZBUui0J63U I0KXZQHyn+m+RczT22mLby8xfE3UxDjWOQZ5B3kVtnWFiKD/AqQfabglnHBMB0m4S+O/thVgs416X G4q4JuVwV931zdPCJAruWc8CgeFFuS8Y39tohbUgqb8ufKo0Xkuhf/MkHgLqU0Bq+qraO8W+GTnVL /k+TIPYcxkypGUOMOU7AT2pTsBhDy00Ss7wPyAxzQPYwMOfoCYVVTYfdHx4ulPUNHSPLFnX1u1j5b Ir7m+Vhf02Hy6Q2Mrbvw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqiau-00GvZI-1C; Wed, 11 Oct 2023 23:26:24 +0000 Received: from mail-dm6nam11on2060d.outbound.protection.outlook.com ([2a01:111:f400:7eaa::60d] helo=NAM11-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqiam-00GvOz-0p for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:18 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=VNhbRparo8EJ+0P8Wu+Sdpe4kJUl3Ddl293H3iUplN1GTkFpwRDxe4EW6Nku8H25zpvvUjb+xI/CbmIpPwcN6ednsbGYCpQCkAs0krkGZeRENFICPflnrSYiuxM6r5YZcTRYkupIv3T0NlB9UtlN34CuwawRZQzm/9dH9bEX88zwkyqzAqAknUq22YqP49qskWl1Nl9IpOemDc6R7MiWxh4bAaZI1FlPfds32E4qhhYnvuQ80OLdPAaiYihCP0+vrBv3CzSo0ty5Y4IQDwATtbam6vb0PkpgahTpJivLpybsdPRc5+PCYagAC55pGXZr+2Z43ckxdWDs2/dUq2EZ8Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=VkTNONyyv707aoAGmWhQifeg1PwnnIV1cZmLZ11dglY=; b=WbQ1oEcndeJMV0uSD7kuBCa6xkXRohD4JnXMQf7ySY5Z+52JTE9iAthpJPOmJUuhoWPqvqAXxD9zPdIn4E8W0P5808OLKjB5WofnK7fmZCauZrdDj/GNdTnYJY31WNx0tym5AQgZ/iCuQZ4gSGzdA8NUXHqG8/183kHh49l9MVqGyI1HZzjZiLI4oe8WWH9URgejrPjT/5vwEK9k0a3Q5i7A+yWR3VUYy+9WRwsGvKYRsix81fag4cA5IfdoqRRwUeqcFwBqAN1Dk3JgghPVywGKzOiyijdITsI//o5AiODKaJdMF9UPc2LafIiKYBuKsNxsOuBMRSzX8ovEgzztJg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=VkTNONyyv707aoAGmWhQifeg1PwnnIV1cZmLZ11dglY=; b=ltghqg8yaxTxgynOWfHm9H3D6pNBm9dQEd4mwhNJqibBpc26meEipxNAGYzVw49w4D7oHD1hr4TYREgxJQBOOupwV0aM11GVBsE3xw8Z9AkxZ/oHDr0j2JanB4tSn+9PhgNgxvYwxaJLFRMZGbgZjkoO3EN9B+jJ32QxGI/pd5incNh5Bmcxrbd5LYtnLErVZ1pVqN/JPgKv6lnbnaYUY42Yo+CSDRWKhyASAuqjJBnAXvJnP9P7fmjoZuXb4x1w8NFfCsUCgwgkWMYOv1ggPtth+n2JATOztiXDhHG93//XxKTyMoZ/2FcB187DSJWVufSWsNCqHAMB6RMP1T4y4Q== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by DM8PR12MB5448.namprd12.prod.outlook.com (2603:10b6:8:27::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.36; Wed, 11 Oct 2023 23:26:06 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:06 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 02/27] iommu/arm-smmu-v3: Do not allow a SVA domain to be set on the wrong PASID Date: Wed, 11 Oct 2023 20:25:38 -0300 Message-ID: <2-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: BL1PR13CA0276.namprd13.prod.outlook.com (2603:10b6:208:2bc::11) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|DM8PR12MB5448:EE_ X-MS-Office365-Filtering-Correlation-Id: 32f33945-2bb2-401e-be51-08dbcab17025 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: YU+N8thMLL4YI7Yc+pR+aPz0MH39ZyFa9uXfAdO9hPcQ7c1frfrUrwOr00IKpiIn4BJdpJ59asxGOcCmi/qQZFP9pFaCyouD8B3UFyslIKsF+VUmLoYlN1S+dqD15Q/JFFBD5tsAkJHXbcF4r+bT5Etuswq1TRBsiTBFBeFKBcE4f3OT6AYiy7mgPrQDwy81U780s2rVJt3dtO5J93ANPF5HbUXCJUtgCfOvjcCcneAqvhQ8JS7l99Dvl+OhuouqdzabSsjjg4WHcfXeP0I/LMbQDXMoo16g8s8wO+V/uIKx13TsQmdX1sTB0WLFPocSKLeOI2mkliSZZNmMiSysogvcrQL887Dupt1iOy9Thek4lm6Qr0WjNrhk3RZADJQRVv0MiAdyns+ZjyVfCAWOztzGEmw0ukXlBtNB//7VhJFSYbZaAHpoV12viq8dDgT4vLnSW/ylS5J5lBVC1XKb4aNqA34daBI2HbhYjwXjJSjtPO1s/YcTLg5r/Sfjs7JfIHujLCV1uQ6bpwPmq9rEkX5Jzpw8S6+Z7VVkTTyzCwk0qJvu6EX6SWwUyw1hMFmocuaEdwOtpN+sftoO5GgNQAYksKNIloh6O1GadMzb2is= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(396003)(39860400002)(136003)(366004)(376002)(346002)(230922051799003)(451199024)(1800799009)(186009)(64100799003)(54906003)(6486002)(110136005)(83380400001)(316002)(66476007)(6506007)(38100700002)(4744005)(26005)(6666004)(66556008)(66946007)(107886003)(6512007)(2616005)(478600001)(86362001)(2906002)(41300700001)(8676002)(8936002)(5660300002)(4326008)(36756003)(4216001);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: em+mBMj5RnWdXYQzb4BF6Lmdi478rzsYw/8YzTXVLAkWLjiLeNfhiPcXd8roS2je3YmtbAtosiTllQNkGKW7vbPIOg3YSHA62GcEr0PaFlt2qKc0PoI68VaQTK64W1upKqEYAmy4zmUAZZZ06glnR6OZVYhjiuY+yBd83WFiWCYcATV1aNq1pZKTSHvZUrmZOY/SMbNYkmyCyJdJ8KdVcf/7PBYFO+F06akXgqWoQRQeJCq99CoFXvHvGAFOhKwafXJOACjnUAN9d2L9vBThjVoUhVwUH16Xqy06a9RaLSfoLRn31yTtAf4rCwk4qZQo4tHXj1QpPZH83/hBjcVW1dcTYVuqDq4ZLQHDxxbdNPu28YIBrRAaDPUxHL2kor6V/fuf8Fb+rT/boXRQ8t/+lGrf2tTwCXktHoGFJxVHF8llKaKgGAEBZq086J7OUcTsSxBcCGaRebchQXZ6u06SlthWHDrJMG44yjNwbKhH33uUJLDJkAN7H7Mi0bDkTkh8Jqne6tmb87RJdUSbFKPu84S8RHhRYPy8bEjk9tavy8/bMkcvTJHOO7NJQoSBPEOV99dBHS0WbRcgII9sU0e3k82avYvpeVX/Sd2YFV88F5Ynq+Dqni6Hqf4l+OaZdsliPcm+TerHF+gxOw7aT7vHd8ZiRtRc3A37QJFZsUH/z85/75zPUFWWbqpxYdomDT3uF1qLavb55nSmhB0NYLxmfrpWdUECSw4HWuYgiy3Ps1rdwuwVVSSoZp3PmuNBdZr87FY+BlsKn+LZqg+EmwWJiYtDAu2SF4vDQTHYZlL0ZbrHJH/3v5Csugmbcy5lJ+3mMhocF/HA+FC9nJZJWwNnp44tbvYQe7FJbYwidTjaPn00K6ukOv/G923nw/XYHUfH0QOf1x88NKyYcvZZnhdIuQvl9NW6BZpfgjxw1qOIPZSEKsOwQt7xSLE8AHcA+34cJUtyX7U0gWO8iD7HJoSGu8T9uqalRUh8hTdZqF3Eh54Wj+J1ITKkCMoKrQ8RXMFHLmQYxOq0bk8Soh+YkpMGuL6vi1SEWHiZb2tDoh1tIYQaYwcyagkB6nT9enM9KCOt7x9C3UhrXTvlijvWuA1SMR9x5BDH/VWyAiR0OIsbmHUZyEslof+xi9yU//+/tSLwpS0hIxFRz+wRCDFwgjXYqwtZBdlhzMx4cmMMHJEGc1deNJyqCOJcCZm/wTOHFs+gXyZVUCl1BhdTLyrLx7Qtc9O+0ATfrrQUo1szzJEkEXwitPST7CcpdMst7L8K+AiKxdiw5TsUmTbxpfwJh6V29m7MXHWPh7aSsBFJ0uPGchFddlj4Es8w/WAw8p9Z7t50er9CxN/GN7nB/2A64eggseEq/O1EEcKXDh37slZJ+B+72sxz+UeHGU7XPWuijMrQd3MF2TjEGx2fIn/bbeBJvhMplz9BoKzm364W5pjpyCY6f+A48E19X5wd4UUMgHznkSN+J/UF5nnrghRjOOR8kV/71B7kIioma6sbzuukNh430LDlj4AOOwcm7sH2sXeIAyocoPs9NWVE1JohnZpzmYDeavb05K79NHW+gKY9B/BKViQ/U5xkEP2f9Lpbpo21 X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 32f33945-2bb2-401e-be51-08dbcab17025 X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:04.3718 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: B8A6uzTF1SRWJH3tOp86Zg+kiJs3miX60Txj0Flfy3ENjZtusRhHE9RF9vHcddCv X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM8PR12MB5448 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162616_326995_B0594443 X-CRM114-Status: UNSURE ( 9.49 ) X-CRM114-Notice: Please train this message. X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org The SVA code is wired to assume that the SVA is programmed onto the mm->pasid. The current core code always does this, so it is fine. Add a check for clarity. Signed-off-by: Jason Gunthorpe --- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c index 6b1896b18d54c7..b2763faa17c8dd 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c @@ -599,6 +599,9 @@ static int arm_smmu_sva_set_dev_pasid(struct iommu_domain *domain, struct iommu_sva *handle; struct mm_struct *mm = domain->mm; + if (mm->pasid != id) + return -EINVAL; + mutex_lock(&sva_lock); handle = __arm_smmu_sva_bind(dev, mm); if (IS_ERR(handle)) From patchwork Wed Oct 11 23:25:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418064 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 2A308C46CA1 for ; Wed, 11 Oct 2023 23:27:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=TlzOWPW4rscojWLNkasq5SVwKRVpG8KANfqQucVWCdo=; b=pS37NP+8ZZCGy+ wv/MsDc4UkOHugkQuNKudyGLBY3KntLO0yUdEBYpdxCzNHlRTKvjh8lionxJRIuoZaIa+p+sYXLf7 tkQUa6B1HMco8oKj+nbn5xd/AOVNVPSygOVKqD0HqpA+MjjNxWWS3wMv1XiWg0MDHrJAgUXJkC9I9 KnSVSmeDEud0Tin7iPywWv0P7JUWGPXT7lrqaZ491NvGfPOtjg9FQkFkWHaGQIJpfjRyhRUeXP+rG x9izkFjJ1xtBQ4fIpuCWxaOQun7TL8lQXR7+MaT+BrUiCJtr/7Kp1U1sv7gb7sul8IZAhXmisoRxr JcDGgZ7NiLeOABDdWX8w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqibP-00Gvzr-29; Wed, 11 Oct 2023 23:26:55 +0000 Received: from mail-dm6nam10on20625.outbound.protection.outlook.com ([2a01:111:f400:7e88::625] helo=NAM10-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqiat-00GvP6-2x for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:29 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ZqzfeozW4lzNaHirot+WpvvqBZfmu15GB8pgDTqgOox86/F2L+YcGjym2CHYK6uMT0lsFp2qon65NNm2xpX1zXJdgSuNYOP0LQVRf0xYmQXf1GS9H50k177h5Qwvc+ij3jpKvsDeh/jr6ODluVIP/hTkSLmiveUft25te9ayhA6QTgwcO32H4USt3fGxP2DXR8jvvOld7R4t6v9H43fvVYQL46oo+/aN9BHPh4eUc2UnSnnOjVhPWlSKDYYvzgA0k/70/+UUc+2ipjdzFdMpBOgIsz+f3cv9Z110LC+/SshctxTp8RBorK4ArDn/yHzJsrIqSba12wq7Yypt480QmA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=8OTcy73sGprPbo9XAQi/olkqBBD+Oo6qYpg3GxhgxW0=; b=ARnS6Vzqra8cTrkARRgFS49w115aRvoKS6WqztG7F/Dk/cY83DvyKcFgTiv51yZ9iZYZHNHTAllen/93UhNOJBjopHLRVKDkdZ7b56faq4Kd7TcHT9UNhaQ0RWvFNVHBS2VaVWbbKCaMX78xhObcN3WkEfAN8icB+2lHt41/BKfx5otPGG189qm00YUo1BVZK4FO2zyugxvO23dCL0AfALAHdrPiN2g0DFYqg0aM9w1SsPCeeW+u93u8mgd5rhpXxWYmS0wsmS7IRRzEUvzxdWq1804EzJEmESuVxmwmcEwWuQvmaxvxxj3D6aYFMcYjn+u4sNCm9oON3BwgHmWLMg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=8OTcy73sGprPbo9XAQi/olkqBBD+Oo6qYpg3GxhgxW0=; b=E7aLVssJywzDhxi4wKsaw1QWqLV3BhO1u1t4zPNLvWc6SO8Kci3VAxMRd6jazDfg/0z+qOzBIWpXFl86gqTELCGukfuhJYueeNIzKfpg/GRY1xLE5K9NwjjT5aKt4M/NqXottaAwAkUNdXVjkm35NBJuv3Sn/kHL4qRcfVX22EDzLQCfZL74+h+QCJX2BKBYonZh24YF6aUwZCV6drgJ6eg6RjvqV+NO2Txf6e0LvparfXty4owU779PK/X+oFuarwywD+Yqszp9vsH6SHd7CSflGCxvE53WCwTJEH3iBZw814BXnfOJbwjGbbSL2925aK5Z+4NU4bMKuytWgI4CCw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by CH0PR12MB8488.namprd12.prod.outlook.com (2603:10b6:610:18d::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.38; Wed, 11 Oct 2023 23:26:10 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:10 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 03/27] iommu/arm-smmu-v3: Do not ATC invalidate the entire domain Date: Wed, 11 Oct 2023 20:25:39 -0300 Message-ID: <3-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: MN2PR03CA0013.namprd03.prod.outlook.com (2603:10b6:208:23a::18) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|CH0PR12MB8488:EE_ X-MS-Office365-Filtering-Correlation-Id: d8be3ed7-3bb2-4c8e-0307-08dbcab17091 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Qziks7Nlqz/hWPlk3IBkDpKU6TwIhQ4gHIIQn4wcMxrAJOqzqe8JMsaf4XtCRph9iunfXFOO5Zt4pFKUbtMxaVQFwkcidSUhNlRkXcj12HliCyyJZq9EyXk7aw9O1n2uIOfi+CZWh0QqP84VHd3INoUMc3MqBCU5FWmJsQspNrwpKxYVwnJzDZ7Qe1Rz/yFNkypAVKbxjBFKyZUsGg1nluue584FNjt6whIalUjKqPDOu/af3jDY77MbnCjdqbRzRYOqlgjtKDBAHob2lqsdlcShkOb6EgsgTzpA9HC+QwofRQ5wAQqI0nqyRpn42LBd6K1yXinyaO9MrpVDhmQbJfFQ05DKOULWAWkDU2eYxipBNe7uGFH4Q1ZTkMZh+97PsP4Kllh0pyy4yanKXyGngy5ZlMiEwQ5H9xREoIlBeyQAmhYA1aE0rPfgSo22SuJEUpAM4twwHT1mkdW/m8esN/on486pWqd6DaxvT6DrptEYAdijDKvMkP4xgTzC6/INm0KNVEKziavoIjmrJ49Tz7Uv9IrK+yTODtNeKU37lKINL1yDpbMH6RTIZcqP5KZYIm2CNldaNuNCwfq4oUO7jUZhTbMaqnFeaDefdzzGHLk= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(366004)(396003)(39860400002)(376002)(346002)(136003)(230922051799003)(1800799009)(451199024)(64100799003)(186009)(66476007)(66556008)(8936002)(66946007)(316002)(54906003)(110136005)(2906002)(5660300002)(41300700001)(8676002)(4326008)(6486002)(38100700002)(2616005)(6666004)(107886003)(36756003)(26005)(6512007)(83380400001)(478600001)(86362001)(6506007)(4216001);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: bvTuTBP1goScxAPS87lmP1ybNnr8Kznin2UvS2Z45NOWcd8cZg9e2L9uhw3wxzyOBr0pqUbC0iAd9QLGuPFvaAAoSEUl6a3HDQIyqO9526TfYjsD8k4G+X/HAUSMeNnnvJJCJVae7ZRl+C4ShmyRRh1NDPY+te+XsCaYscp9MWacW6CT63bMAVLT+dt3PDicczax3K21xnqpj5I88Jj3HQroewSZOC4jQR+4vWTCHhmLPUt5WhKNMwX2OjqWUwGFVtZ5x7vjwTGxNefDQVJX8XskJNrkqCGUgB16PubrHRG2q48kWff3PebkOOmL3DHU86v9oBVoO//noPqgmoPNe9KxizHTD1zlt9ONXAc7YiGbUY3T+7rbofQ+WAD+ibDsLncBmnhWr1HIPMSaSlVcCX8yZHAwMhjYSDDCkImcjq8bi3N4a9mFogir/ThRhEX1HArIgjI5zcMrE1teUJIElQzoiqlgA7yKMnsiC/uD4YcbgxMtZpXjIGHkNVxFrEcE7QLliyKLxo/f6I0o7txuh32fSKFWUhm7IaWsI1RP4+L+GSaaec+ue/kZC3P6e3/j9/ephGQNdhHavjLIB3qvLeSEhFv5LmJ4b7Lwzt6YXvfEfeQi2y0mLOIYuOhaq2wJZF4F/KZGzPzM97cq3CIbWoyjaGPBh8cgouphKKo3vKPULdUREN+3PfBvHnntEGvjIvhYs0nIH0CFX2b3tLDomOjoY+j/BGYReUChsfAYX3Pi6IzMT0Ci+4bYeqw1Lp95DTsf3rEGAhE+YlhmQd3pycAqqPwnvPSJI5l8dgEW+5/XkrHQdAxfE/9z5E/92R7sQJIzs7Dmc0aXZnNPHs4sOHxinf6pJNOXgxw3gaazgqar4Lbly8eK9BvrMCuhdVB10aJsZtPPEnaks7J2lNEIjsEPF2MMQsApIIcjhnM9TK3DfRMOvxymxKnPBsv30YFHMmtOzVjh/E1t3IwVk/lBD7nOBci15tZxPPj0WpxcsHCCA/L3T9tssvxUT2EWxZq71mr/Q1jZ66nYYIexob6WK7v2Jj+uzKpP4l1yjNc4wM5Jf6QfMDE6VmF3XbobRI29DqsEOrekteHdMA0pXyKRWc/uYMwwB+WqvRNrjfQ0QNtHfd4I185TYSNHiPftfKzftXpstrYgR0PmF4/6SevMA3rdtqb7VLzJF9RSbkol9LN3vAOkv1m1wf4Bes5rTyfCnJD6Hd9iCwdbmAYQ9QjDbBxpbcbheLf0n42xgOER9u2FMn3pWbDmvuUHZL3Y0dauQCFr23raH4PhTF/PFN1oMMq7YGOZVq60X5Ai5ZTNr02VSAy9WqN6NYIbUSEzIYpNKACp3eCkXcLkIACa20zza2Khl9SRSxrtPZw06DVaYrSDHieuihb0zBIKed07+lu7Eu0fGYhAROEQtaq5QXE+Oq6H1j+698TU3X/uykD5f5MPWPPPIhRqg3zCjDCc4jXzubIE6z4mpjxcNOnN1var38l/k1jOZYnhdfULXrrzyN8kfPSnqEpRcIntqk+NiLsvhlbgywz7EWYbKq3WQ2LeZqfcTYg/DkGleg90RoCHK3irmw+5h5AdQtEMY/hZZz+Z X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: d8be3ed7-3bb2-4c8e-0307-08dbcab17091 X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:05.0478 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: hWX8lmWeWyCNRIO78ZizZhiyswvC0OGiAHKF4I6DzDwtQEZk8MHFZbZMOC1L8uLE X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR12MB8488 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162623_987427_66FF868B X-CRM114-Status: GOOD ( 10.84 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org At this point we know which master we are going to change the PCI config on, this is the only device we need to invalidate. Switch arm_smmu_atc_inv_domain() for arm_smmu_atc_inv_master(). Signed-off-by: Jason Gunthorpe --- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index b527e635a3043c..ad29f1ab5185aa 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -2391,7 +2391,10 @@ static void arm_smmu_enable_ats(struct arm_smmu_master *master, pdev = to_pci_dev(master->dev); atomic_inc(&smmu_domain->nr_ats_masters); - arm_smmu_atc_inv_domain(smmu_domain, IOMMU_NO_PASID, 0, 0); + /* + * ATC invalidation of PASID 0 causes the entire ATC to be flushed. + */ + arm_smmu_atc_inv_master(master); if (pci_enable_ats(pdev, stu)) dev_err(master->dev, "Failed to enable ATS (STU %zu)\n", stu); } From patchwork Wed Oct 11 23:25:40 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418097 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id C7FB3CDB46E for ; Thu, 12 Oct 2023 00:30:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=20IGDaU3AhrWoQ29CZ6NExgvV5K91B99RVeO9ZHpIVA=; b=rAwqCW5GXd5XId T9YykXtunRpndP+CxBcG3GhfIWPhqXdxAMUz0gzuAvy95QAJb5cZ2PmqkKEJT94ModkTYRqJfZWyg RKq27qwl9+L5Kh1CAerAN2gr3m4hqoQCCFELcDhZNn5pA0V7iflpoZkb9vjKCecR9GGiEbzzlW4zn j5YH4MKvFPRfeo0xyVxZYLZiTIwpRm3ujpIQvvaeICUcmDiPnQIGB1np6R7TWyOFSa3VHjN/rgIPN ky4JU/irDHZEyPvwShqmmPR03yOd1RLSeQR+j05uQ5x9uAZgk2AuyNQt86zJ1g50gvh0cvzvcd0rS bNSCpHEO7s+Uwz+vU2tw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqjb5-00H2wa-1n; Thu, 12 Oct 2023 00:30:39 +0000 Received: from mail-dm6nam10on20621.outbound.protection.outlook.com ([2a01:111:f400:7e88::621] helo=NAM10-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqib3-00GvVq-2o for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:38 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=PMXJQwXsyoJ4vAC+IMEdN8ywictZNkJfCwmFds1Lxvn1M3gGHiJuGq65cQePV9AE+EDHK/ndlYkH22fudarak7jA1kTKOGkuDRmoe8ZYgb1+Q2s/8WZTt2opuLeKSnL0m0pejUul1ugT7g/29rRLWKV9UyZ42f8GDnYI4gAj8fKi9YREk8vCWeAMTcCK/bzS8NP5dFR+aXOEbxO7ex7CdD11aPsjXdCNPSVnJtyJPiWhW3FiaqBC/GcV38X4XhR7zySO2hJDYwG1e4keLnBRvghyjHeg7HVMoOWScMAj5X7unUbI1/qK4tK+Ay/ZP54H/9dNSQx9wY/G62TKsVH5eg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=UYEp6EVF4bOhgZJEx6pKwhXcQtIlgh/yCnWd0E8wsBA=; b=k0AeEbQ6tMXX3Ds9XN89upyIg4S64EeGgm1xjhUoHXfjZsrmDwGfLF1g1/MywTjFzGby64gXUjvFabX0KEo/VJoREo+Fso7KXx3ibf3aRgbGn+JxKAQMeqkuj1o88XzU2JYUZHTd8tjUyjVaI1R9uaBO8xEx41GvQf6ktFLFPZFXUcLG+ZhiVoUp5l95hrapmK1klxJ2kT/FBOrKG9M8iGGCQ7Yp+jDRGc5nog2OmwR8SGnhHAPdTFG1OLiwbgGcy0qibCVxNIJwibBhhIf2Z8AERAlTHmJCj7NO8dEW+Qcefo0oNo/qlkW7ulb0EM29dQXsioJ3/jndyAT5R1h7WA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=UYEp6EVF4bOhgZJEx6pKwhXcQtIlgh/yCnWd0E8wsBA=; b=IzFTCAiflZWcfzFRACHUvE4x7LVavXv25x8ZARnfb9cM+MScolgfwSZWBlMtA2n4JbjziTf+OrC+uWE4HIhupAo7GI6SZkp8GJe+NNh7ct2aQ+DN3L/mW5sAZW+YHZ9kyEgjTUNeFKC4sQGHQP1PY2icwFAi2rY8Xfh+iSWzsk+MP2lLZT0OkQOZ5aFqqpJPSjbuzSx3CGqdBsnDwq3xmPzdzRvApYq40lX0fajozdY2iJsbhMnuN2bKI4BXxu8EUNzUZtekVyNaxNzmSbamIHFVuwz3Icl6srtgkjd+JgZdcmRn72FNi1Q1AjK2DVbHecfRb3MX4W4/SaSnlvDSxw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by CH0PR12MB8488.namprd12.prod.outlook.com (2603:10b6:610:18d::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.38; Wed, 11 Oct 2023 23:26:11 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:11 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 04/27] iommu/arm-smmu-v3: Add a type for the CD entry Date: Wed, 11 Oct 2023 20:25:40 -0300 Message-ID: <4-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: MN2PR03CA0011.namprd03.prod.outlook.com (2603:10b6:208:23a::16) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|CH0PR12MB8488:EE_ X-MS-Office365-Filtering-Correlation-Id: 4f7e6e01-3870-49d0-afbe-08dbcab170c0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: L//bkcaHJiREnpqnGIQy8GyZgbl2WiqkAS7CFhVbKme1ew1rQl3kQZua2oQLSw6ltKTpkMjdEsM0dBH6s6StQkdcRfnKpHFSWSIWuRytGJ0vbT9eZrgtOyfQWVHn3xHEjOaA88qX/AUreszyT5MpzMVfHodUmU8vm5YEeGMHqwJdNedNBNUY8upWUnvmm9+EMV1+mZmRJTftMQDnQ7P7IjoQgxlkZuz5PwJJsNILoezHO9vTMu1rPQib5xpgekCbsePLMIl3cZo0TMJuoSEt8wrT3MotnLhMIK9Ohi04aEw60gYqYjjcYBNrK1YgpY6J4fpKp8OhNsicLyKWvyA0mNPFit316z+JEECKLzN3PzekPy0sJ6X7Bi28IlpyPd4AJJmy4TTui02hVC2UWzn/N/nmt7bSfCA6qUa/D0m1ifRLNiWqcY+GonbZqvw9bzESwraRxai6drF7u+I8TI3K0lnZMDy4CNoSe9GlgFqhrLi/WzlbzIcv+oqJl+Mnn/dqMzkCJNIlCUCA2fwA6EJMrpBHjYrwFkg+mIW7jPdIDxJjYHmSTzQFoNubD0Q4VHb5R7dGHM2g8uwK8NGYjvAoAwSqIKWEreK4qEbj2dixhil0gReBggTkyIMKvHuEXRo/X3oGTx+BxyfZGboSeyFj+A== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(366004)(396003)(39860400002)(376002)(346002)(136003)(230922051799003)(1800799009)(451199024)(64100799003)(186009)(66476007)(66556008)(8936002)(66946007)(316002)(54906003)(110136005)(2906002)(5660300002)(41300700001)(8676002)(4326008)(6486002)(38100700002)(2616005)(6666004)(107886003)(36756003)(26005)(6512007)(83380400001)(478600001)(86362001)(6506007)(4216001)(473944003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Br2SNpBVew9B0xRZskDy18aszMiqdrI6jWyjqCuY3+U6s9SNsWpJKMCeAO4UVXINCDbAiHgcVYVDW0ixxbRQcwQ5P7O6Y7iikXs85E1kqE1Qc0zQcozwwIK5BH7CwU2/9ZVhiK7HqSPo9x2zLFFohkAv6S5G1mDIrL+gVppzRmeyQEI9jKVq1Sd66014Z9G+PwVkgXgs+xFtyBb5mNFSNytdXaQqcCc/DDxsCXSd/i+jalPuG2tOMB1ysb1sgF87X6hsYv68ev5SA/pPvquGzPl34cNdF+ZSZT1iWze5IhumDp3FhMF/LerXJ7qYEp+J0MdwGim1UW6FAEibkBQhT1CyKSE2nibDdxUeuGqBFOFPKa/o79QT7IIZue0r/WVgJ22J+nmZ//C/mNgP4YpyKasrCT1HWCWRR7AioHyCi+w2GfTpRZrrdTf8wZBv6SdQCLPol9VcULRTWU47y3TReyC7ombmDV2Z/ePSfaasbyWPAV1upJKQIsihHNVW6KRTcn7iSZBn6Yxg+U5VM248kW38kulCLkxSPxBLtjwmXKWqbhlDHaIny6rBz9JPB+kwLn2NFtjh+qUB1n2RWQmqhqY49+aP+SVoINhtmQV97K0mZ73XS8vMpwwfD/Sm2wOmMnCbZUnA4zBhXDPwOlGuYB3Y89xAAvkq2+xEVTYmtgt3mxDQjeXR21Qm/0yfHJnYEkR8GfArtwX1j2wGZrKRR3vcwwCP6/xn0DlujijjPDEDZxWT3bME4l/9g2ABW0p46iuAlDT1SmLVWEO4qB8K5ahBn9o3+jXcjtxLKLIzv0tqCLV2oGhwtSzyz2KeoH7Wm0fV7lPsk2NLq3WE76aJoDRHpv3T1/Y004zyLPLmHXli5o+iBiy5ytCzvnrC0kA8rMJGjfvFg2bmuP2UAuWGXevtKiDDSwk4NSHKnkChT8D5Ts6xpGot5FJpZiVixUVMB+m5mSdeki71V3jETBseMPiwpTlyz3JzgR1NPpWleepFaCydLv+9CG8zmjWLstVEIC20nIYDov/aetbBpNM0LKaq0QyK5IPQlkpiczE111qEU06qnk7ocK0mSO3rZ4BVrtfUz4Uqx1pbf23gUa4TQmbNUhzI5oKVL805mr09viXxOl6kDYHE8ZptY7//au3Fm0bkssrKsmKNBXacdYU77aJ7J2dCaxNR39J1i72R85VAIP/DOVGdiniQdb1UjTOT3jDT5xN7m+y6TwqotaFK6bc4XI7UNGh9uDoxHyif6qiMAiU3P8tmFYc1DDr06VFzorzbhW9BLGbCDd1xf98NJrXoXCCCNmgnbGI4qrcyw+kSMTKS033qiEoR4G/VJIZj3yBtoz7ClfsAy3+0IY/tFn1PY1wzFbNJ4g/3xrlimk4ng+jLOe+4HjH23sSuYePdS9X3pSYf7PXEPEep2Kkjq4phjga6VYUZChcP11VMZiVli6oeEgz2qUM4P8asvRsAnR4OoJHeVby98VkzeCOACAauoOdajf4/NspRRaV13ZDkDDerZv5tw+k1275h6oHTX9D0p1uSv5aM63qxh5FPBZE4tal4IrDoq51sMbkRq5+pIIDJwYy9ZFlRLVukwHcf X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4f7e6e01-3870-49d0-afbe-08dbcab170c0 X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:05.4078 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: //yeqhetDzyylJSp3EkXaF+tQXKeEJm3mC1tFxOjpIv2yILA4oqWiBiPJ2nN9okL X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR12MB8488 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162633_927469_DF980F64 X-CRM114-Status: GOOD ( 13.28 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Instead of passing a naked __le16 * around to represent a CD table entry wrap it in a "struct arm_smmu_cd" with an array of the correct size. This makes it much clearer which functions will comprise the "CD API". Signed-off-by: Jason Gunthorpe --- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 20 +++++++++++--------- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 7 ++++++- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index ad29f1ab5185aa..2712d4cc007421 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -1086,7 +1086,8 @@ static void arm_smmu_write_cd_l1_desc(__le64 *dst, WRITE_ONCE(*dst, cpu_to_le64(val)); } -static __le64 *arm_smmu_get_cd_ptr(struct arm_smmu_master *master, u32 ssid) +static struct arm_smmu_cd *arm_smmu_get_cd_ptr(struct arm_smmu_master *master, + u32 ssid) { __le64 *l1ptr; unsigned int idx; @@ -1095,7 +1096,8 @@ static __le64 *arm_smmu_get_cd_ptr(struct arm_smmu_master *master, u32 ssid) struct arm_smmu_ctx_desc_cfg *cd_table = &master->cd_table; if (cd_table->s1fmt == STRTAB_STE_0_S1FMT_LINEAR) - return cd_table->cdtab + ssid * CTXDESC_CD_DWORDS; + return (struct arm_smmu_cd *)(cd_table->cdtab + + ssid * CTXDESC_CD_DWORDS); idx = ssid >> CTXDESC_SPLIT; l1_desc = &cd_table->l1_desc[idx]; @@ -1109,7 +1111,7 @@ static __le64 *arm_smmu_get_cd_ptr(struct arm_smmu_master *master, u32 ssid) arm_smmu_sync_cd(master, ssid, false); } idx = ssid & (CTXDESC_L2_ENTRIES - 1); - return l1_desc->l2ptr + idx * CTXDESC_CD_DWORDS; + return &l1_desc->l2ptr[idx]; } int arm_smmu_write_ctx_desc(struct arm_smmu_master *master, int ssid, @@ -1128,7 +1130,7 @@ int arm_smmu_write_ctx_desc(struct arm_smmu_master *master, int ssid, */ u64 val; bool cd_live; - __le64 *cdptr; + struct arm_smmu_cd *cdptr; struct arm_smmu_ctx_desc_cfg *cd_table = &master->cd_table; if (WARN_ON(ssid >= (1 << cd_table->s1cdmax))) @@ -1138,7 +1140,7 @@ int arm_smmu_write_ctx_desc(struct arm_smmu_master *master, int ssid, if (!cdptr) return -ENOMEM; - val = le64_to_cpu(cdptr[0]); + val = le64_to_cpu(cdptr->data[0]); cd_live = !!(val & CTXDESC_CD_0_V); if (!cd) { /* (5) */ @@ -1153,9 +1155,9 @@ int arm_smmu_write_ctx_desc(struct arm_smmu_master *master, int ssid, * this substream's traffic */ } else { /* (1) and (2) */ - cdptr[1] = cpu_to_le64(cd->ttbr & CTXDESC_CD_1_TTB0_MASK); - cdptr[2] = 0; - cdptr[3] = cpu_to_le64(cd->mair); + cdptr->data[1] = cpu_to_le64(cd->ttbr & CTXDESC_CD_1_TTB0_MASK); + cdptr->data[2] = 0; + cdptr->data[3] = cpu_to_le64(cd->mair); /* * STE may be live, and the SMMU might read dwords of this CD in any @@ -1187,7 +1189,7 @@ int arm_smmu_write_ctx_desc(struct arm_smmu_master *master, int ssid, * field within an aligned 64-bit span of a structure can be altered * without first making the structure invalid. */ - WRITE_ONCE(cdptr[0], cpu_to_le64(val)); + WRITE_ONCE(cdptr->data[0], cpu_to_le64(val)); arm_smmu_sync_cd(master, ssid, true); return 0; } diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h index 6f62184eaa2434..24a77e0a97898b 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h @@ -282,6 +282,11 @@ struct arm_smmu_ste { #define CTXDESC_L1_DESC_L2PTR_MASK GENMASK_ULL(51, 12) #define CTXDESC_CD_DWORDS 8 + +struct arm_smmu_cd { + __le64 data[CTXDESC_CD_DWORDS]; +}; + #define CTXDESC_CD_0_TCR_T0SZ GENMASK_ULL(5, 0) #define CTXDESC_CD_0_TCR_TG0 GENMASK_ULL(7, 6) #define CTXDESC_CD_0_TCR_IRGN0 GENMASK_ULL(9, 8) @@ -591,7 +596,7 @@ struct arm_smmu_ctx_desc { }; struct arm_smmu_l1_ctx_desc { - __le64 *l2ptr; + struct arm_smmu_cd *l2ptr; dma_addr_t l2ptr_dma; }; From patchwork Wed Oct 11 23:25:41 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418098 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id B3A1DCDB465 for ; Thu, 12 Oct 2023 00:30:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=JWRQZBjfTvItlwRo6gw7mOtl24JhFzB2hxurFz3OLmI=; b=S3wKxxKFWIFbu/ taqWQMzOcUjuqidIxM0dpEiEDxUNCorKeyf7wklqXhEkglcwzqeCnlUG54jNC/0Aq7+XJ/fL34iHr oic07i9r35RdxHxncZV20Tcksd2J5PIvMNGlpVkd5y5i8L42xe39OaOax65qQxcXWFK/fp4sTGJNo exqg2fWHK66/875teKHxoUFb/LUXtj0EBOCIg1Ld8DQEoIRRPaXwyPQfM6KE29CM6zNOrntcmrryT e90WBdPiFZvVOydgrh4cukElLtMlzKXkIIE4de6tOS8QeC3kb3023ThN44d4ZdpGXwoKEJjEqrMuh JhApLHry6xeUut4aJY7A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqjbE-00H34u-0x; Thu, 12 Oct 2023 00:30:48 +0000 Received: from mail-dm6nam10on2062f.outbound.protection.outlook.com ([2a01:111:f400:7e88::62f] helo=NAM10-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqibB-00GvWu-08 for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:43 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=TXhE09XCLbNMS1hIoVNs6j46U6za5SU6lWI/1CzD+1QLHCm4aa6Lm9QXgyHDMa6nX7syLA4he4PuQMDLIWHCGBO4a+tH0rbfn2i2C4Wo56vDaAaD8gz5bFj2yygmtNoJGhSpZPJs8QFTE/eOpB98hrAz1xZsaaaJTWIEq5yenLJomKufECI7HSGL91WUG3R4ClVOnaOMC7pik/nmasPzxt2nW4SuZe65LpJBdiRynImryfiRe4CNB+xddcBjOSf8lUIN5e1npaMrZvbBS3T65WI6Ll6QcFufmPM0zsgZepnmeXv6VmZKhiYdKdImQBAlbDu7syi8BTtOH/ID57r55g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=WKUPr0oRH2p16ds94vBM6a9/cn5EBb2oHFMM2y7J/7U=; b=OPGhnGYu0IUipNNDXpZ8Tng8owPXa5SDrklATg0tQeO1EGc1zELYn8+0QZKeMgJB8BAMxE5RQeB/KheqTdiLd7fIat/W3YFh3+lXsvtNcVT5VTDcFnFpArtvlErNBaZFezYeicdvbQhVsJ4fb0qsJBQBoaF871LAiFK/JlFLIrpeLwkEs7gOY+9wHNcrAvftWraF2Erhw9rgczgal00shNQIT5qDeAvEpVetFc49wAO+EZUpB2P0yl3HHZhaNGGvC8RJRNHNMDImoXtD+8Sxzs/d7d/Oyd7H7zKo8M21tUlSKnuiIb7WHOd7YME6S/04A7brhisbhkxl8hnwb6tfSw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=WKUPr0oRH2p16ds94vBM6a9/cn5EBb2oHFMM2y7J/7U=; b=sQuAY/oo93lFCdmxvSq1psXjrGf2w3JYVRlCZW8Mz0PIz5wkEyqFS0J88pmPPBeMijn7h2WtuncR68gxD+FRXkRq4JAzQQ+Q1SYO42rxTlTsUqd5qXEE8Tli2NX8ncQjE7hiwEDlgAuiAqKP7eLEXFi/1ZyElk2iAoYuUhnvRvjyAgtkXSA9AEBDbfv4GFYQmPBEd4PMTg5Od61rq5/kDRmM9EdRmImyEXes1K/aF2SZEd4Zmiae1FxCG3PNMFadGpSne6Jw+bfSUfAGL+7OeoNnP2WJmEq2p+CTUMpD6g/+4iwKFkB9fOCl9fDbcZO90Zc3LXJtEtey+tDPBvySUA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by CH0PR12MB8488.namprd12.prod.outlook.com (2603:10b6:610:18d::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.38; Wed, 11 Oct 2023 23:26:16 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:16 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 05/27] iommu/arm-smmu-v3: Make CD programming use arm_smmu_write_entry_step() Date: Wed, 11 Oct 2023 20:25:41 -0300 Message-ID: <5-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: MN2PR03CA0004.namprd03.prod.outlook.com (2603:10b6:208:23a::9) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|CH0PR12MB8488:EE_ X-MS-Office365-Filtering-Correlation-Id: 12e6fbfb-e19f-4127-417a-08dbcab17178 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: royBjEw7gP0lOvGgFlJdFuOQs+M7tUzzuaSodDhP2HGyIZzGb+MyNtrGd1QtdHtTvC1CGNnvykI9j10fBbw/vHk5sXW46WmqD+8TT4/SOZkiNEjn3bjDHDCTfiI1mmoq7mSXNlZjcSs3AgIdknu36lZ1oOz7dqTZFywywvJORjrxWZ8RhVR7PjuLR32Ay/4gsCFkfQrmw9qFTZJGz7uvePUnpra/yiYMuKSNUdMPytuZVFt17G0KGZZZYjywokow9/2GdEFdxlUr8dn8fEmn2w2zTw5knxCX51TL0qjbC8wlGNRbUCVxcalainoe/GrDbwWZlTe9xrT0vHC8O/vGZbffqLxaTr8XGoWQBG5IjYcPaTY7MLATSJdd7/LFPcgJECVBT6B1+2cvukzp2Q4CutXXP8qUfr/BDnH7UBdo5ozcBMO0fqwJ2LNVP7aZhMzAIi19BS0HXDfgePomBELPSL1Q9kZR50U3zW8in3+V46RoaclXKcwUk36U6eEoFeWYcm/c3Pezbi9CnKOzfyOjzbqhWh/J65PF32kmEV8jGZNlphMTCaWgZOSFX0lYHc8YCCcOLApd0gy1y99ENiq58OuPm4G1pmdFsT/HZ7KPZK0= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(366004)(396003)(39860400002)(376002)(346002)(136003)(230922051799003)(1800799009)(451199024)(64100799003)(186009)(66476007)(66556008)(8936002)(66946007)(316002)(54906003)(110136005)(2906002)(5660300002)(41300700001)(8676002)(4326008)(6486002)(38100700002)(2616005)(6666004)(107886003)(36756003)(26005)(6512007)(83380400001)(478600001)(86362001)(6506007)(4216001);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: lmdn4RWVVO4I3yScwLSH2yol9arWmysWURZPiMupRhLTt3gCxDGtvesNs6dtR9lLustyQZEbzod9ErJeedRP3iS+WdQjFFb5WhlTU3uu6wJj2JA8Xp8lY28+S4puT5PBUwiwZZuQEsghD1qOMXuK/1/Z8AVnXcjFRF7M1IzOSwjdE6WGsLIGa6BDJrBJWoqMcFh085sqirWGLDoYQf//SQXoJjMdfmanVPyW931D2vlwXuSFHMfL+WYHOYd9O+gTomia9ozmpWxTLVCJ9XEEzqssJB9PYYlF+T05aSI5UIOCVfb5M/V4cW+RgEad8FhBx0kxQfPxCTLCJIwPEEJaXLxm4u+Li002UYJ8NWpf+vBZfrMCRbmefRqkAzFhKrPMfWGmMvixvuG/d2duIqWByE83KNSCCGEpqTSPwfnXMjaunU+x7YcUYYTHs0IlZ73ECdvrRvzktTXtnPCO1eKGHOXHW6m+EruDazigkBw+PtCc++qguyeRhOYXSQ4TaJePDCEbqMLWKdJKYGbW6Ubxafv1vvsHt+4bdLMuBGatB/iUbvy8Uj62lR/tWUn25GEH5kswhBVqnANNBBoPkBNAY9zBH0rTDdoLhpb7PDxtu0vAAYahRoYoSRwaxbKcF5DKgDeLdPvtTeWYHLircFZo/+9XevFuTliXFnUlrNDJxQ3r7FUv8g5Ic0sBpqoVLzCiXNc2tcre9vuRhgLiMFgO8vlybU3SGhXYoL1RR/9DLIj0oWqT7V8qnPLP/OfTqh6k4GPIRIh1bwu6S9DBmBHSlFxN2ZwMrE076iDnKUJUrzINUai3Y5j0OSjurJmFry6P6OgFFjF+npBulgIM7D+hjiYZRUJ65JjvzB42wqXyz4+6Oyi81+BeuN67dqpFLzNGDc32cbzTuWZd0RhUNg/K/fSWP8gbAeGYYVAjB0DyW0XSWswHWzmS0yT4t/ZlW8vI0I75mJtpmHTFEK6+ZBi4kCZwcaNk7o69ZwU+zuxiWmK46dKWWISdNAe0IITgTG79cqfXDd95nBj/+rjDpL0zQiVnyV4g7JrYR8qV8f/hZzFbyl+gpoyzda48n8TxAQeVpVbP6SrI6vez5tdlJ0/oVEcuLR26epJtYKSSkuhKrbt9pwEtI27U+UOMWw0kKC/eLgPQ5xun3UzItD1TttHTt1H2tZYbBto1/1rq/55QJCRD1wywOgm+cKM9advZCoo1+eovroErP7+mVDR+Rl3OOQHM5DJorZD6BKYXZKqOIx/CiYwpcYLriRc5VkPjAM99a5G3tY1Z+htjvgCbK72/Ld8Qt9KltkMPZ4IBwkPtgXIM6XT/EpmzEatPgWs16FzF4W7c77NG779AlLiUb2Gw7Iqy7QU3Gxrncas/RsgKRbo4KXQfQWYu9KTnYARRHSAOrPfZrVtkAx91C5EEaw4kraGJEsxnOjhed0XjUE7oQ5BvgjJofc5E8S1lhEoqubYNIX0crKlFg71m34GvqHdj/7USNxHdkr+vCfW7VN/b77ot3RJ3PHxRQm2wxpJIYo4pcFVnWny3aqtHK52xdgafgdyJpsG4cesojKYzyH7/Ox0s29ncYkKP1FR6vQVbKw47 X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 12e6fbfb-e19f-4127-417a-08dbcab17178 X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:06.6006 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: ADpT2Z+Jl5mxQqN+J42pfAK/ovWdJkMwJo+F8sCpBM5J100MDYeSA3mzFohsKKf2 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR12MB8488 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162641_105487_090BCEC1 X-CRM114-Status: GOOD ( 14.93 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org CD table entries and STE's have the same essential programming sequence, just with different types and sizes. Have arm_smmu_write_ctx_desc() generate a target CD and call arm_smmu_write_entry_step() to do the programming. Due to the way the target CD is generated by modifying the existing CD this alone is not enough for the CD callers to be freed of the ordering requirements. The following patches will make the rest of the CD flow mirror the STE flow with precise CD contents generated in all cases. Signed-off-by: Jason Gunthorpe --- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 79 +++++++++++++++------ 1 file changed, 57 insertions(+), 22 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index 2712d4cc007421..64e11c56a58397 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -1114,6 +1114,55 @@ static struct arm_smmu_cd *arm_smmu_get_cd_ptr(struct arm_smmu_master *master, return &l1_desc->l2ptr[idx]; } +static void arm_smmu_get_cd_used(const struct arm_smmu_cd *ent, + struct arm_smmu_cd *used_bits) +{ + memset(used_bits, 0, sizeof(*used_bits)); + + used_bits->data[0] = cpu_to_le64(CTXDESC_CD_0_V); + if (!(ent->data[0] & cpu_to_le64(CTXDESC_CD_0_V))) + return; + memset(used_bits, 0xFF, sizeof(*used_bits)); + + /* EPD0 means T0SZ/TG0/IR0/OR0/SH0/TTB0 are IGNORED */ + if (ent->data[0] & cpu_to_le64(CTXDESC_CD_0_TCR_EPD0)) { + used_bits->data[0] &= ~cpu_to_le64( + CTXDESC_CD_0_TCR_T0SZ | CTXDESC_CD_0_TCR_TG0 | + CTXDESC_CD_0_TCR_IRGN0 | CTXDESC_CD_0_TCR_ORGN0 | + CTXDESC_CD_0_TCR_SH0); + used_bits->data[1] &= ~cpu_to_le64(CTXDESC_CD_1_TTB0_MASK); + } +} + +static bool arm_smmu_write_cd_step(struct arm_smmu_cd *cur, + const struct arm_smmu_cd *target, + const struct arm_smmu_cd *target_used) +{ + struct arm_smmu_cd cur_used; + struct arm_smmu_cd step; + + arm_smmu_get_cd_used(cur, &cur_used); + return arm_smmu_write_entry_step(cur->data, cur_used.data, target->data, + target_used->data, step.data, + cpu_to_le64(CTXDESC_CD_0_V), + ARRAY_SIZE(cur->data)); + +} + +static void arm_smmu_write_cd_entry(struct arm_smmu_master *master, int ssid, + struct arm_smmu_cd *cdptr, + const struct arm_smmu_cd *target) +{ + struct arm_smmu_cd target_used; + + arm_smmu_get_cd_used(target, &target_used); + while (true) { + if (arm_smmu_write_cd_step(cdptr, target, &target_used)) + break; + arm_smmu_sync_cd(master, ssid, true); + } +} + int arm_smmu_write_ctx_desc(struct arm_smmu_master *master, int ssid, struct arm_smmu_ctx_desc *cd) { @@ -1130,16 +1179,19 @@ int arm_smmu_write_ctx_desc(struct arm_smmu_master *master, int ssid, */ u64 val; bool cd_live; - struct arm_smmu_cd *cdptr; + struct arm_smmu_cd target; + struct arm_smmu_cd *cdptr = ⌖ + struct arm_smmu_cd *cd_table_entry; struct arm_smmu_ctx_desc_cfg *cd_table = &master->cd_table; if (WARN_ON(ssid >= (1 << cd_table->s1cdmax))) return -E2BIG; - cdptr = arm_smmu_get_cd_ptr(master, ssid); - if (!cdptr) + cd_table_entry = arm_smmu_get_cd_ptr(master, ssid); + if (!cd_table_entry) return -ENOMEM; + target = *cd_table_entry; val = le64_to_cpu(cdptr->data[0]); cd_live = !!(val & CTXDESC_CD_0_V); @@ -1159,13 +1211,6 @@ int arm_smmu_write_ctx_desc(struct arm_smmu_master *master, int ssid, cdptr->data[2] = 0; cdptr->data[3] = cpu_to_le64(cd->mair); - /* - * STE may be live, and the SMMU might read dwords of this CD in any - * order. Ensure that it observes valid values before reading - * V=1. - */ - arm_smmu_sync_cd(master, ssid, true); - val = cd->tcr | #ifdef __BIG_ENDIAN CTXDESC_CD_0_ENDI | @@ -1179,18 +1224,8 @@ int arm_smmu_write_ctx_desc(struct arm_smmu_master *master, int ssid, if (cd_table->stall_enabled) val |= CTXDESC_CD_0_S; } - - /* - * The SMMU accesses 64-bit values atomically. See IHI0070Ca 3.21.3 - * "Configuration structures and configuration invalidation completion" - * - * The size of single-copy atomic reads made by the SMMU is - * IMPLEMENTATION DEFINED but must be at least 64 bits. Any single - * field within an aligned 64-bit span of a structure can be altered - * without first making the structure invalid. - */ - WRITE_ONCE(cdptr->data[0], cpu_to_le64(val)); - arm_smmu_sync_cd(master, ssid, true); + cdptr->data[0] = cpu_to_le64(val); + arm_smmu_write_cd_entry(master, ssid, cd_table_entry, &target); return 0; } From patchwork Wed Oct 11 23:25:42 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418067 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id DAD69CDB465 for ; Wed, 11 Oct 2023 23:27:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=ADccrBhFPUjYEaUkWjToB85JEAuA1lKYuxSYhETkAX8=; b=Kv9HtWakDlmPaZ h55g2i33NxH2a+ycXE6XrawE4N4En005zFxaRzmdFrf83y9zZhJOjixLVoSE+MTHFmgqsHWA8kEPH OBDfDNa8pLrtsshxFUIQQ/vUsx53dYryMjnbWp3EMrur0l2wZ+JRIRhziP1/cpiGiyUAhqAPKrxCc SxomLEQakfY1VDty13euqahMvjn1wGnWSH/QzZSQy0nSvSCRYyxHpuKV0qUGWILpFY/16iqPNn6eX b94wf558jMdo24+jTTEYzbMtDPt2OBEOzkkirfx3eohyqnqmkUh2RU1OQ6RylT/mE4Os8LVrNY9kW fqXtCN5d0zr8taFgS4xw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqibR-00Gw15-13; Wed, 11 Oct 2023 23:26:57 +0000 Received: from mail-dm6nam10on2062f.outbound.protection.outlook.com ([2a01:111:f400:7e88::62f] helo=NAM10-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqiav-00GvWu-0g for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:31 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=WqrpC6loIHBVdsFnatBEmgPusT85ZVhzyf/jFy48EYSsMhJ7sQn2HLSlTBz9eieYldUIW/ox63+xou8IzId27hUsbLxnoPjMCSsfMFz3EzPk5OLLqusgmpPxTYSNj6XcsFhKGPFu2b2TUYN7U2r2yHKImmyy1Hrm4ngGEdna59uSw3pWWImlbHjXzcB6S7oyLMsJIfrWHfBEdWTHD1rqiOmkhItIONaZ/ks1YAVoK6/Gw1Ls9jRTjkQrc9SJ3Klv6oBH/ShOIb5Vpbu2CQ3Rkf+nB//cBEte2HP0yaWwPOTV/0nYnLgODY5sovYoMhJMySjxDZyMkqFGHhAwoRRMYQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=dyi5MGKMYjAkBZ+oNlyr+oZltZC4OBsol+z0E7Hwo0Q=; b=fhlPGCAWh1cUm0cwHtcxWz2UdJdWp+jrHFngkC/pfDngKMtwyB7nrrPnkYUEI+FbRqki1hh/eUrSIeQgZ1uAZWrnS4UkDkKMDEA391uZtBA2x2khUDnfZK5E9JHBZURfcA+7UgNVyFkXHVYreOreqCTqxjmEqrMaushTMOoUWs2zeuGpFm40nKfWM2sjEnPZN6k3j3fI3NftGasvHdKjrcourTjGCpqS9z0WbcHSNrrz7m3eLHTMju6XQxLTsy5Y7MugEThO/R7jtsqXvRJZiRsZ1bjjsMzra23devNHIfPVO512KVh+GNoWo65taIySqrdld5AyshjFtmAoBQ3wJg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=dyi5MGKMYjAkBZ+oNlyr+oZltZC4OBsol+z0E7Hwo0Q=; b=BL9wOKcWdubOIF5RB8II47gVc2qU4wz4iFRPU2p0kRntGRNdWEXEe2vXNkuHsvtoM9sxLnjl84Yw9vEbIs8qdnWWysHp7dSKGAA+8qJf0SoQqTCufVowQwDsC+Xb5O7S/xabyFVMv1X8J+h/ZSbW6LNtG9Z1F8EiNLL6B+96AlWAQ+7Ewl3V2nrdmO8uNWIu3sdMRQvAR2I9q0yG4p6BSad+Aqo7AsXKrt+F/C4OKuUkuuEPw8KsXh1sqv9gY+1JbGd4MU5zY3584FR+YIAP1F27sDUM7A+WzCUiRcj2nerB6mhr9We+CWvsMpKrciaHDJjb5kbgoAXL6L4+zogf9w== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by CH0PR12MB8488.namprd12.prod.outlook.com (2603:10b6:610:18d::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.38; Wed, 11 Oct 2023 23:26:10 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:10 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 06/27] iommu/arm-smmu-v3: Consolidate clearing a CD table entry Date: Wed, 11 Oct 2023 20:25:42 -0300 Message-ID: <6-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: BL1PR13CA0001.namprd13.prod.outlook.com (2603:10b6:208:256::6) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|CH0PR12MB8488:EE_ X-MS-Office365-Filtering-Correlation-Id: 52222746-b25d-447e-f116-08dbcab1707d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: noVFdu+UqR0uV5f8H+JAtnpy7lskYfz+VDAMPcQk2XCK2XsRwLV3BTaq1mTVGy/f2gsR5j0XbqGZ2+3ZKY2No+2+vVliDF6W5i0ZuIFd23jEyTp6jjbvkEzMhsjyRAKI46SPmUiKCzLnWBt03c5GzcLHilYiheUZtXnfE2EHgE/F3KTcsoOGQJFmZSfGFQ7AkR3dSBPc2lj6aaUwK4yr2GlGgnzRaOvAccVLBUTqYhOFC2TMByOsmaLkNYZVHyI3CKoUDK35Xj/dx481DwVaXrCREnlgMhphq/m60R1VSDIgD13o1V1wZmDxBmoQRQNZ4SyBIuspV2RZHUjh47eSAbtPbcWsMrkFkHeYsSZDOo9pmfLu/7xRkvNnIEDAHF/7mTVYwjxSnm1769zoYUWI2ATweketJT52ZMZeKRv0WGLra3YY5y/8RQBMWOTzbENKDqc1I7P/RcPO3pcwF0J3uU9ba43NbQblv55xVsqxfJGqK/A4uciFrMKbHihRx+6nXhL3Jb6oWLv7J+R0nxYVsem2F5EGozxKP037IIrF0GWOKJJa7iKNY+iRSmpFoknGiIBNd81DDBSaR6kjZdtwtdN96S15FsDdup1ofTGAqUI= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(366004)(396003)(39860400002)(376002)(346002)(136003)(230922051799003)(1800799009)(451199024)(64100799003)(186009)(66476007)(66556008)(8936002)(66946007)(316002)(54906003)(110136005)(2906002)(5660300002)(41300700001)(8676002)(4326008)(6486002)(38100700002)(2616005)(6666004)(107886003)(36756003)(26005)(6512007)(83380400001)(478600001)(86362001)(6506007)(4216001);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: gQwcHDCUXMA7Pe900HpWTYEBsEgqniOoa2MMzJnLkj0Tkp/een8fB7DVTtOB582lcdJloVcZN3q5ENdaf4Y+5pKqQg6CFqGAG/tVI3qBqFw8GBOYnPVDYpVWHqdO14q10bqxNfH8LKh+BPw1ENPCW7NxegfgAVYPgGRUib4u83jQQ8DQUzJQdGd70VZqyRDO1tfbIm96a2Z4oQ8geNi2wdhhA+SlkCV59uTFjvwNLkjRJzBbbSd/+OYWPLdott/YNGHOvhmXmH3cLtxwuGBce0bZOYn7lU6uIYa093xnDx2T4xI9yZ94h8VowOD8d1VImgfmON3No/oaSrQN/sUwDdwIf/fytowFaCUbicNk6vI68eTteYlFXD8IDQyphqEfXvzQeiQ0BRkGhNmh/Bk9YVO05LV3glnYorkxlWCtauhiIYd+nr0ERAl1+7bmdJm41lMO07AZ3I67YwQAojP3iS4CsVPNFn4b/9m44Zc21Cq58tQg8xNFbfjckRPgvKd1B2xktEuBHq21so0SIO8PguAbboBreOn5FhaErmAB4j1B9bNbvb+hFp5jX+J2bnMmcmSGQumiRcnsUWQx9KoR8WdMZNh6rDMNaW8inWXOhevV3sjvgLfO+z/nLSp1/eq5VCenAN4PM5/A+rey1FGZ4ExZ1p28bpfL1k6kuirl4ahxO///HtC2p3DlwdyUWrbwRxIAMVZF1F4LhOJqX5lmpaFnJCq3dvUUvI7DXBd629yu1pZDBqcIcwORvCEy+2lM10yQGVIQUSboIJ5OfBgz0ZVXQCqbmTj1+gfnFrhlTNo2XqZJ9Jwy6wqCpIvfN6VZnpOrgwIxVuNBKmMeCpyV21d+KbtBQwIWszKSwfRuNEig4BGGzH7Kxys2pnnnu6Qcu6JWkHm5y/zuCNjkNnSiHJ2DTDKUE7DTafl9vx5B3r36cRIkCgiCpBsDgidLJYWc0rE8CueZeqrz9CMkGMjB6ipfGN9qhPjwtoWrrI5Uc35bCCaVpfHl2zKVwowEnQaWA5ZiqlInaPf1lH2wUEXFkHzynqW+XAi/E6BzKaacA4XMXqTwdnjtnpWDiRcrlsmlFtbFNeaH8k/WV9dlnPxkV/2E/IrujG8aHbb503EFFq9auzL/tsjkb8pjicwiPjQ6Pd6PojRLj9E6rYANynY/R8DJzWI9I0egU8UZyUgUfjsKx9+m4Iu8eTj8wJD4ejw3v5x9XMAoYm0Z4KaYb5LCgSCFAnDNFNNqMXL0Bn7Eo5J+AzkphoPZ7pgK49+ZxIlZUgaL91+uFcYp7ZL+iQLz7HoraSEfyP8Qn5w3SpmrxuLjezXiIeVQo6luuJopJAIeu1y84fiH5/wMxXQvPXi44304AEfiN+6XRlbYcr74zRnzPF6rjd+rQSC7u+563Q7Nxav8w7EvZBJAbY0JbGZdSmy/a+PN5Z1RyuMAYASVQX+hwBD+ly0nsXSNCE0COHLuJ55eeyFRGvSK3zdyhkvLqyypu1Q3HfIGs8W7nyuWn1U5Xk3Kxe+mVxBYFmsVjwbEvi6aI3zVGk5OqislgFIwbJs8EwkdEsUqaPSb6iD6oWp5CTJOdxkyazsGQtx9zPuA X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 52222746-b25d-447e-f116-08dbcab1707d X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:04.9988 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 5F6IkSgY8WY4jd9qLu/XD4PzrPCCbeCMAQmhMLb3fC5XP2Yz+zQzPB+wlVzmfNjk X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR12MB8488 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162625_350184_7D0AFCE7 X-CRM114-Status: GOOD ( 12.17 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org A cleared entry is all 0's. Make arm_smmu_clear_cd() do this sequence. If we are clearing an entry and for some reason it is not already allocated in the CD table then something has gone wrong. Move the two SVA flows that clear the CD to this interface. Signed-off-by: Jason Gunthorpe --- .../iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 9 +++++++-- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 20 ++++++++++++++----- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 2 ++ 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c index b2763faa17c8dd..e73e9b67e4f622 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c @@ -330,7 +330,7 @@ arm_smmu_mmu_notifier_get(struct arm_smmu_domain *smmu_domain, ret = arm_smmu_write_ctx_desc(master, mm->pasid, cd); if (ret) { list_for_each_entry_from_reverse(master, &smmu_domain->devices, domain_head) - arm_smmu_write_ctx_desc(master, mm->pasid, NULL); + arm_smmu_clear_cd(master, mm->pasid); break; } } @@ -354,13 +354,18 @@ static void arm_smmu_mmu_notifier_put(struct arm_smmu_mmu_notifier *smmu_mn) struct mm_struct *mm = smmu_mn->mn.mm; struct arm_smmu_ctx_desc *cd = smmu_mn->cd; struct arm_smmu_domain *smmu_domain = smmu_mn->domain; + struct arm_smmu_master *master; + unsigned long flags; if (!refcount_dec_and_test(&smmu_mn->refs)) return; list_del(&smmu_mn->list); - arm_smmu_update_ctx_desc_devices(smmu_domain, mm->pasid, NULL); + spin_lock_irqsave(&smmu_domain->devices_lock, flags); + list_for_each_entry(master, &smmu_domain->devices, domain_head) + arm_smmu_clear_cd(master, mm->pasid); + spin_unlock_irqrestore(&smmu_domain->devices_lock, flags); /* * If we went through clear(), we've already invalidated, and no diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index 64e11c56a58397..0590fd42aa01e3 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -1163,6 +1163,19 @@ static void arm_smmu_write_cd_entry(struct arm_smmu_master *master, int ssid, } } +void arm_smmu_clear_cd(struct arm_smmu_master *master, int ssid) +{ + struct arm_smmu_cd target = {}; + struct arm_smmu_cd *cdptr; + + if (!master->cd_table.cdtab) + return; + cdptr = arm_smmu_get_cd_ptr(master, ssid); + if (WARN_ON(!cdptr)) + return; + arm_smmu_write_cd_entry(master, ssid, cdptr, &target); +} + int arm_smmu_write_ctx_desc(struct arm_smmu_master *master, int ssid, struct arm_smmu_ctx_desc *cd) { @@ -2597,9 +2610,7 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) case ARM_SMMU_DOMAIN_S2: arm_smmu_make_s2_domain_ste(&target, master, smmu_domain); arm_smmu_install_ste_for_dev(master, &target); - if (master->cd_table.cdtab) - arm_smmu_write_ctx_desc(master, IOMMU_NO_PASID, - NULL); + arm_smmu_clear_cd(master, IOMMU_NO_PASID); break; } @@ -2647,8 +2658,7 @@ static int arm_smmu_attach_dev_ste(struct device *dev, * arm_smmu_domain->devices to avoid races updating the same context * descriptor from arm_smmu_share_asid(). */ - if (master->cd_table.cdtab) - arm_smmu_write_ctx_desc(master, IOMMU_NO_PASID, NULL); + arm_smmu_clear_cd(master, IOMMU_NO_PASID); return 0; } diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h index 24a77e0a97898b..a8e7574ab8e154 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h @@ -763,6 +763,8 @@ extern struct xarray arm_smmu_asid_xa; extern struct mutex arm_smmu_asid_lock; extern struct arm_smmu_ctx_desc quiet_cd; +void arm_smmu_clear_cd(struct arm_smmu_master *master, int ssid); + int arm_smmu_write_ctx_desc(struct arm_smmu_master *smmu_master, int ssid, struct arm_smmu_ctx_desc *cd); void arm_smmu_tlb_inv_asid(struct arm_smmu_device *smmu, u16 asid); From patchwork Wed Oct 11 23:25:43 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418057 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 99B2DCDB465 for ; Wed, 11 Oct 2023 23:26:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=XYs/nM/pYeJ5rNszMcgBAVeOy4VEyVW2BMy5oM9BIow=; b=RPrWsky1Le7HFj Zu+G7iBg3B3dpvOZMLkHLk5kQodB7Uew7E150TJsRkfZrHiiygC9ijzlaCptL2wfU2luwTc9DiUfT RkmuSFJEuNZBZz+5hpnwzqjGSpMolBBRPX321TZa4IE/7vF/dABmVhM5CSbAT7nmLAL+/JGvIR6YO u0U02gi//7nyYg+r+JwElcaE+ADgMSpuQwoF7iCrCQq7h9N8f8PbZJTBg9EgiEfcUBBOlOpyjPgvQ 8a10P/dXYqk13kJVCLyFwp8QdymMtZR/ZmVdt18KymtBlmOJ41EZyW/JHfTDQidDJ5bRczUztPMiw zCORCgZN7gS+lyYVOn7A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqiar-00GvVi-1a; Wed, 11 Oct 2023 23:26:21 +0000 Received: from mail-dm6nam11on20621.outbound.protection.outlook.com ([2a01:111:f400:7eaa::621] helo=NAM11-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqiaj-00GvP3-2V for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:15 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=UFaazYTbkFN1RfhS1pe8OTIVEbuMH5wNJDUEXXpVO44SuVsZ7my6XLvvv5nMAGEv0lhvxYmefgiyPurlNklQZQboQzm5WoE0zr3/VXS3JT2vmtU1AQtoLTv7l+LyD1OYZPJj6s6Tk2gRXGZkPj+DUjiLwPKsaUGIDM8aChhyIF3iQroPFGhUFGA0IwsK2X7MZI2dSXb+ihm0jEuCT0JC00yqn6sd3oL+qGgaLlTfSDkL4iLCKhfvRF/bueurJZjvqfmE9B5Qf6KrupTQxled4baljx/x2CXOsfUw2TuHXHEUz66QE518TknYpSxqUeF+tSimArTI2KG0L0bWaC57kg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=ANiACtlUMSpceOxjO3Bpb/1w/km8Dl+vlMLfGyWkcLk=; b=PGUeGIgNtGTd4thpsH0X0xZVepr0rM9SKLEoLYYwKt2qyMHA2/jRJLga5XC78Wfx68UUu6gaVZ+H1VIBJXk++O8S8mtq550INsRiRl6FSzXP/1Atuu8YZNvDRMuQ6oh28QFT8eYhxoQ4vIsmlxK0qzS/sO3p9VRMRl3ig4GsBS44AP71Y/V2jlysp5Mtqa3QYO8CdDGSe/uuz96gH1yHBJCWBXpMCuFpgCCQnUJzlHOd4cFq+87Wo3MSpnFy3NOCsfnOgFPXwov2hQfguOBsYpOBo85xFdd6+ZIWVH7lewZFO1LhZFsWHlyKB6PBJPf/MOurecvo8Goo/fzHlViQHg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ANiACtlUMSpceOxjO3Bpb/1w/km8Dl+vlMLfGyWkcLk=; b=lT9dhAiDR6OYGBlNmDbltQLGxNJnpViDGaf3QBL5iwC/tuQKG1Gdjnn5aRz59OO+k+MvboFTrxpGK7e0itfsn6yiUy9DpgmwADPOuUltxSLixV3rOVwdoZu8i39ggn7M/FO3kqiQ6SYInlNua3CN56zikfmV8Qefj5JX9WJcBA/UjSaPHszWE46IKO3yFZeCwD89l1N9o03H/J8Z7tCRVNv0jObA7NJyp0BBTrYXArDYjpAVWUMJbfQUwVqeEyw7mcqknwYkBkfJioo+b7j8u0Lo8Y9WXb47k5hxo/p1euiuOGvrGCVLdbdaMgtHIcyGVo5Kak90DdwmyF3btyzPaQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by DM8PR12MB5448.namprd12.prod.outlook.com (2603:10b6:8:27::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.36; Wed, 11 Oct 2023 23:26:05 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:05 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 07/27] iommu/arm-smmu-v3: Move the CD generation for S1 domains into a function Date: Wed, 11 Oct 2023 20:25:43 -0300 Message-ID: <7-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: MN2PR03CA0014.namprd03.prod.outlook.com (2603:10b6:208:23a::19) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|DM8PR12MB5448:EE_ X-MS-Office365-Filtering-Correlation-Id: 362c9e6b-2edb-45e0-c141-08dbcab17006 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: IP1I6cXapBG0+TVgMzpiewwBkugiCwJYMcqie6MpcBiwt+4kd+ylSIHKhQIS/G3K3b2SbFpOqAYlash5P8nd6mNfdTOJ+JEaeOnD3a7/ubPj6LxpRE6P4q1Vxk5KkZyxMFrzj3Nf7M+8O1haBR7divbbN+wPZYhUSyVcv/XN6N22rSm+W4EL1AxLnezN1x4Jd8WSRPFZwZI/wy+Bhux4lf8i0l4/NbFvV92VDN+xTu+ckGVR4dZiHaUJuhrBv+OulzYQMPiT6rv46wjlNSo+lqa2pZpFWjjOn6kSZuCRpyE2/Ug/XCnmQF6wJKxcUacyyETmoefOxqEyqLpBNF5PbXrayoe+Y2BDTkpQZEuM5Dci5mwgIofWWVcXBt4y4s4vLoCHts862L825bOPmpPu51ONYOApqzQxIhz9SFGW8oNEBd4JzAKb23dkxF/7JiqvVKh1O1sOAL6/AOnmjFP/P15trbWRq8ypaCrtMXLeoZrHe1/jZXWQIT3fsTK97FVRHV+1XMdRuPTPww2McmVJxvt8uexBzfwQvwlVyB64mC2HBv6mALaQedFgg+/YXQ47eDxaLPi2fWeD9aihDFivUIiQ6+YSl0LO2aoEP7nzYqElrDHL9yuGPbyE0ITD1ZaFWOOoe5gIyKDfHtJiAGzFrQ== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(396003)(39860400002)(136003)(366004)(376002)(346002)(230922051799003)(451199024)(1800799009)(186009)(64100799003)(54906003)(6486002)(110136005)(83380400001)(316002)(66476007)(6506007)(38100700002)(26005)(6666004)(66556008)(66946007)(107886003)(6512007)(2616005)(478600001)(86362001)(2906002)(41300700001)(8676002)(8936002)(5660300002)(4326008)(36756003)(4216001)(473944003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: SqqgKVyMJjhzFNpREr0dZR2kNe6nEZRjAfIRenmtojY6qRwcO3RfYrshSHBeCrMI/aDRKSJIvE908Nky8nBs+nrmZ4b3DNnCCqsjmRW/6oQ7uJlmAkt84qLzrSQHi9Hb1Hy6apMM/n6GneSQ1k/yU/eX+WdLrWfJk10RYBxT6N6//BUv4Kj/gLQwOwNvPnYsfT1kknTxJA3affE27ChkKyVV3Vhp9+kerZAlHuYFERgE3QsCT4K9CGdwnuXZDKXMFXnmHOpwspppul14LqQndVtIJY3UKqYqJakxfPKYt6dEKnCnAL+QjEGGPgl9MghiKAN43OQYDjVA7hWjBUgtD02Yv+pK6T8hJ9WT5bOpwlQItk/UZ10ebgbs7xK+dprYG+F5qXlhPDj56s85/qxeOTEIlyQYzNK/BBTuKI/+rgym9BCdWdv1g/d/WPC0FpG8iNyv0Sap5HTnpbqxlYS8+1q09bcQHQdVs2Qdoo+c6blEioImb6M6SYh5y7BuFnSw/gHA+MkKhR9AurLpnp3WQIrT/NnOWw7qNHmCB5BY/PgThExhjJAzADPJdryul4fyW31imTstqsuKgMy/waFknYEJEFvA6pPaDjkIRgt4nZAqDSvrgRRVI+kq0HYK9/r9KdjwHCK+gKR7M71PMnY90Qhcg20vnAj0SXZBon+4jQXgbcZlwHZUg95s1kqi59m0M0OEoUxvTynm7mQxYjp8OQ9syeuDbnhrxOPJdorIkv4LceZvpXo+qH70/Nd4PxGdmKaH52MFd9pB+BJvV2/YCa9H0W8QXbeyCKpSJQwrKc5puBoGevCgEDI4hM+CxrsD1IWdqz4Y/7WjyGUFq3nycsz/7XAVNBkniQ+ZWi+DXiEP2sj8vSqs1+OBXBdmlnI3KknUuknGqnya2x1yBPpLbpvSBt+j2EBWlM08Vt9dZ1KiSPsagRbFTef/IkwwdI5IjFh2U6WMxog0Q4O0F3CZTFZvi71ZtnqXzyOh0/NYVmLs8afTafqX5XHhCNiORg95dKc4PeF9Z/k3wnvqwosBIZqg3YRhqZgcsHekUhuZ1brdEWqzNNOjtjNvksf55HIyG6csV39MqdznPiyUreKVBy99CQ/9e/Wsphb/YleUNjtb4+1E49ig85cwEeFEx7Ip0tSuPAl1/S+kKWDO1nFoe/rl7Y++pDULJ2N1IFGWJKUm0Z16QgptNI9nDOFMqKUvgAbisoy+tO6SCGICnCzY6LZi9sDg1coGTwts0zIestli93Ku+kR922D6Qh4HdRcFn7xfzTP1SNUv3R7aqySsyc3W/H9tjsLFFo9bUN1K1MI2j4VvOoDDIr3brI3D2wGcqdv5q+QuA/u8KMrUSu0AkasU+6w+jJzSVVIaFNPU1vQjjDARYU8LrTcpgxZXc+DBLYdfcxhPsFeskjJ7ch/KDBhR+H6zPwPZlreM1HrmVXWZWZeQHDICVl4NXM49zYeHP82gXopkxN+gEt2ONAQ6OgspeSmTJlJnXQM1jfHJhd06vldg15NP7b0+PZirUPU4s6kWH9fFkxjXlUeOpLMPptN9O9be6jrYm8idYVN+gTktaMh8+QjWXnMaa3xbcXh2 X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 362c9e6b-2edb-45e0-c141-08dbcab17006 X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:04.1755 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: VjBhuFCsy8N1rcNiA0U7gUs/ehZnbsCLu5TrJJ9/iT4LOglaphlFdhqsSVP1Vq02 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM8PR12MB5448 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162613_818454_F6F41330 X-CRM114-Status: GOOD ( 19.31 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Introduce arm_smmu_make_s1_cd() to build the CD from the paging S1 domain, and reorganize all the places programming S1 domain CD table entries to call it. Split arm_smmu_update_s1_domain_cd_entry() from arm_smmu_update_ctx_desc_devices() so that the S1 path has its own call chain separate from the unrelated SVA path. arm_smmu_update_s1_domain_cd_entry() only works on S1 domains attached to RIDs and refreshes all their CDs. Remove the forced clear of the CD during S1 domain attach, arm_smmu_write_cd_entry() will do this automatically if necessary. Signed-off-by: Jason Gunthorpe --- .../iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 25 +++++++- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 60 +++++++++++++------ drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 8 +++ 3 files changed, 75 insertions(+), 18 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c index e73e9b67e4f622..03a8e7b73bc004 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c @@ -56,6 +56,29 @@ static void arm_smmu_update_ctx_desc_devices(struct arm_smmu_domain *smmu_domain spin_unlock_irqrestore(&smmu_domain->devices_lock, flags); } +static void +arm_smmu_update_s1_domain_cd_entry(struct arm_smmu_domain *smmu_domain) +{ + struct arm_smmu_master *master; + struct arm_smmu_cd target_cd; + unsigned long flags; + + spin_lock_irqsave(&smmu_domain->devices_lock, flags); + list_for_each_entry(master, &smmu_domain->devices, domain_head) { + struct arm_smmu_cd *cdptr; + + /* S1 domains only support RID attachment right now */ + cdptr = arm_smmu_get_cd_ptr(master, IOMMU_NO_PASID); + if (WARN_ON(!cdptr)) + continue; + + arm_smmu_make_s1_cd(&target_cd, master, smmu_domain); + arm_smmu_write_cd_entry(master, IOMMU_NO_PASID, cdptr, + &target_cd); + } + spin_unlock_irqrestore(&smmu_domain->devices_lock, flags); +} + /* * Check if the CPU ASID is available on the SMMU side. If a private context * descriptor is using it, try to replace it. @@ -99,7 +122,7 @@ arm_smmu_share_asid(struct mm_struct *mm, u16 asid) * be some overlap between use of both ASIDs, until we invalidate the * TLB. */ - arm_smmu_update_ctx_desc_devices(smmu_domain, IOMMU_NO_PASID, cd); + arm_smmu_update_s1_domain_cd_entry(smmu_domain); /* Invalidate TLB entries previously associated with that context */ arm_smmu_tlb_inv_asid(smmu, asid); diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index 0590fd42aa01e3..dfcc392bc57d7d 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -1086,8 +1086,8 @@ static void arm_smmu_write_cd_l1_desc(__le64 *dst, WRITE_ONCE(*dst, cpu_to_le64(val)); } -static struct arm_smmu_cd *arm_smmu_get_cd_ptr(struct arm_smmu_master *master, - u32 ssid) +struct arm_smmu_cd *arm_smmu_get_cd_ptr(struct arm_smmu_master *master, + u32 ssid) { __le64 *l1ptr; unsigned int idx; @@ -1149,9 +1149,9 @@ static bool arm_smmu_write_cd_step(struct arm_smmu_cd *cur, } -static void arm_smmu_write_cd_entry(struct arm_smmu_master *master, int ssid, - struct arm_smmu_cd *cdptr, - const struct arm_smmu_cd *target) +void arm_smmu_write_cd_entry(struct arm_smmu_master *master, int ssid, + struct arm_smmu_cd *cdptr, + const struct arm_smmu_cd *target) { struct arm_smmu_cd target_used; @@ -1163,6 +1163,32 @@ static void arm_smmu_write_cd_entry(struct arm_smmu_master *master, int ssid, } } +void arm_smmu_make_s1_cd(struct arm_smmu_cd *target, + struct arm_smmu_master *master, + struct arm_smmu_domain *smmu_domain) +{ + struct arm_smmu_ctx_desc *cd = &smmu_domain->cd; + + memset(target, 0, sizeof(*target)); + + target->data[0] = cpu_to_le64( + cd->tcr | +#ifdef __BIG_ENDIAN + CTXDESC_CD_0_ENDI | +#endif + CTXDESC_CD_0_V | + CTXDESC_CD_0_AA64 | + (master->stall_enabled ? CTXDESC_CD_0_S : 0) | + CTXDESC_CD_0_R | + CTXDESC_CD_0_A | + CTXDESC_CD_0_ASET | + FIELD_PREP(CTXDESC_CD_0_ASID, cd->asid) + ); + + target->data[1] = cpu_to_le64(cd->ttbr & CTXDESC_CD_1_TTB0_MASK); + target->data[3] = cpu_to_le64(cd->mair); +} + void arm_smmu_clear_cd(struct arm_smmu_master *master, int ssid) { struct arm_smmu_cd target = {}; @@ -2584,29 +2610,29 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) spin_unlock_irqrestore(&smmu_domain->devices_lock, flags); switch (smmu_domain->stage) { - case ARM_SMMU_DOMAIN_S1: + case ARM_SMMU_DOMAIN_S1: { + struct arm_smmu_cd target_cd; + struct arm_smmu_cd *cdptr; + if (!master->cd_table.cdtab) { ret = arm_smmu_alloc_cd_tables(master); if (ret) goto out_list_del; - } else { - /* - * arm_smmu_write_ctx_desc() relies on the entry being - * invalid to work, clear any existing entry. - */ - ret = arm_smmu_write_ctx_desc(master, IOMMU_NO_PASID, - NULL); - if (ret) - goto out_list_del; } - ret = arm_smmu_write_ctx_desc(master, IOMMU_NO_PASID, &smmu_domain->cd); - if (ret) + cdptr = arm_smmu_get_cd_ptr(master, IOMMU_NO_PASID); + if (!cdptr) { + ret = -ENOMEM; goto out_list_del; + } + arm_smmu_make_s1_cd(&target_cd, master, smmu_domain); + arm_smmu_write_cd_entry(master, IOMMU_NO_PASID, cdptr, + &target_cd); arm_smmu_make_cdtable_ste(&target, master, &master->cd_table); arm_smmu_install_ste_for_dev(master, &target); break; + } case ARM_SMMU_DOMAIN_S2: arm_smmu_make_s2_domain_ste(&target, master, smmu_domain); arm_smmu_install_ste_for_dev(master, &target); diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h index a8e7574ab8e154..950f5a08acda6d 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h @@ -764,6 +764,14 @@ extern struct mutex arm_smmu_asid_lock; extern struct arm_smmu_ctx_desc quiet_cd; void arm_smmu_clear_cd(struct arm_smmu_master *master, int ssid); +struct arm_smmu_cd *arm_smmu_get_cd_ptr(struct arm_smmu_master *master, + u32 ssid); +void arm_smmu_make_s1_cd(struct arm_smmu_cd *target, + struct arm_smmu_master *master, + struct arm_smmu_domain *smmu_domain); +void arm_smmu_write_cd_entry(struct arm_smmu_master *master, int ssid, + struct arm_smmu_cd *cdptr, + const struct arm_smmu_cd *target); int arm_smmu_write_ctx_desc(struct arm_smmu_master *smmu_master, int ssid, struct arm_smmu_ctx_desc *cd); From patchwork Wed Oct 11 23:25:44 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418059 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id BBA3CCDB46E for ; Wed, 11 Oct 2023 23:27:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=xaq5vfUo+4n7qaFDZO9/F5wWUt4HPvN7APznMDeKeYY=; b=eaJ7yE194aBUyb 8+noUuxRoMPMtY/oMNtWQ9oCIoiz6mL9vFItnka85QuIjB7v3YcHmMM0evow7fNniY+4ILMU+pJAE 8SKZdRCNruaORhLaO1JSKkRUxIUZsAd0s+IM22lOMBUfH2ea9DFijL9PLcG+M3/3Le9b+ipsK4wvX 31AGt/HrwTPx1oK0OTYpgHeLFPDKZ8Za2VMtJ9YHlm+m8eLJuYV0geHkAKdVVyc2eNZLQXPEFxysi mlD+huyrvrMkDNp4suglYeZlaatN7vYDpRoIL8QkZ7sb3cUcM5n5e117uxjFe/j0EVLgo7DWMfbLm 0b1gczd0iUsv91poV76A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqibB-00GvpT-1j; Wed, 11 Oct 2023 23:26:41 +0000 Received: from mail-dm6nam11on20621.outbound.protection.outlook.com ([2a01:111:f400:7eaa::621] helo=NAM11-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqiao-00GvP3-2N for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:20 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=AW8ib8xNEGncRsAms2baC+vpCeQFmHs/+svNk+5RWkoxV2awo4/wSns/FBD94bRmsHuHosgC6/IUvT3HFRGw+TSwCpc4mFZl7Boj9vY00mUm8/zGrZji/aJD/PauQBd3YwjxldYQwLfywHmY6QvxqW5SohpiCjPpHDxol08DYGZbG82drb5hnuylh7B8o/2b0Rn9udV4CoLhpW3MZ1bI6jaFub0oRvwXt1whgA8lyb87nuxWcclYyMTMOm9PCY7ILOMxLW89soxAGn1UH9FAzuga/aXYW9NptWa25d/qhP24eu5qDplmJeahDlIiPIJJJKQG1bNYCmmlzs8VRVlY3g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=wBVK+0LEwLCnIooau3BoQzIuFgEzNqUTb75/TTIQGro=; b=ayYX+N51tpC73Lvx65LSICh9ZUSqnz3C8DmrqCfnoVTLFn0O82xyuqQWKASR7nLbrUpjf78NJaLiZHI6wEFCrrv4LA6qGivxdFcml88c+ZcOjqWyK2ojLXb0s79qlI0msbY+V6c8I7RQeqZlEBmHPBS0w30mvt/s8UR8Um1lIWq4anCdV522JIKfjU1LtoDSlI2SHxJg+cqcOMP4TQ024nkH0NOv/B9MdQ+9rKIo3EXs3v/Zb9+NeasATQIEWpI0uWm5k5JX709ZxwtZNJw9mopRYEGQ9Pyzpypd2huwXOR/Frsr2ag5a+pSJKNgr2LkcSkbTwRbJ/2qSXsx0C5EMw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=wBVK+0LEwLCnIooau3BoQzIuFgEzNqUTb75/TTIQGro=; b=q1/VNy0gD4GUV7dj9RzfNcWbvUEjD/W9fkgpaCjcY+/mnF1M4rhJhLsqtrp94ZyhyNYq2RNMVp725VrkIbTU89qnTgG4Mi4UsgLHH3zHIj/Tq9o4qMPL0B6cqFScEb7ng414mfIAU8vkmFIh63QExbFuKT7b9qI7z1IpzAPqwvwM5lJPcK26mHtJOmhOxsdYDQUxEMxzIPF43uBZCOIfMs/E5v76pzMG1KdK2tSTJjEeGOdwIW0Jqk1xiErypv8KYzXThbv+NVkqWUkFFvXsAkPFHAiH/aLsGgggMVAkQ5BSkksQc7dwsnVQ+e62KerQnBXHQyu2aT9fcCi2W/nPzw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by DM8PR12MB5448.namprd12.prod.outlook.com (2603:10b6:8:27::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.36; Wed, 11 Oct 2023 23:26:07 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:07 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 08/27] iommu/arm-smmu-v3: Move allocation of the cdtable into arm_smmu_get_cd_ptr() Date: Wed, 11 Oct 2023 20:25:44 -0300 Message-ID: <8-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: BL1PR13CA0276.namprd13.prod.outlook.com (2603:10b6:208:2bc::11) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|DM8PR12MB5448:EE_ X-MS-Office365-Filtering-Correlation-Id: 1b2ddb2a-cca7-4eb3-94b7-08dbcab1703d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: fezFY2Cjjt57W2qBj/fQJiYAggXGw61+JxcMMg2ZSrEFVVV/gvks6FSWmiX5UVCBzwjiRpfX3rg0D1OBQykhGfF/3ZTg6S3mKQLIU1xJsD7YZDPtt5N+NGvUXLTvoHxYF/zjxyDdJ/453IK4DqbR3FE5mbWul9XEWgPiKcIOIRKnMl4gfyvydmWGjAIDEjGPgR/dnuCkef9iepLjpnOmnuDxwqKwtqp26EKJnlmNtJtjURFLTU37LD6hqLAVDXXU7uiT8nxyFJkMdLlDmf13HxpJTJcdicG1ptq6bTHkjlNi/XlEDXSpbycqfE3PaLOLHZq87/Uiz8ZW0kgYxD3Mv5Gh25lSrCSISwfcU5GHnUzku8N2+NBxNj5zWxNujdR+4r1Zy7q8tkb5zuyZz7Mf1RuBkWqN8h2fDwQA6SnF6UeZJhOGyS4Mo/qRZurm6BgOj1/RL3iV8D227xhT92abXvedGxGYrCEuNM658cF9zc2Bfk/T9ZtiUkOQg+svOw8BwtHVuXBmwH7dpm0oQFlVWOfQiyv0XtNkHAr9lx938AQWSuOT/ubNgnRQpe65NRKIhc0F4gK7B8jnpOsrA4ED1OYGYjkIz17sz2NClnGpAoHJDLh5kGE7nGES/1Hw2vF+0l/1PoSw7tV76taYXnd8Gg== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(396003)(39860400002)(136003)(366004)(376002)(346002)(230922051799003)(451199024)(1800799009)(186009)(64100799003)(54906003)(6486002)(110136005)(83380400001)(316002)(66476007)(6506007)(38100700002)(26005)(6666004)(66556008)(66946007)(107886003)(6512007)(2616005)(478600001)(86362001)(2906002)(41300700001)(8676002)(8936002)(5660300002)(4326008)(36756003)(4216001)(473944003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: RiGMeSv9xdLUMg6ooC9vwtW08wVYhoOd3w4n9X1wix8uTPW+F3Y5Y8Pwwg8Z6o82Up+Nr8r0W/ipk3f6U2bkyPi7HZjiuu7775HnV4LfWx4bndKP8Z2UZC7tnMW7ANqHRFUxIFA/y400hCXlrDl4XwWKCqC8a1IywunnXd2usmy4n6qY0nV7tFNJSz5ZhrBi9Jp4Lk8afvDpd9q7UpuSBemRroLrixwscogADoaaUtIPStmDIdWLcRCnGFbwMT0P90i0CSJ4A63ZfWid8P6kH0Plvoh02t3t76X87uwihBRchIjn5xTieRuU0WMq8Ldx31UPe2ttV1AxKnkgL1ak+pDkWYZbW97XCZAtwnM8fWsOGyg3MdbHllavHdPU/PYRR3QqQofhWfF8mkgpmZMM1smTPQXOWlIuP4WONwThoAK8aw/OlmK6Y2bElrfgHmh7U/NBFoiR8aA/2KpsFjkTH3cg4FBljZI8hH99qFp3rmI2EYYNTibkEWSSR9DEFWBBX/S7DHFTahJpIhnPBzZsZDleT/W80Zj3dJlYsBzdxakj3Wo/AHzNq6louSf2EKh6gjrpplxX/kMsujKmJMZLGvP3sfAsu2WbsEFk0RVotHryYEFSDZUX0vB7UtSFfyLtcFvZhFyywyH8MtHfrIDCQBmavgzVb5HRLU+ZRMu5BjLmbjYLYx9IsijMWpE9Bk+CJlnFASIwaSmzu3WPiMuebx8uo5l1v99Qc1kK/Bc3cXTrvwVPS+TFDdDy5xtpScQ+ZJlCNhlCbGPwBPl1GqoMlAoV/YUC8QkdAg7cNvGgZzu5rKPOMjOCL8K0K2iuNpcJHC4X/7FAApgZ5ux3zF9iSuXJk/ZZzY08e7WbTXf4jWCfrTsQYm7xUMhBs/ngmPZTD+Cp8On6peSeAYIuwbAX/3/VThZHKtZZC3solE15CAOA1EUoduSqjHoVz4CiDuDI8QZSDtYNgD8u0dBkRX4NWyhPBcS4Xlj7pN5KItlby9T0HfdqmceIatNSOluLkE6o3ubW2gDCDF7k77mykH7Y8S5FZzSIjaDX21kcgAS30HRw2fQMqhL5jfSZ3XyIo5Km9FghTx2QTHei0saNPs/2B2ffMWHYAy2g6UTfK6NIfMwYiqLfuHh5L/i4N54Fit+shclIzKqDzaoNccROrTP58h48foo2/FxJQfSt9aydkoyK28iIsaca8x84ZxlnsrhNrdUoARsUsLn7UNdeUu8NgZSzxa28gfugCr29DrI91+0MtuOqvHgxU302NHeeiGShItedj+tAZwoWqKEQ4nu/QlmUEr5YL0kudJa2Q5nRi3l2iENqwj+ac/uaW2ffDMlrIoarx/T9G9mAo25uYVK3U131MTq3DHuYQYMcMJJrbO1385MIF1uF+54u/J1nvMkIZzmQrYS91vQ2sUMlfp/H/1PHKpvm1Y3IdhNPPMmgS1WFY7SdGrvatNRL3XZdZV7+nQUveOVowJGT37ri4fwh8j0Yudlpv9J17IigTfd72k9J0NR1zl/t2mOAlY7AAeksPGhVeNv/+DlCNkvw2HjaJdSACcs9EAy0bz2yO9BP6HnLzK+szyujnXVZdiEFcuKY X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1b2ddb2a-cca7-4eb3-94b7-08dbcab1703d X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:04.5486 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: IslkDG5C0metXZXH9OBm6g9aenwEhwaFg2PE/kfsJFQSCsl2UvxW/Cmpe6p1ZUTr X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM8PR12MB5448 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162618_796734_E3912F4F X-CRM114-Status: GOOD ( 12.17 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org No reason to force callers to do two steps. Make arm_smmu_get_cd_ptr() able to return an entry in all cases except OOM. Signed-off-by: Jason Gunthorpe --- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index dfcc392bc57d7d..57ee7be8523363 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -89,6 +89,7 @@ static struct arm_smmu_option_prop arm_smmu_options[] = { static void arm_smmu_rmr_install_bypass_ste(struct arm_smmu_device *smmu); static int arm_smmu_domain_finalise(struct arm_smmu_domain *smmu_domain, struct arm_smmu_device *smmu); +static int arm_smmu_alloc_cd_tables(struct arm_smmu_master *master); static void parse_driver_options(struct arm_smmu_device *smmu) { @@ -1095,6 +1096,11 @@ struct arm_smmu_cd *arm_smmu_get_cd_ptr(struct arm_smmu_master *master, struct arm_smmu_device *smmu = master->smmu; struct arm_smmu_ctx_desc_cfg *cd_table = &master->cd_table; + if (!master->cd_table.cdtab) { + if (arm_smmu_alloc_cd_tables(master)) + return NULL; + } + if (cd_table->s1fmt == STRTAB_STE_0_S1FMT_LINEAR) return (struct arm_smmu_cd *)(cd_table->cdtab + ssid * CTXDESC_CD_DWORDS); @@ -2614,12 +2620,6 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) struct arm_smmu_cd target_cd; struct arm_smmu_cd *cdptr; - if (!master->cd_table.cdtab) { - ret = arm_smmu_alloc_cd_tables(master); - if (ret) - goto out_list_del; - } - cdptr = arm_smmu_get_cd_ptr(master, IOMMU_NO_PASID); if (!cdptr) { ret = -ENOMEM; From patchwork Wed Oct 11 23:25:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418053 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 0C605CDB46E for ; Wed, 11 Oct 2023 23:26:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=GDqiqtag7t069ESfaczOrp5F5vzQHxzK0e6Qz5TIB/w=; b=mrNrWoWoOztx85 y55xvg7hg9Y0L+la9Lt+v+OH4g8xB06hzb3CLQlw02nBBTYeQlwsZSakvL8SJx872WhzN3vm/Lo1v yALCgohmbfHQReq4f2I29rvDKa43DhWBB8jsN/zfmgSwcoqFEIgajOfsicSQTDgY9VVrD6lT9EdUu /iac6N7+RIUOdnaQCrbynEMPGvCsWKtRyfeQzvg6aTKd0rIFhMMiu1wV+ZZkGyIZJB6FhVQEKGI0S ICg43V+RxcpfV1Puy4vsdK4arBitavMbywle36Bjzd8NwiWffCTUc4BFld2HQ9io8+x4yEXvGnl5A 73/mok1o7xGs1l6/S0dA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqial-00GvQh-1g; Wed, 11 Oct 2023 23:26:15 +0000 Received: from mail-dm6nam11on2060d.outbound.protection.outlook.com ([2a01:111:f400:7eaa::60d] helo=NAM11-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqiaf-00GvOz-2v for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:14 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=eCx6dJ2KQRq/WDROlQ5tu5bXDJJ6fOaKbOKAqcblSRRh0aCgqP5e3yeNkEzE5AAglzT1GZQFOHuQwXmiVL/SAstMK2TrpKqzswnpMy03YvwmhUUps/5vG7rjkw44kv/+VhXMUojKbaAyAdHlAPji9VCKnG+L5wh0tl9R7D5KMnKFW5Uhbc+p84xkc1ZkqwwQyKitMi5aQn4/XTjAzhmAGIgYzHjSf46ILmvX4jP7oaEzV75HURfF33y5r8C0//cogK4GTBLp/JLdEMl46n5eiOSiKTdDOmQvEkSrqPkZzb43Ihchs4KEn3MpsfOI30PP3ICzswJ4qIs/VkS1XOfR+g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=e/1qnHghgEcTALmKjgXJCPM/Jx+qPKcGxfxtKYjB+8U=; b=aTqK26nHN72DGjWXKptZAkkfRvvIRJWIrn3t+WXmOgr5EXUZl+Z1WCXy+tufUoJDtlShiog4lKp/oQPwdpumAaVB/yXNRDT7lWxfSBALm8PAsdF+R6Vk5vjcUeoHNRygn94Q0xPot3L+PB8dJPgDyrZtA8f7j3FMJQHsyXsODXzj6zWYZNDvZogQ25u/MzbL10UK1AQpS9zHnmDYi6dzhUyOwA/JLifMddp3oIf8zhgSlMcw6wSaTEh1chkq3KeAkPUeJyM2Ob/B6ejtlXhD1H+7ticvQ5ZGJdTvWQx1uOrzQ8ywEDFgUO4bofYcy+Rgbl5g0G3fFagPkcAIjL4EJA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=e/1qnHghgEcTALmKjgXJCPM/Jx+qPKcGxfxtKYjB+8U=; b=oUvhjkfW/6YW4JCdrLtHS+JPyR9rKRO3Kha5DsZdhji8w8EzpGz+wgXTOhOzJqiLaQ6nlN8Ixm9f8+MpA41DLLgEecdm60bRXHnWZUPlLelxggbEjM5WLAFIa6P7Ms0pMZo5bcrlAPD90Q4QSd3rxDbARs0d8qx4U3arzLSMzH2/00JHki3baKEhvgHAGOEqEGXATyJ8d+rS3uExlGsHWD1vRR7ov3wycZTbKCURxY1kQGbieEKddA8yS6BanFYAEc8MKvwrjjE8ctZYCRHTYeLg5pIGh+iWFgvj9+KbPCFI/qSuQaq1v69WutevYtGls+rIfald4sc3p9x5Wr0bRg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by DM8PR12MB5448.namprd12.prod.outlook.com (2603:10b6:8:27::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.36; Wed, 11 Oct 2023 23:26:04 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:04 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 09/27] iommu/arm-smmu-v3: Allocate the CD table entry in advance Date: Wed, 11 Oct 2023 20:25:45 -0300 Message-ID: <9-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: MN2PR03CA0018.namprd03.prod.outlook.com (2603:10b6:208:23a::23) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|DM8PR12MB5448:EE_ X-MS-Office365-Filtering-Correlation-Id: 14c20d92-de6f-4c07-4d24-08dbcab16ff1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: mMWAJ0ws1OSWNrcccKLn6B66ktOvFyniuPhAP09VsUdwOjXESOBc4kUtm6za6wV5/oYOe1SJ81m1u6kvxlZpZyzMuFlqd8NrZunD9gyjOdh3rtvY/G6v5PbzQ024pJoo/kpV/XTfbBqTwNPyl0ia+OSk+MXahSztrrT2TNS2yaEE72FwMVxpNrhp8bPexEu9LuuMzcmWfs4lz/50jLRJqXFBo7IqelrH1LF39umBEZb2nmiJTfOimDCIqDjQ4txpZSJZB+Dddsjroimf4U3cCgCRn1UiElmsa3lz55I9kVgaLT5BsXXKAnu2MKs5Qo+odDw4s7QvFTVPUKKoSu7FXnCXhlTxGQ9xQdX1HWquaEdkU3qhWARgRfEuKumXvOK9tvnx0YGTgDYBeLdhrPxGVzCMTRs9+wzMSATEyucOybJ/KBwU17vzKZuGDUypDdGGlhCALtq7xy/4coVFYOtTN0xW/dKTpe90ekuUldsrZ2VlkbVjWvRLTiSTfVEm0uYF7qCvsQFei7tZ41EUl/ArnbWw0hTIhPHF4NYy9vbt1fpILmRWVkAhM5hMOWFx8Rq0iDlumzZFmJ7/SjPVk5n+0ZU+3m4CLJE7CjlHhzIlREg= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(396003)(39860400002)(136003)(366004)(376002)(346002)(230922051799003)(451199024)(1800799009)(186009)(64100799003)(54906003)(6486002)(110136005)(83380400001)(316002)(66476007)(6506007)(38100700002)(26005)(6666004)(66556008)(66946007)(107886003)(6512007)(2616005)(478600001)(86362001)(2906002)(41300700001)(8676002)(8936002)(5660300002)(4326008)(36756003)(4216001);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: uZ5FYrEylHEho8jjsvhIgFVgzGjFJPh0W4i+jyWcLD5T5JEvCdg8l+zMuUz0MOZoLqtHa+iOCDZtPYLoNDMg9N6c3ehmbGgvdZd11mG1z7mOk2t0GCNlT/qG2YrDCWOzCrqPFuh2+Ntoz8CM8tVwv6fEORFWnuXv1iqrAHHvunnKKri0+IbxykaFNpRtcqXD+lYwzj0Jbt3eilzFVse0FaNBxRR4CsszQcucSghyvA9rlIwEjZMrXDgsm5xmPshtA7005DhifdgfKZyt+DqiJd3L/lLgA2Wc3PIoA2Z5HJlsJrg8BHI3gasMaezLGD0cM+B4b3+OTD/MDyw9zCCpQ2kcx39xjDgSYMpA+ePWvGMseDwcYPZ0j+bZnMfR9IfIQxP4wMfSWZIkXkLO6U2tsWWstFC2cN06Oqva7RXQidxJ01Lotn5vFotPpwC8iQaiXm2kSSqzvyBp6MRlMch/S925ic8+KTWJQp485TIdUOeyGOPywaGFbB4v131cHQnvj49GELOKM583MQHKlJpDP+9QO9nS7nkqxzVCc2yzJv62HKa0/RJ9iq+Nz9QwkAHm/W13GoNF0NkyCsmJ4ELjM80iAzdd55e7IPmrCNftysI+0ZYYGEUcVfQPR1XxuWmt5eq0EvV7Hb5qfjhjhZKuEZ7E3c2tQfC1ggMdXBzdBV0vyp1hoe17vw0CEg/mF4Qk3pv/bKRsXpv1mkr/zULFr09ZBKwJDagFKx64VifcO6e82qmDgpe4jr5UuJAuZkDjX5vNysP+Dxcb/j3BKuVmt87bFYrnEdaQfp716prtMZm2v0vTCLydsYIkE4nlMWKnS/NieNSxivWhPPyRd0t0DGJz46XybKKbb71Eh6Z8EPptgS8cRLox3mDwVRSy49lsIV02Nb6Z8CdyOmBi1ugpESBStuMVgiQ8Tstld3+2qIAQY2m0RsBZpFCKjlHsIT80Hmwy/tR1/ZtF7ZIsj7V/qZUk+2S7uA7HwMcVOquSGqhgTMnnUvF+Zbse5pjeD8JAp6aNu05swXKDuYVlK/q7ImyCHlLd4Q6eunCGuE2jEWuunwaJiwm1+Q6EgVlOvpPop0XphWacqt426/kLPr+j6cTHFJS0kENsIEN/yDaiL4wcaYliYBA+pWjgM1JEYbYRIgUo8Vvy1WEvKhhRRHNbEHU2zoq2/kdqnOSj6fm2ozWl+TpVtd+ATD8n2tuf6UN7+Q16wBGSB39ONuC/yf/UbKdfoHUGPi1uxhwXGDe0LAwcsC9NgDManAVPzbrIugwrtTznfU7uzdd8Tq3MnTc205moI/yX5aNxPrHurZDNoi4UrguN7P93wnFho/XHb+/NBwSeGP8QNFTakKacrshGnki7IU+/i0nOcQsVME3+pwI7To6s9PUGqgfQuN6iNet0J5MUKDi7OnTi6LYcQBvADmpqtBvr7mY56YLIrkuMWF3EJxnsSpu7mMPsVd/fQtDefyw6kpULzenFwRSCik/EFbYKjdEtmwgU57nMm79FxCrP0L9Eq4gaOJQXZQ+pivLcRKf3op2HgRJcWkT5U2QrdHDVqLh31ZeWSTjjNltXBUAi9Sbbo6KXlQ32TXzF4shP X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 14c20d92-de6f-4c07-4d24-08dbcab16ff1 X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:04.0816 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: mh/AgiryT0ithvkYTe8tHbgBy+uQVf3BsyvF5BnJ2bUn8V2zK+PefyTN62NoZrND X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM8PR12MB5448 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162612_999666_1CA78095 X-CRM114-Status: GOOD ( 14.59 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Avoid arm_smmu_attach_dev() having to undo the changes to the smmu_domain->devices list, acquire the cdptr earlier so we don't need to handle that error. Now there is a clear break in arm_smmu_attach_dev() where all the prep-work has been done non-disruptively and we commit to making the HW change, which cannot fail. This completes transforming arm_smmu_attach_dev() so that it does not disturb the HW if it fails. Signed-off-by: Jason Gunthorpe --- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 26 +++++++-------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index 57ee7be8523363..e83fe8a1f8eef2 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -2571,6 +2571,7 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) struct arm_smmu_device *smmu; struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain); struct arm_smmu_master *master; + struct arm_smmu_cd *cdptr; if (!fwspec) return -ENOENT; @@ -2597,7 +2598,13 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) mutex_unlock(&smmu_domain->init_mutex); if (ret) - goto out_unlock; + return ret; + + if (smmu_domain->stage == ARM_SMMU_DOMAIN_S1) { + cdptr = arm_smmu_get_cd_ptr(master, IOMMU_NO_PASID); + if (!cdptr) + return -ENOMEM; + } /* * Prevent arm_smmu_share_asid() from trying to change the ASID @@ -2618,13 +2625,6 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) switch (smmu_domain->stage) { case ARM_SMMU_DOMAIN_S1: { struct arm_smmu_cd target_cd; - struct arm_smmu_cd *cdptr; - - cdptr = arm_smmu_get_cd_ptr(master, IOMMU_NO_PASID); - if (!cdptr) { - ret = -ENOMEM; - goto out_list_del; - } arm_smmu_make_s1_cd(&target_cd, master, smmu_domain); arm_smmu_write_cd_entry(master, IOMMU_NO_PASID, cdptr, @@ -2641,16 +2641,8 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) } arm_smmu_enable_ats(master, smmu_domain); - goto out_unlock; - -out_list_del: - spin_lock_irqsave(&smmu_domain->devices_lock, flags); - list_del(&master->domain_head); - spin_unlock_irqrestore(&smmu_domain->devices_lock, flags); - -out_unlock: mutex_unlock(&arm_smmu_asid_lock); - return ret; + return 0; } static int arm_smmu_attach_dev_ste(struct device *dev, From patchwork Wed Oct 11 23:25:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418100 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 39CD9CDB482 for ; Thu, 12 Oct 2023 00:30:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=yBeCrqNH6EnrWQzSqvmuhISpckbK3WRFQpu9OToLEa8=; b=mO1Iq4qVFs9DDD 40o/7L+OlJZIpMfl5/d6I0VwHEJm5mld46moYXyyJeQwDlLQw7vuQJUCvFZ5RanMlpfYtjcWyT7iN IAVP5UpF4gincskIHNMBatXVnBhTdBya1tSCbzshayl+5vf5ugsJ3KOZycwHj2ai9U9c7mYNHJHEJ KjU6NHoUYNtIIsXI8f+N7KvJ2h+1jjgf0/LsiqO7etJKnPOfgh/SDWis1CpRDZyxH+E6GiR7hKiCX 9N3DiwD31PdjvWSg8bignB4V32GYcA+YtS+4u7IchTX7UIvtVIyBbLSAG7vxT3btSjzZ+njWa6BpV g01zQ7dVdh+BjhCIpfHA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqjbD-00H33n-06; Thu, 12 Oct 2023 00:30:47 +0000 Received: from mail-dm6nam10on20621.outbound.protection.outlook.com ([2a01:111:f400:7e88::621] helo=NAM10-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqib8-00GvVq-14 for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:41 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Jc07lMeszphUe5WTW+Ni0xIv8gFz7asY/nlHz69TWNvEx41oMWyC2H4cbLhUYIaxQ4xZa5Nm5J/6svdJ7dUlmNijN4nC8/kCLy20FMW+6VjEGC907DB5GQhy4j6X7nsTmPRdxMehz6OQTYQAZ5zRMYuvmRakRcXxyFVbBlRVozOiWCuPyzHOM+KR26ciVRd4U5DhnrmGauP62jlwd8kJdh8I02RNI036uGnW95YW6S5wp6a9iCVR1BpYX87VD69ktYPoTZW9+nRV1ldc2RDbd5b9mIrwJRaw8GW8zjAHXzm7ZoaqPWY94upyArNeYRiGMI+ix9GirLFbkm191cn3qw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Mp8FVvZKSXYfhl5wczCdMR+4fmPeIChmQiUiL5g5Nno=; b=jgLx3NLPtr52d1dZBK2qkg1U2seBwJOIUVgK+UyvxUEHFAnh/nxkon9vNRRye3m44Fhe9FBunFZ2DZ/8YsniibkFJTgfowrZVw+BdjcNxke/tm8Oj9Xdjlox42uI8QXx3DWBHvGiYYaG6FJlhQ/pqz85SsIDrPMVBTRscFoO+G2Zgdmd+qh7LT0hEuBZzhYvyFSp99xErL6zNP1U9rq/jLx2oHWskMFHMaqJOlsetVMx3shVZ+IIMP4pDy7Hshoz5dkvbCYOY1kr71V/s9t+8Ae9b+6CGFnWhByAydrDuMCtf0rBD1lJn6kakBfWjE/2f5kaWa84BbTrnLeBwUWILw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Mp8FVvZKSXYfhl5wczCdMR+4fmPeIChmQiUiL5g5Nno=; b=MNpBU54TpiWMr9lHIOk/NE+DK+GMT8nMr7tesFutHE54UsM9MoaO5l43CizAR2BT6xV65b/qY/6s0RvxHBXC1ZHZ/80Is8nRO2rWQGmf+qhxwbqjOMJ9suCQZVeoSa2w1dw97Iwt+6UYa4QH3ELqr6EjVpol3C1948LWPTFvga0DJ2d1NPPe+9+qWQxHji2xnYVBOoRCF+tbfXoXwl4bT/UyLA93OLrCr4JN3hdZ1BXYwdKhfuyxcWJ3Rg3UoVZwZdoGVT4atM+dTNqxDlGEiASaoiqSxCaGgLz/fKHbZwZzffFtN5GKi+96qkpfabxy9igcxggKMtDkZ61haQaa4w== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by CH0PR12MB8488.namprd12.prod.outlook.com (2603:10b6:610:18d::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.38; Wed, 11 Oct 2023 23:26:13 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:12 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 10/27] iommu/arm-smmu-v3: Move the CD generation for SVA into a function Date: Wed, 11 Oct 2023 20:25:46 -0300 Message-ID: <10-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: BL1PR13CA0022.namprd13.prod.outlook.com (2603:10b6:208:256::27) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|CH0PR12MB8488:EE_ X-MS-Office365-Filtering-Correlation-Id: 70b4aa7f-a78d-463b-8610-08dbcab170d8 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 8gA/Qs9JdIWNYGulwckf3oYVlxXCiFsOEY7zZnSt91IzmBEQgHKIAvmZaTIjBixqUops6QkCfI60RNn8lK9xfxKCPU1VRWv8ZfVhOC5EeMtRYJC19ffRWzYGcUGmHXGrpsYP9bYX6/jOALoTmrWzCLI90CgBFDv1O/5ZHdMeYtHqjqn9jSh3H8CQ0Ri8H0r2Z3xdqZupzSi/uufivGRWTffTKyOKRRipV2n/jYMP7PvvjkIz5psd/Gq6/7Zuh+9JxTtgEDYUw7OMBI0JeqV+yg40PzllfasVas3Ep0YHGH8nh1A2kkUiZQ0SEs5kqKnp5mYv5Olw9eb7yyWlwkeUMuTGY0U/MgC3sCmFnIAdWVLeT868y54/n/y59tPUaNiNlMskuq9QGiDyh+ly3QrB/s9vhuwl+nyW3xvjenpr7B7bYFPJd2WWQNkGIMeZVHsP901FHCGKbkKGYjTclqZKeTgXb+K+seuUdJ6RDkQ1wPQ0cg4MbN+QOwzRIjN0BnIPAvyeG15BgoEUQLTA/FwlB0NKTDC+RKCHbVU2cerdFx+0Anuhu14/CG0ulcoSMlvacbS7ZAfCx/V90/xhM5q4WP4NU3C4H5dGPGvQamrZvCOV/wNGa4nqRj2LorPnuJzRkYVRCXJg/Oeipv0y7rnUFA== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(366004)(396003)(39860400002)(376002)(346002)(136003)(230922051799003)(1800799009)(451199024)(64100799003)(186009)(66476007)(66556008)(8936002)(66946007)(316002)(54906003)(110136005)(2906002)(5660300002)(41300700001)(8676002)(4326008)(6486002)(38100700002)(2616005)(6666004)(107886003)(36756003)(26005)(6512007)(30864003)(83380400001)(478600001)(86362001)(6506007)(414714003)(473944003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 8TQwrJIZFeQbWgN7uNsKfeetspNt8H4YZJBr2GsycGnkB8Uw0Y/7irq47bx1ce4+NlVrz8rjyka5rd+c7NeJtCZICpRm22d2G54DKUuatJ5A0gsMaBfWIuA8OGqle/MXpqiih63Fc0DdKceQ9jWSQVOgYVcvbEveMykgsAUrFzSvFXnSdAIXCBTNNX4MMVMpYbAJ0fsUepslcD04x4msCLm55iyC04M2XNs4AGzfRa2fW0EfWzNZAtYV7mMdCrhDkdVmnY6eDPEdIYJsp8nrAjPG0YHwIpNpTvCDndjgCV9nAYuANW8aFvAPr1Jtf+2yoSUO8u89e7wDmpnFl4fqvnWXRu/9NozT5rxeA1gVLd3ghlKhKeiTJXFDp1Jbuz37VnKo6BE6YTkB2bW3Niy7uqLgO5h+Ni1IYEoId89ddrtztoAezvUFUQXPZNr/zBf3zw7PpxwS0BKDIKOvleam0k6AbBH3ynGdqfQ6xqRh09vrB3Qjzl6UP1MaMSr0lmFY9Bw1nUecryMTVi/5hOqRXbRDhdVo47jKMbzujGgIgARQmqR3P6DYiMyM6HNTv/M1bZiKrBjrIGdx4a6fA5obZz2vSBJWAVIuCmRbBSzMbBOoTJcitbiEYRJaEYe3uVYuAihwfdGzcQFjmt/oJBlt9h7XJGW+/5taUJTHRtcPpHNQUxUfXu9p6aw8nYd59sIl7oDtOodjVqfGKAG96lobwtQqf50y0arU6WIvqsU8TS46YbK9g7bw48jSbcBq1hIu/xtgvuDEyuSx0ZWAjm6l5ML1NWHpqxY7+cGzFvv2C/42wY6FiXCEFgzjO+5HIK+kq9u5ABX1bY+tzkDxTwLOD/2IbVy0RNUDHa3iZ+S8RQRHRSBSX/C1rDg79ARJxllxTSrUMkVYTK0m9c/Ap00yQDIvqAqZ6/GzL/Eh77dzGynYfsVzGkAa5vTQdwXRXETodHdMrKYI08w3kOzEbAPXs4mGWxWV/woFxpCz6idWGdQ+2hpn79krziHUnASE/FAp9aBmzLJ8gd6tEMia+ZwRsMaxZ+xCRjHtmT4vmQvUuExP44oKz9nJknZ+s3JwG+xV3bZph165HAOSJg1LhGHAbWVoF+ASagmzbYkBwXFTNe/MF1fpJzdvAGdiOg0dBK2nPAJdhx883oDY8Jee4WBvI9dDVo/3Y7QdIq8ViVwaeOQef5vCz/3AG8MfcSi8TPXVoephNBtS+ilRYGSi7C9tx//EKQSeIpway+fdsTR1csD6AgW7O0BlRUSnIcdbuhL1nxE/gHzoWXRHpudMmCtGVQzT0P+vBp5hV9o2NBmskXVXxG1twSdbmqfIT4XWCHeBE7O9WfLRKI8gXPFjornYlDXq9Px9cNcsqkx5RDtAzhOOysa/x63STWPg7kUhEB85QvQnB4RA6Gt29Yqpa9HWA4NjZB4jIwp6vAHL6Npgrs/paKnxXED6LrE5VaVU7p97hmjFMVXiZ3az6f8bx/2hDgqTuR5OlZkYb2Ha7xkBa3fDPJoj0KOkzVF9nxW3S3MyY9tAVyRKWwrjkq4NFuZNU4tkAJq7pL2f+4z/7LqS0gC5+1u8HcRlUbiVR0nfCrZl X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 70b4aa7f-a78d-463b-8610-08dbcab170d8 X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:05.5516 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: chsy++5wSSm4bWYQjamzNQkONGpum5ix1xo87TQOBqfM9AbnzmjoAHNM2brDvMQi X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR12MB8488 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162638_388259_7F857E44 X-CRM114-Status: GOOD ( 23.66 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Pull all the calculations for building the CD table entry for a mmu_struct into arm_smmu_make_sva_cd(). Call it in the two places installing the SVA CD table entry. Open code the last caller of arm_smmu_update_ctx_desc_devices() and remove the function. Remove arm_smmu_write_ctx_desc() since all callers are gone. Remove quiet_cd since all users are gone, arm_smmu_make_sva_cd() creates the same value. The behavior of quiet_cd changes slightly, the old implementation edited the CD in place to set CTXDESC_CD_0_TCR_EPD0 assuming it was a SVA CD entry. This version generates a full CD entry with a 0 TTB0 and relies on arm_smmu_write_cd_entry() to install it hitlessly. Signed-off-by: Jason Gunthorpe --- .../iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 145 +++++++++++------- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 77 +--------- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 5 - 3 files changed, 93 insertions(+), 134 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c index 03a8e7b73bc004..73fe2919cc5f69 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c @@ -37,25 +37,6 @@ struct arm_smmu_bond { static DEFINE_MUTEX(sva_lock); -/* - * Write the CD to the CD tables for all masters that this domain is attached - * to. Note that this is only used to update existing CD entries in the target - * CD table, for which it's assumed that arm_smmu_write_ctx_desc can't fail. - */ -static void arm_smmu_update_ctx_desc_devices(struct arm_smmu_domain *smmu_domain, - int ssid, - struct arm_smmu_ctx_desc *cd) -{ - struct arm_smmu_master *master; - unsigned long flags; - - spin_lock_irqsave(&smmu_domain->devices_lock, flags); - list_for_each_entry(master, &smmu_domain->devices, domain_head) { - arm_smmu_write_ctx_desc(master, ssid, cd); - } - spin_unlock_irqrestore(&smmu_domain->devices_lock, flags); -} - static void arm_smmu_update_s1_domain_cd_entry(struct arm_smmu_domain *smmu_domain) { @@ -131,11 +112,76 @@ arm_smmu_share_asid(struct mm_struct *mm, u16 asid) return NULL; } +static u64 page_size_to_cd(void) +{ + static_assert(PAGE_SIZE == SZ_4K || PAGE_SIZE == SZ_16K || + PAGE_SIZE == SZ_64K); + if (PAGE_SIZE == SZ_64K) + return ARM_LPAE_TCR_TG0_64K; + if (PAGE_SIZE == SZ_16K) + return ARM_LPAE_TCR_TG0_16K; + return ARM_LPAE_TCR_TG0_4K; +} + +static void arm_smmu_make_sva_cd(struct arm_smmu_cd *target, + struct arm_smmu_master *master, + struct mm_struct *mm, u16 asid) +{ + u64 par; + + memset(target, 0, sizeof(*target)); + + par = cpuid_feature_extract_unsigned_field( + read_sanitised_ftr_reg(SYS_ID_AA64MMFR0_EL1), + ID_AA64MMFR0_EL1_PARANGE_SHIFT); + + target->data[0] = cpu_to_le64( + CTXDESC_CD_0_TCR_EPD1 | +#ifdef __BIG_ENDIAN + CTXDESC_CD_0_ENDI | +#endif + CTXDESC_CD_0_V | + FIELD_PREP(CTXDESC_CD_0_TCR_IPS, par) | + CTXDESC_CD_0_AA64 | + (master->stall_enabled ? CTXDESC_CD_0_S : 0) | + CTXDESC_CD_0_R | + CTXDESC_CD_0_A | + CTXDESC_CD_0_ASET | + FIELD_PREP(CTXDESC_CD_0_ASID, asid)); + + /* + * If no MM is passed then this creates a SVA entry that faults + * everything. arm_smmu_write_cd_entry() can hitlessly go between these + * two entries types since TTB0 is ignored by HW when EPD0 is set. + */ + if (mm) { + target->data[0] |= cpu_to_le64( + FIELD_PREP(CTXDESC_CD_0_TCR_T0SZ, + 64ULL - vabits_actual) | + FIELD_PREP(CTXDESC_CD_0_TCR_TG0, page_size_to_cd()) | + FIELD_PREP(CTXDESC_CD_0_TCR_IRGN0, + ARM_LPAE_TCR_RGN_WBWA) | + FIELD_PREP(CTXDESC_CD_0_TCR_ORGN0, + ARM_LPAE_TCR_RGN_WBWA) | + FIELD_PREP(CTXDESC_CD_0_TCR_SH0, ARM_LPAE_TCR_SH_IS)); + + target->data[1] = cpu_to_le64(virt_to_phys(mm->pgd) & + CTXDESC_CD_1_TTB0_MASK); + } else { + target->data[0] |= cpu_to_le64(CTXDESC_CD_0_TCR_EPD0); + } + + /* + * MAIR value is pretty much constant and global, so we can just get it + * from the current CPU register + */ + target->data[3] = cpu_to_le64(read_sysreg(mair_el1)); +} + static struct arm_smmu_ctx_desc *arm_smmu_alloc_shared_cd(struct mm_struct *mm) { u16 asid; int err = 0; - u64 tcr, par, reg; struct arm_smmu_ctx_desc *cd; struct arm_smmu_ctx_desc *ret = NULL; @@ -169,39 +215,6 @@ static struct arm_smmu_ctx_desc *arm_smmu_alloc_shared_cd(struct mm_struct *mm) if (err) goto out_free_asid; - tcr = FIELD_PREP(CTXDESC_CD_0_TCR_T0SZ, 64ULL - vabits_actual) | - FIELD_PREP(CTXDESC_CD_0_TCR_IRGN0, ARM_LPAE_TCR_RGN_WBWA) | - FIELD_PREP(CTXDESC_CD_0_TCR_ORGN0, ARM_LPAE_TCR_RGN_WBWA) | - FIELD_PREP(CTXDESC_CD_0_TCR_SH0, ARM_LPAE_TCR_SH_IS) | - CTXDESC_CD_0_TCR_EPD1 | CTXDESC_CD_0_AA64; - - switch (PAGE_SIZE) { - case SZ_4K: - tcr |= FIELD_PREP(CTXDESC_CD_0_TCR_TG0, ARM_LPAE_TCR_TG0_4K); - break; - case SZ_16K: - tcr |= FIELD_PREP(CTXDESC_CD_0_TCR_TG0, ARM_LPAE_TCR_TG0_16K); - break; - case SZ_64K: - tcr |= FIELD_PREP(CTXDESC_CD_0_TCR_TG0, ARM_LPAE_TCR_TG0_64K); - break; - default: - WARN_ON(1); - err = -EINVAL; - goto out_free_asid; - } - - reg = read_sanitised_ftr_reg(SYS_ID_AA64MMFR0_EL1); - par = cpuid_feature_extract_unsigned_field(reg, ID_AA64MMFR0_EL1_PARANGE_SHIFT); - tcr |= FIELD_PREP(CTXDESC_CD_0_TCR_IPS, par); - - cd->ttbr = virt_to_phys(mm->pgd); - cd->tcr = tcr; - /* - * MAIR value is pretty much constant and global, so we can just get it - * from the current CPU register - */ - cd->mair = read_sysreg(mair_el1); cd->asid = asid; cd->mm = mm; @@ -278,6 +291,8 @@ static void arm_smmu_mm_release(struct mmu_notifier *mn, struct mm_struct *mm) { struct arm_smmu_mmu_notifier *smmu_mn = mn_to_smmu(mn); struct arm_smmu_domain *smmu_domain = smmu_mn->domain; + struct arm_smmu_master *master; + unsigned long flags; mutex_lock(&sva_lock); if (smmu_mn->cleared) { @@ -289,7 +304,18 @@ static void arm_smmu_mm_release(struct mmu_notifier *mn, struct mm_struct *mm) * DMA may still be running. Keep the cd valid to avoid C_BAD_CD events, * but disable translation. */ - arm_smmu_update_ctx_desc_devices(smmu_domain, mm->pasid, &quiet_cd); + spin_lock_irqsave(&smmu_domain->devices_lock, flags); + list_for_each_entry(master, &smmu_domain->devices, domain_head) { + struct arm_smmu_cd target; + struct arm_smmu_cd *cdptr; + + cdptr = arm_smmu_get_cd_ptr(master, mm->pasid); + if (WARN_ON(!cdptr)) + continue; + arm_smmu_make_sva_cd(&target, master, NULL, smmu_mn->cd->asid); + arm_smmu_write_cd_entry(master, mm->pasid, cdptr, &target); + } + spin_unlock_irqrestore(&smmu_domain->devices_lock, flags); arm_smmu_tlb_inv_asid(smmu_domain->smmu, smmu_mn->cd->asid); arm_smmu_atc_inv_domain(smmu_domain, mm->pasid, 0, 0); @@ -350,12 +376,19 @@ arm_smmu_mmu_notifier_get(struct arm_smmu_domain *smmu_domain, spin_lock_irqsave(&smmu_domain->devices_lock, flags); list_for_each_entry(master, &smmu_domain->devices, domain_head) { - ret = arm_smmu_write_ctx_desc(master, mm->pasid, cd); - if (ret) { + struct arm_smmu_cd target; + struct arm_smmu_cd *cdptr; + + cdptr = arm_smmu_get_cd_ptr(master, mm->pasid); + if (!cdptr) { + ret = -ENOMEM; list_for_each_entry_from_reverse(master, &smmu_domain->devices, domain_head) arm_smmu_clear_cd(master, mm->pasid); break; } + + arm_smmu_make_sva_cd(&target, master, mm, cd->asid); + arm_smmu_write_cd_entry(master, mm->pasid, cdptr, &target); } spin_unlock_irqrestore(&smmu_domain->devices_lock, flags); if (ret) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index e83fe8a1f8eef2..822df7f9309b25 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -74,12 +74,6 @@ struct arm_smmu_option_prop { DEFINE_XARRAY_ALLOC1(arm_smmu_asid_xa); DEFINE_MUTEX(arm_smmu_asid_lock); -/* - * Special value used by SVA when a process dies, to quiesce a CD without - * disabling it. - */ -struct arm_smmu_ctx_desc quiet_cd = { 0 }; - static struct arm_smmu_option_prop arm_smmu_options[] = { { ARM_SMMU_OPT_SKIP_PREFETCH, "hisilicon,broken-prefetch-cmd" }, { ARM_SMMU_OPT_PAGE0_REGS_ONLY, "cavium,cn9900-broken-page1-regspace"}, @@ -1160,8 +1154,12 @@ void arm_smmu_write_cd_entry(struct arm_smmu_master *master, int ssid, const struct arm_smmu_cd *target) { struct arm_smmu_cd target_used; + int i; arm_smmu_get_cd_used(target, &target_used); + /* Masks in arm_smmu_get_cd_used() are up to date */ + for (i = 0; i != ARRAY_SIZE(target->data); i++) + WARN_ON_ONCE(target->data[i] & ~target_used.data[i]); while (true) { if (arm_smmu_write_cd_step(cdptr, target, &target_used)) break; @@ -1208,72 +1206,6 @@ void arm_smmu_clear_cd(struct arm_smmu_master *master, int ssid) arm_smmu_write_cd_entry(master, ssid, cdptr, &target); } -int arm_smmu_write_ctx_desc(struct arm_smmu_master *master, int ssid, - struct arm_smmu_ctx_desc *cd) -{ - /* - * This function handles the following cases: - * - * (1) Install primary CD, for normal DMA traffic (SSID = IOMMU_NO_PASID = 0). - * (2) Install a secondary CD, for SID+SSID traffic. - * (3) Update ASID of a CD. Atomically write the first 64 bits of the - * CD, then invalidate the old entry and mappings. - * (4) Quiesce the context without clearing the valid bit. Disable - * translation, and ignore any translation fault. - * (5) Remove a secondary CD. - */ - u64 val; - bool cd_live; - struct arm_smmu_cd target; - struct arm_smmu_cd *cdptr = ⌖ - struct arm_smmu_cd *cd_table_entry; - struct arm_smmu_ctx_desc_cfg *cd_table = &master->cd_table; - - if (WARN_ON(ssid >= (1 << cd_table->s1cdmax))) - return -E2BIG; - - cd_table_entry = arm_smmu_get_cd_ptr(master, ssid); - if (!cd_table_entry) - return -ENOMEM; - - target = *cd_table_entry; - val = le64_to_cpu(cdptr->data[0]); - cd_live = !!(val & CTXDESC_CD_0_V); - - if (!cd) { /* (5) */ - val = 0; - } else if (cd == &quiet_cd) { /* (4) */ - val |= CTXDESC_CD_0_TCR_EPD0; - } else if (cd_live) { /* (3) */ - val &= ~CTXDESC_CD_0_ASID; - val |= FIELD_PREP(CTXDESC_CD_0_ASID, cd->asid); - /* - * Until CD+TLB invalidation, both ASIDs may be used for tagging - * this substream's traffic - */ - } else { /* (1) and (2) */ - cdptr->data[1] = cpu_to_le64(cd->ttbr & CTXDESC_CD_1_TTB0_MASK); - cdptr->data[2] = 0; - cdptr->data[3] = cpu_to_le64(cd->mair); - - val = cd->tcr | -#ifdef __BIG_ENDIAN - CTXDESC_CD_0_ENDI | -#endif - CTXDESC_CD_0_R | CTXDESC_CD_0_A | - (cd->mm ? 0 : CTXDESC_CD_0_ASET) | - CTXDESC_CD_0_AA64 | - FIELD_PREP(CTXDESC_CD_0_ASID, cd->asid) | - CTXDESC_CD_0_V; - - if (cd_table->stall_enabled) - val |= CTXDESC_CD_0_S; - } - cdptr->data[0] = cpu_to_le64(val); - arm_smmu_write_cd_entry(master, ssid, cd_table_entry, &target); - return 0; -} - static int arm_smmu_alloc_cd_tables(struct arm_smmu_master *master) { int ret; @@ -1282,7 +1214,6 @@ static int arm_smmu_alloc_cd_tables(struct arm_smmu_master *master) struct arm_smmu_device *smmu = master->smmu; struct arm_smmu_ctx_desc_cfg *cd_table = &master->cd_table; - cd_table->stall_enabled = master->stall_enabled; cd_table->s1cdmax = master->ssid_bits; max_contexts = 1 << cd_table->s1cdmax; diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h index 950f5a08acda6d..6ed7645938a686 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h @@ -608,8 +608,6 @@ struct arm_smmu_ctx_desc_cfg { u8 s1fmt; /* log2 of the maximum number of CDs supported by this table */ u8 s1cdmax; - /* Whether CD entries in this table have the stall bit set. */ - u8 stall_enabled:1; }; struct arm_smmu_s2_cfg { @@ -761,7 +759,6 @@ to_smmu_domain_safe(struct iommu_domain *domain) extern struct xarray arm_smmu_asid_xa; extern struct mutex arm_smmu_asid_lock; -extern struct arm_smmu_ctx_desc quiet_cd; void arm_smmu_clear_cd(struct arm_smmu_master *master, int ssid); struct arm_smmu_cd *arm_smmu_get_cd_ptr(struct arm_smmu_master *master, @@ -773,8 +770,6 @@ void arm_smmu_write_cd_entry(struct arm_smmu_master *master, int ssid, struct arm_smmu_cd *cdptr, const struct arm_smmu_cd *target); -int arm_smmu_write_ctx_desc(struct arm_smmu_master *smmu_master, int ssid, - struct arm_smmu_ctx_desc *cd); void arm_smmu_tlb_inv_asid(struct arm_smmu_device *smmu, u16 asid); void arm_smmu_tlb_inv_range_asid(unsigned long iova, size_t size, int asid, size_t granule, bool leaf, From patchwork Wed Oct 11 23:25:47 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418065 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 1D593CDB46E for ; Wed, 11 Oct 2023 23:27:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=TIZZS2l9IqXDQCW824XTENQYjhOPWrEsddm3YT1ozW8=; b=MagILe14gquFsI 5wFKA+e5GoCjtQkbtAkXTe1IMtOa6Ms0d7e4TTF7xb3iejXymgpeBaVmX/DxMUjIEQRRD5EI2WQex VwAmS5IMtwFDPx896fkVN0S7w1l1imSebLVmT4zYxq7q1iOqtzsx3kNqikEE/ZhyE6BT1hwu7ya2o 0gFMFGASHqjTgXMTxlLJ+KbiQebs5Ns3KZ8yvh14QFv2NtAglFOR8gvrn7PDZB7gS7CEJi6QFGd3C p9OwSPuUiZUurhkF0buxP7RDyHU9u8gLkRdQn1Z3hg0QWgtSxjsZsvXoDK3YUwveMd8OUFrAyvoP2 oMpTzITb7SSv1fWG3cTQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqibL-00Gvwv-2J; Wed, 11 Oct 2023 23:26:51 +0000 Received: from mail-dm6nam10on20621.outbound.protection.outlook.com ([2a01:111:f400:7e88::621] helo=NAM10-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqiat-00GvVq-0o for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:28 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=VzzxQDimqn3l7fDGN2+ozjWfX7VWt0yhKe4Qm38/+yrzoc01DIQPlfoKnWNP68SVdtvW8c5Qxa0BILlJpxYzPqz9/8EtP1OYDGx21zf67Eb4rrDBl7j7ihmR6JOMO/Ejc1smPgtdAlvG4rgVIqMLuiHRPg0JqbEE/yIqdSxIov3lBDIdNq/jyZZkVNpXWXGJJuaoHdLyrAMOtfdUMVliId4wnmKFGwfyvkQBxNb3gf4XGvPhw/YvoVc7AokTMX4CbSPrgMdDbnHT1wya/iYqm9Khtw96fCL9VDJ+5V8bco8bs73uWoviOHQTJ9sVte5Qe2/CrG7KlF8CyS6uA3hJpA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=D94EJc8SXZr62gwrj9y9QIf4vGI3CS3pKi8rqZ3KjR4=; b=SSHEYWUtEg95GR6+GNghj84r3Z5y+Y+aOmvXiY+E61JuEjA9UzmIK8GMO18p3wlEvkA/UcsvGifHMxHtvZDol1Zeg/0aSlNRwvqUrsP0OzbkbKQC9c7zbCLfRtW6DnPcL1o+q9WBM3k77nnogdrQnjHMVnJzbIwZmVcC8+Rvtg16La2hAfZFVC7zPx4ps4E41ynMfhWbxjHu0f1zs7Mg/BO3v1XUo3K9l7Kd1p7u9RxsILea0/n7/Kvxo+fZJQlSseidkZzUX/rmX9LuImZRHEXkj3TGO6wjG4GCK/68NN5tX1FI5kCDIkqkI0Km4CjmIkF/4qBDMhQ+nl2UFPvYWQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=D94EJc8SXZr62gwrj9y9QIf4vGI3CS3pKi8rqZ3KjR4=; b=PNRcL1u3dTnROQe6WDWEqxiExWjt4Bzb5m+P7D/j0QnbcGYP9Fbn7tgExisWDfXugXcwLKNBCWvtPY9fK1T2jJyQVXJ16/v5FOmhojqO+P9EiM2CrpA/7/Fmk7WmQYDhxDMcASX88CDk/PiWRgvo3jxTQIAGKlyYNOE6bmgAc9/iZbvkKT56/HSdFjh3gkkDKRSs5T8rmZKLowlFLpSydAWo8TR9bzOe00vvDFibcP3qGLQoOywvibw8dBUFqEB41ob8i+OoztRTkPhvETDQNgomr7Lj6nbul5lKGK8NVY2KPXDi3oto+XPiToehhLey2YIYbZPc9oWVXydNsJZDQg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by CH0PR12MB8488.namprd12.prod.outlook.com (2603:10b6:610:18d::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.38; Wed, 11 Oct 2023 23:26:09 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:09 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 11/27] iommu/arm-smmu-v3: Lift CD programming out of the SVA notifier code Date: Wed, 11 Oct 2023 20:25:47 -0300 Message-ID: <11-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: BL1PR13CA0022.namprd13.prod.outlook.com (2603:10b6:208:256::27) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|CH0PR12MB8488:EE_ X-MS-Office365-Filtering-Correlation-Id: 5978999a-eded-4b9b-1ac5-08dbcab17066 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 6p1fw1AeZOlWRCqOIQTSCkynuYZr5Pjg7zsEEU+UXyw/PbFf0C9fkYmM+hwT5WT5CnpkkNgtrRAMy4ULrkzxCqsEsDceFq1VAa6+JG2ns1VHbYzPHcvcSLJJS40uEaIBs2KPHnDPtBoZOcgssH7/HfUr19a5qVUz/rcA+k4ZvnHaKM7VNU8yzKcUFkV/MitOK5mUHNbcETskHhu5QSk5cDyFmc6p8ZSwdX+banjZysmPbYUsAwsKCetc0kb80/qk33PKMV3G2GsIgLR4tcaCPX2dwT1Q18lwsLpPP33lwg4QqtoIQVj6p6O/5+wSlio3v4ReTHJTmYw10h6LdVGB6Wl1tYYX1mfaFeKv1W5xFmaqJT384sqxhUm1Uh94hhqdQ3eWa0oAEnM6AZ8n85qU6R8ZAb1Zx3V3PuVYzVcYOJ39gdLG1i4CehKsi3JNSjqS1cnXDj7/B4onWsts7ZhUAKNdHFOnKV41CCfX8paz6TK2vUFhaD4csaRuUxdtcFBOBOHpyE1ee7bRRpNeKunuvZP6F9zKPFSpRlrB1ijHEEgtf6iAjF1Ww1chWihKWUGU X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(366004)(396003)(39860400002)(376002)(346002)(136003)(230922051799003)(1800799009)(451199024)(64100799003)(186009)(66476007)(66556008)(8936002)(66946007)(316002)(54906003)(110136005)(2906002)(5660300002)(41300700001)(8676002)(4326008)(6486002)(38100700002)(2616005)(6666004)(107886003)(36756003)(26005)(6512007)(83380400001)(478600001)(86362001)(6506007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: cFjKqesYSTr2wzkoFf5Yq5s7VcCd29wgOzJpLZPrU6z0S25VvZqt3WpXuB9Otpwctw6pVfM1REBxb/J+1KJ278FPK3/ky8FMIbwTD1feHWVDec0kKg8/elTtUC2Dg/jymit7XvSFK1/gkW/+f1A2y6E9ZJSJrnJAevt4pA7czQGUpCFuWou8HBMhsdeJJxqgNyI89IhDMrPUDxZgXaykypKY/Pd/LYd8Y4f02XAoJeQWdz3l5HsaBojxjNc25k8eg1qfkBL3XdLAHcIv90m3mXWTzKWlpsyG9idE1IUvQgwIrysUpl/7Mibby86/FY7xdwUOtf4k7u8qglhg7jXM+AVoTeSY28hyLnfwLfyuSvoGgQ7OA+HD0RlFKBmbP0f1L0P+UtU66USjWekidpNtiF/F2Yr3p8NlCu8egcjyfwhujKhmiVveWnYWWviWcauJ/SXz6sjqUe7ENIl/NKqZor3ywDdrbJguEot+ZdSfFgqpVKmVEEUdkCO3CbpxA4cNSYezbBB6FZxEUieCHAKDM3B4Nx0Vud9W2GBqEa7yw6t/L+KfiNiqm8P90PSKDraaKU+lewC01kRxfG40Ptjharc4wBiT7hpM0gFjgsk7rxTewayg3MZL8QbLzeXr+e/SDY2BGkOBg3pzSWktLwR0sYu1zmkwxhDFDkjSuStAz5u424kqRZS/2LNXu3wSvjgUs9EbRWXgaxSu/2b7xy1l+djLl0OV0pAT12An+A/q+rGBE/Gw3Lm329tJa69WVhfoJ7OnS04o56a/xkcyV6KxbPUJbW8mBaIV4v8vbSkkM62jenKuH4k7x0SfcXcaTxV8H0H1+YSkcEZcZYYLSrOTUlnrLYmXn6Wd7aloaIUIrkMufDzMM2oRkQYG/GQEEzdTIu2tOxxelfIZKkV7ZF7pUjBNKKguS37M1FLk00lH89fCsVk77Hpsso99soTb17TcdYX2/OnEFjtBJFz7uX325J8Iwl/VyXw228sgju3l7wLk+F/ym0KP2d+wtDqpI2qa/HJTZFyCYGCHNtJe+9cZirk8gebuDeJS8Kz9n6zOwCmJm+D/fKtWWRjYqqYSjcDXedneXqyaI3MTu//Mmv4O6SHfrMleq3xKen/9s4n3dcRq+HHF86ZOLd76ZGAsfh3DtlOy7AmIRVIFiNlU9BNQRyTCG73QA/Ddwdxo4lrpHqi6G/CjQJcXUKxtY52ky2K8AXE4FbM91zBX0Hxn70IuFLxFRoINKkDOqUN+DGgi+Ut+INtz0ZI959QM1zHEid5xVZ0yQUP8UMLwkXGVJXVMa1+nETOrVDdbzlsYwKSKsNy1ilVeEpDGDKemIURiCIQb5BHizkCqLBNz+hboWqM+3WZ/fgZPkNWconDNBVyq3kY/3kwwLrtIVYDfmtO2MDqqj504yfuJ5C8SREFaHCSU9g6K1SCy1N9zhUTht/aOREqa8qs36hH5UeSI94n9N41r5JwErBFW+QgcDjTjlbQYE/7uA8rI4FPcZZen0gjx1oRBs0jw5AVjNkQDxhVTIm1VZnS6cWeVG+uRKezMe2VjsEMcsI96k6VLaRww+kGbRsGmebQtP2oTVqHm3WSFeiep X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 5978999a-eded-4b9b-1ac5-08dbcab17066 X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:04.8427 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: fPQBohYCRMgZec/4uIUnQ+ZS2AEyEXTydnlwB3vqQKG26327vD0VgrBUmJ5eazjC X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR12MB8488 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162623_365147_713CECA1 X-CRM114-Status: GOOD ( 17.86 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org ops->set_dev_pasid()/ops->remove_dev_pasid() should work on a single CD table entry, the one that was actually passed in to the function. The current iterating over the master's list is a hold over from the prior design where the CD table was part of the S1 domain. Lift this code up and out so that we setup the CD only once for the correct thing. The SVA code "works" under a single configuration: - The RID domain is a S1 domain - The programmed PASID is the mm->pasid - Nothing changes while SVA is running (sva_enable) Invalidation will still iterate over the S1 domain's master list. That remains OK after this change, we may do harmless extra ATS invalidations for PASIDs that don't need it. Signed-off-by: Jason Gunthorpe --- .../iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 68 ++++++++----------- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 24 +++++++ drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 6 ++ 3 files changed, 58 insertions(+), 40 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c index 73fe2919cc5f69..aeacf2fb317a72 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c @@ -341,10 +341,8 @@ arm_smmu_mmu_notifier_get(struct arm_smmu_domain *smmu_domain, struct mm_struct *mm) { int ret; - unsigned long flags; struct arm_smmu_ctx_desc *cd; struct arm_smmu_mmu_notifier *smmu_mn; - struct arm_smmu_master *master; list_for_each_entry(smmu_mn, &smmu_domain->mmu_notifiers, list) { if (smmu_mn->mn.mm == mm) { @@ -374,55 +372,26 @@ arm_smmu_mmu_notifier_get(struct arm_smmu_domain *smmu_domain, goto err_free_cd; } - spin_lock_irqsave(&smmu_domain->devices_lock, flags); - list_for_each_entry(master, &smmu_domain->devices, domain_head) { - struct arm_smmu_cd target; - struct arm_smmu_cd *cdptr; - - cdptr = arm_smmu_get_cd_ptr(master, mm->pasid); - if (!cdptr) { - ret = -ENOMEM; - list_for_each_entry_from_reverse(master, &smmu_domain->devices, domain_head) - arm_smmu_clear_cd(master, mm->pasid); - break; - } - - arm_smmu_make_sva_cd(&target, master, mm, cd->asid); - arm_smmu_write_cd_entry(master, mm->pasid, cdptr, &target); - } - spin_unlock_irqrestore(&smmu_domain->devices_lock, flags); - if (ret) - goto err_put_notifier; - list_add(&smmu_mn->list, &smmu_domain->mmu_notifiers); return smmu_mn; -err_put_notifier: - /* Frees smmu_mn */ - mmu_notifier_put(&smmu_mn->mn); err_free_cd: arm_smmu_free_shared_cd(cd); return ERR_PTR(ret); } -static void arm_smmu_mmu_notifier_put(struct arm_smmu_mmu_notifier *smmu_mn) +static struct arm_smmu_ctx_desc * +arm_smmu_mmu_notifier_put(struct arm_smmu_mmu_notifier *smmu_mn) { struct mm_struct *mm = smmu_mn->mn.mm; struct arm_smmu_ctx_desc *cd = smmu_mn->cd; struct arm_smmu_domain *smmu_domain = smmu_mn->domain; - struct arm_smmu_master *master; - unsigned long flags; if (!refcount_dec_and_test(&smmu_mn->refs)) - return; + return cd; list_del(&smmu_mn->list); - spin_lock_irqsave(&smmu_domain->devices_lock, flags); - list_for_each_entry(master, &smmu_domain->devices, domain_head) - arm_smmu_clear_cd(master, mm->pasid); - spin_unlock_irqrestore(&smmu_domain->devices_lock, flags); - /* * If we went through clear(), we've already invalidated, and no * new TLB entry can have been formed. @@ -434,11 +403,12 @@ static void arm_smmu_mmu_notifier_put(struct arm_smmu_mmu_notifier *smmu_mn) /* Frees smmu_mn */ mmu_notifier_put(&smmu_mn->mn); - arm_smmu_free_shared_cd(cd); + return cd; } -static struct iommu_sva * -__arm_smmu_sva_bind(struct device *dev, struct mm_struct *mm) +static struct iommu_sva *__arm_smmu_sva_bind(struct device *dev, + struct mm_struct *mm, + struct arm_smmu_cd *target) { int ret; struct arm_smmu_bond *bond; @@ -456,6 +426,8 @@ __arm_smmu_sva_bind(struct device *dev, struct mm_struct *mm) list_for_each_entry(bond, &master->bonds, list) { if (bond->mm == mm) { refcount_inc(&bond->refs); + arm_smmu_make_sva_cd(target, master, mm, + bond->smmu_mn->cd->asid); return &bond->sva; } } @@ -475,6 +447,7 @@ __arm_smmu_sva_bind(struct device *dev, struct mm_struct *mm) } list_add(&bond->list, &master->bonds); + arm_smmu_make_sva_cd(target, master, mm, bond->smmu_mn->cd->asid); return &bond->sva; err_free_bond: @@ -646,9 +619,15 @@ void arm_smmu_sva_remove_dev_pasid(struct iommu_domain *domain, } if (!WARN_ON(!bond) && refcount_dec_and_test(&bond->refs)) { + struct arm_smmu_ctx_desc *cd; + list_del(&bond->list); - arm_smmu_mmu_notifier_put(bond->smmu_mn); + cd = arm_smmu_mmu_notifier_put(bond->smmu_mn); + arm_smmu_remove_pasid(master, to_smmu_domain(domain), id); + arm_smmu_free_shared_cd(cd); kfree(bond); + } else { + arm_smmu_remove_pasid(master, to_smmu_domain(domain), id); } mutex_unlock(&sva_lock); } @@ -656,20 +635,29 @@ void arm_smmu_sva_remove_dev_pasid(struct iommu_domain *domain, static int arm_smmu_sva_set_dev_pasid(struct iommu_domain *domain, struct device *dev, ioasid_t id) { + struct arm_smmu_master *master = dev_iommu_priv_get(dev); int ret = 0; struct iommu_sva *handle; struct mm_struct *mm = domain->mm; + struct arm_smmu_cd target; if (mm->pasid != id) return -EINVAL; + if (!arm_smmu_get_cd_ptr(master, id)) + return -ENOMEM; + mutex_lock(&sva_lock); - handle = __arm_smmu_sva_bind(dev, mm); + handle = __arm_smmu_sva_bind(dev, mm, &target); if (IS_ERR(handle)) ret = PTR_ERR(handle); mutex_unlock(&sva_lock); + if (ret) + return ret; - return ret; + /* This cannot fail since we preallocated the cdptr */ + arm_smmu_set_pasid(master, to_smmu_domain(domain), id, &target); + return 0; } static void arm_smmu_sva_domain_free(struct iommu_domain *domain) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index 822df7f9309b25..88aa40e7517cd6 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -2576,6 +2576,30 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) return 0; } +int arm_smmu_set_pasid(struct arm_smmu_master *master, + struct arm_smmu_domain *smmu_domain, ioasid_t id, + const struct arm_smmu_cd *cd) +{ + struct arm_smmu_domain *old_smmu_domain = + to_smmu_domain_safe(iommu_get_domain_for_dev(master->dev)); + struct arm_smmu_cd *cdptr; + + if (!old_smmu_domain || old_smmu_domain->stage != ARM_SMMU_DOMAIN_S1) + return -ENODEV; + + cdptr = arm_smmu_get_cd_ptr(master, id); + if (!cdptr) + return -ENOMEM; + arm_smmu_write_cd_entry(master, id, cdptr, cd); + return 0; +} + +void arm_smmu_remove_pasid(struct arm_smmu_master *master, + struct arm_smmu_domain *smmu_domain, ioasid_t id) +{ + arm_smmu_clear_cd(master, id); +} + static int arm_smmu_attach_dev_ste(struct device *dev, struct arm_smmu_ste *ste) { diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h index 6ed7645938a686..e41c83623ff2f2 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h @@ -770,6 +770,12 @@ void arm_smmu_write_cd_entry(struct arm_smmu_master *master, int ssid, struct arm_smmu_cd *cdptr, const struct arm_smmu_cd *target); +int arm_smmu_set_pasid(struct arm_smmu_master *master, + struct arm_smmu_domain *smmu_domain, ioasid_t id, + const struct arm_smmu_cd *cd); +void arm_smmu_remove_pasid(struct arm_smmu_master *master, + struct arm_smmu_domain *smmu_domain, ioasid_t id); + void arm_smmu_tlb_inv_asid(struct arm_smmu_device *smmu, u16 asid); void arm_smmu_tlb_inv_range_asid(unsigned long iova, size_t size, int asid, size_t granule, bool leaf, From patchwork Wed Oct 11 23:25:48 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418095 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 8B242CDB46E for ; Thu, 12 Oct 2023 00:30:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=D+f3DCkyJDQzBROy6zv7/QG9A/w1xfZE4YqO+8IFZjk=; b=ri48UuRaPxdj7z NwK0d19ZFiwLC5FqtcGsNjRAC9TUVgwnDjvw29xT+HkYrC56PQbDVuUbW2zk/n9OFjnU0ICrT2MHH i2VojnNpMlrn0CFNwUKto5AHDrEFiJJQxcD0bSU/53obwtz+XsCEsqj0CWtGeqa3e6VH/LM9M9Em9 gzgv+wYGWMjytUI/auZKrFo9G07W3yUCT4m31an5SI6wV8WuzCEs4TvfZw9ATfrOgX2N8eQxyYJ+Y Iz55Z+a6ch5WJEfbDqdNWYnaYnC5Zw3FEga1CfnWSLzCbBTIQY5maSeuw2WoaZ5VdT+tPfisk4hKk C2WoLC9NC5Im/uuV6h0w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqjb5-00H2wO-0Y; Thu, 12 Oct 2023 00:30:39 +0000 Received: from mail-dm6nam11on20621.outbound.protection.outlook.com ([2a01:111:f400:7eaa::621] helo=NAM11-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqiaq-00GvP3-1O for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:23 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=NGKHqMKEUitdzb7xM8jS/XP2C8yMXwZBHdGIRLKCtC1m+UTDS1kiu2jM1KO/VMjbpFdOSPes5lrttPSlh4BQN3Wz2H5ji+H9LlNbWReffERBivAn58VbFzthaRiP4+U+s6EiOhH3hEVETVY2NWnElvOmLdWHSIcWBJyCUmInRbxIl65WMTasskoW56iNFP8PZTlaqRKnRyctGBz1z7pQ9zg7DF96Xm03+bgmahsMgb0iM5YYND2i6kAq7ZfYGJqtj5l8G5LNRoL5lvrM5LVXA8bqPZ40mGyWnF25RU17+B2jzq3MD6IsEsR30SmZEeKggUTvxXW0ZifLNlyDB8tBbQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=WXY8cYB6r1pguAdARgFbTYspPWqf2jO88B1GajOppsw=; b=fxRCvogeqroAdo4b6GidqHIR1Kg+XmPAp/b+79W+K5DoQhQpTWrV9+VjNUAGa84ClKDqHbGeisSxOhb6DiYGXF9bUYtEbP1vagVEnSE1tKZkvUpCkkpWYVYF+N4RmlUH7DcSPrncOOrCJW1djWMSYt2+/S2yw7UL0yzsXLonVJumR/hzYQ5UMHhr2NoBAPPW8vPEv5LFve4gILVWM94cIXuFw+1E6s19l2G2PftE4FYzmPebJqC7uTRTm8qfk18zmRtYLJAXJIbs7zIbux02U5kOoIo2VSOUL5MYO/K8AqHMQrHI4KgTkEh0hqnCCUjvs++5IXjJVo2s8i1U6oLvbA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=WXY8cYB6r1pguAdARgFbTYspPWqf2jO88B1GajOppsw=; b=ksP7HHZ8CSGJ9m+75BDc0oiLcxMK85caPAvCkGLl2dOUBoX5bOIdDKrvdWW1gasWboL5zL/C7bV/z/YcbKjcd/0BQsibnoNMQG+vU84mwvtVoPFht6u4chpBJrU1DT+FDkTOQWycEtluwVZZSckURYptR8KC7yMdL9fzBCk7F0HA1YSsHTrwV4dT/IRVAlJGkm/YnD29ZeYCcyuI/R04t8yBj8Ni2JP4DL+X30AVVf/hH99mcXQydXdu9RE8c4K0OnlRJG8qP6KYsfCdL5WSNs1E88LKPI0boljsJ6BQqzSJlmwOkVhCM8gw24p/Ne5G0FdUOPjshYQvqBvqGFsQhw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by DM8PR12MB5448.namprd12.prod.outlook.com (2603:10b6:8:27::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.36; Wed, 11 Oct 2023 23:26:07 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:07 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 12/27] iommu/arm-smmu-v3: Build the whole CD in arm_smmu_make_s1_cd() Date: Wed, 11 Oct 2023 20:25:48 -0300 Message-ID: <12-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: BL1PR13CA0282.namprd13.prod.outlook.com (2603:10b6:208:2bc::17) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|DM8PR12MB5448:EE_ X-MS-Office365-Filtering-Correlation-Id: 8a9b5633-9dfa-4e06-e220-08dbcab1704b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: N+1NmTsISRUkaNE0zzQy9MzIzDc4FMd2KOWbEC9fYAgb+gwZfnS99dV8toZ2AA5Q8OpXbveEvn/J8zdZkqxIo37r0xgMYFIWPhJAYmthMGMdrg9vi+8KJ5eWMyLYI+weqc6tyY4IecWFgbgMDvUNDlJsKFQjLbFixqPtmAe4hBPanJf2yol7U3nWg+LFzmcSh1LetGMyzMr1S6MWrMU4CtYD7CXH9ZoDxFh8iMQfKX35tOuOIs7+VrAsKjbnWY1ezkyNHBhg1cAhTs2fqJhRTe5xchIjlJCifE5XhUbwEmq6VeklLM8eP2x+V0ldmU6rqB+tAR9pRBkEthq54xXy8m0j2OJgEhEabsJ/sk6x51zjw45uqsX+Ox/KsIiad0kbyQKzCkf8ylA0XepP0ZjxxcMSBU6QquQiK2fC+mb1e1VvWV7WyrQoBfcjs22cSx3ktdNsN5Ni1cORNe2x4QgXVdOY865Kz3o4R6fw73z/5pE6Cqdixbcad+xZWnNu6MAoVcH4i8YDNFgGCrdTqDJKszdvP+TwEAgrK2sg6LTz8jZlxDUswjJwbjCVCozaF12G X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(396003)(39860400002)(136003)(366004)(376002)(346002)(230922051799003)(451199024)(1800799009)(186009)(64100799003)(54906003)(6486002)(110136005)(83380400001)(316002)(66476007)(6506007)(38100700002)(26005)(6666004)(66556008)(66946007)(107886003)(6512007)(2616005)(478600001)(86362001)(2906002)(41300700001)(8676002)(8936002)(5660300002)(4326008)(36756003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: HeAEiEbg7fhfgq3I8+QWjokdEcJxnYSLEmrdyT1RxgHxmWLTR7LnoRiol2r/fffTqemvTlcfNFwPOOlA1yUFZrVlw6DWe+xT1GOd3aqq1CK0l77gnNo1eqtXYDq3mwQzEfy8FExUZjY5KQq3+GXXBwkDseJdq4wYTew1exFRwn8oZlUdmjqDs5aVlh6WI7HoHD6qofk2dh96RBuebJ2ywfSg6oYGpYctg8cW9nakHCpaMx4BOqS7zGOsKi1d+30/iu6Lc7BrZwdLKvm43yuIRMQgbVX0FjBvOpSJ83lbv4buPC4/QiYkPzsCYHhw2oBzcjYah2yGHjfa+U24OWtb98ODJHnhNVa+Z+NIVGZw7wglSTBWn/X41mZFdFFrttVNZLsoEluq0ZfLmQLl3/0dZDLw7r0U2g3bZJBn5M4zuzRlOEfALmQLSjjHQAhqg/liwj911bYootC0xxL4oon4dpWDcucG77ZczUG2lAz+y2JhqFBIHli3FrUF6bp9LLs29SMq7/7wJ83m3MsLaZZiOZit2n+8Pj/Y7Sx1UzbMRo/YVVCqUUw337UaOh2Cc4NrPpVQ/jpd9uWV33TmWjJbv2V7b0xxtdoeE3VikxksIAnZtQRdPwAYNJDNaw433ELbPBqLESJl3OTwpXn1eW6Osv48dyGN1quqGq/KFdj4e9ZFelLJgeFiAtqV+OkRAfz4fGmrLVfzIC+ier3ynP0HeyBvXGDKL2gCpheQaqkO/Mp8qIB5jTtX6KE4pZyVa8d7KB1MfErcMprp1/VV46JwIXF9IVkkMDNJMqaO+yl37WvkBriNQWpL3typXTmwkQF6paNs0WP5wfQqwqS0P6X9oPQCFB3p81G+7x75nwM3PaPmBdoxnO7x45lSeQ1s0Qv3ld7v4wqjJuLgQ11XWJZmVjQSXQ9L1YqqFFzwrV5Qlhf2zhe9V7C7QleNjEKDYH63/mBoCbkYLcpn7yU1SH492wKVyQW2ItVCtLqq85QGHTM3l2ZTKZ2o5I5HARKIJ/etAjJOnAF3gT8jrgQ/GyidCGv7uzKe0D/qada93Z/Iaix+VfvVIQiN+H+nOGbdh3DCwGbczQKHUmKLhXvgTqbNEXLKjR3LaO8ZdH8GKlQerku6dqB/sRhDSxDSaNkFWvYT2yJpkfw/O6BMUz4C9ioh9rAwGnXJK7uRchBKHpcpabUm4uSU/aKyeHkiBVmAYCzYs4pYl9noL+3Wly6nhoiU41AhFoLFO8f7VumrGLKuB6pgIi8E8+sEKE+UrhaZDLUGLxH+HJkqYQrWEJJhoTiDrYLOeST1lfBqpq/ID8DCgWUKFYIQ9Pn63wSii9cjrXcsEuwuwffyg8idCSYOOxB/+QS/aehLinI6SXM8GSg0fk705rImBZUdbLPUwUd8VPLfjPKjslVGeNJtnfLEGXwXLOrljKDGMDxqBgsR+107O/3T+MlCF7YovqaQsYi4y9BL3il0NahYq6ObolHKgzMTr4Ao/xz8hqkhp0yZ2trL57G5JSPs28ZiYb8LM5Us+MfqFABroi3ovPw4GecEwOW0utAF2vg/S/yj8rjenVZm3FiNuGVUWtU0OP489yEVBc97 X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8a9b5633-9dfa-4e06-e220-08dbcab1704b X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:04.6229 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: XLn26Bbdz9/rCcG+eCqmRYXbt0DDohi0uiRghFnNmPobX3/wZYw33Hjjzgc+uI0y X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM8PR12MB5448 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162620_508043_72C15A6D X-CRM114-Status: GOOD ( 13.29 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Half the code was living in arm_smmu_domain_finalise_s1(), just move it here and take the values directly from the pgtbl_ops instead of storing copies. Signed-off-by: Jason Gunthorpe --- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 47 ++++++++------------- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 3 -- 2 files changed, 18 insertions(+), 32 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index 88aa40e7517cd6..894add54013fe9 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -1172,15 +1172,25 @@ void arm_smmu_make_s1_cd(struct arm_smmu_cd *target, struct arm_smmu_domain *smmu_domain) { struct arm_smmu_ctx_desc *cd = &smmu_domain->cd; + const struct io_pgtable_cfg *pgtbl_cfg = + &io_pgtable_ops_to_pgtable(smmu_domain->pgtbl_ops)->cfg; + typeof(&pgtbl_cfg->arm_lpae_s1_cfg.tcr) tcr = + &pgtbl_cfg->arm_lpae_s1_cfg.tcr; memset(target, 0, sizeof(*target)); target->data[0] = cpu_to_le64( - cd->tcr | + FIELD_PREP(CTXDESC_CD_0_TCR_T0SZ, tcr->tsz) | + FIELD_PREP(CTXDESC_CD_0_TCR_TG0, tcr->tg) | + FIELD_PREP(CTXDESC_CD_0_TCR_IRGN0, tcr->irgn) | + FIELD_PREP(CTXDESC_CD_0_TCR_ORGN0, tcr->orgn) | + FIELD_PREP(CTXDESC_CD_0_TCR_SH0, tcr->sh) | + CTXDESC_CD_0_TCR_EPD1 | #ifdef __BIG_ENDIAN CTXDESC_CD_0_ENDI | #endif CTXDESC_CD_0_V | + FIELD_PREP(CTXDESC_CD_0_TCR_IPS, tcr->ips) | CTXDESC_CD_0_AA64 | (master->stall_enabled ? CTXDESC_CD_0_S : 0) | CTXDESC_CD_0_R | @@ -1188,9 +1198,9 @@ void arm_smmu_make_s1_cd(struct arm_smmu_cd *target, CTXDESC_CD_0_ASET | FIELD_PREP(CTXDESC_CD_0_ASID, cd->asid) ); - - target->data[1] = cpu_to_le64(cd->ttbr & CTXDESC_CD_1_TTB0_MASK); - target->data[3] = cpu_to_le64(cd->mair); + target->data[1] = cpu_to_le64(pgtbl_cfg->arm_lpae_s1_cfg.ttbr & + CTXDESC_CD_1_TTB0_MASK); + target->data[3] = cpu_to_le64(pgtbl_cfg->arm_lpae_s1_cfg.mair); } void arm_smmu_clear_cd(struct arm_smmu_master *master, int ssid) @@ -2216,13 +2226,11 @@ static void arm_smmu_domain_free(struct iommu_domain *domain) } static int arm_smmu_domain_finalise_s1(struct arm_smmu_device *smmu, - struct arm_smmu_domain *smmu_domain, - struct io_pgtable_cfg *pgtbl_cfg) + struct arm_smmu_domain *smmu_domain) { int ret; u32 asid; struct arm_smmu_ctx_desc *cd = &smmu_domain->cd; - typeof(&pgtbl_cfg->arm_lpae_s1_cfg.tcr) tcr = &pgtbl_cfg->arm_lpae_s1_cfg.tcr; refcount_set(&cd->refs, 1); @@ -2230,31 +2238,13 @@ static int arm_smmu_domain_finalise_s1(struct arm_smmu_device *smmu, mutex_lock(&arm_smmu_asid_lock); ret = xa_alloc(&arm_smmu_asid_xa, &asid, cd, XA_LIMIT(1, (1 << smmu->asid_bits) - 1), GFP_KERNEL); - if (ret) - goto out_unlock; - cd->asid = (u16)asid; - cd->ttbr = pgtbl_cfg->arm_lpae_s1_cfg.ttbr; - cd->tcr = FIELD_PREP(CTXDESC_CD_0_TCR_T0SZ, tcr->tsz) | - FIELD_PREP(CTXDESC_CD_0_TCR_TG0, tcr->tg) | - FIELD_PREP(CTXDESC_CD_0_TCR_IRGN0, tcr->irgn) | - FIELD_PREP(CTXDESC_CD_0_TCR_ORGN0, tcr->orgn) | - FIELD_PREP(CTXDESC_CD_0_TCR_SH0, tcr->sh) | - FIELD_PREP(CTXDESC_CD_0_TCR_IPS, tcr->ips) | - CTXDESC_CD_0_TCR_EPD1 | CTXDESC_CD_0_AA64; - cd->mair = pgtbl_cfg->arm_lpae_s1_cfg.mair; - - mutex_unlock(&arm_smmu_asid_lock); - return 0; - -out_unlock: mutex_unlock(&arm_smmu_asid_lock); return ret; } static int arm_smmu_domain_finalise_s2(struct arm_smmu_device *smmu, - struct arm_smmu_domain *smmu_domain, - struct io_pgtable_cfg *pgtbl_cfg) + struct arm_smmu_domain *smmu_domain) { int vmid; struct arm_smmu_s2_cfg *cfg = &smmu_domain->s2_cfg; @@ -2278,8 +2268,7 @@ static int arm_smmu_domain_finalise(struct arm_smmu_domain *smmu_domain, struct io_pgtable_cfg pgtbl_cfg; struct io_pgtable_ops *pgtbl_ops; int (*finalise_stage_fn)(struct arm_smmu_device *smmu, - struct arm_smmu_domain *smmu_domain, - struct io_pgtable_cfg *pgtbl_cfg); + struct arm_smmu_domain *smmu_domain); /* Restrict the stage to what we can actually support */ if (!(smmu->features & ARM_SMMU_FEAT_TRANS_S1)) @@ -2322,7 +2311,7 @@ static int arm_smmu_domain_finalise(struct arm_smmu_domain *smmu_domain, smmu_domain->domain.geometry.aperture_end = (1UL << pgtbl_cfg.ias) - 1; smmu_domain->domain.geometry.force_aperture = true; - ret = finalise_stage_fn(smmu, smmu_domain, &pgtbl_cfg); + ret = finalise_stage_fn(smmu, smmu_domain); if (ret < 0) { free_io_pgtable_ops(pgtbl_ops); return ret; diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h index e41c83623ff2f2..6d22a9f4c33a0b 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h @@ -587,9 +587,6 @@ struct arm_smmu_strtab_l1_desc { struct arm_smmu_ctx_desc { u16 asid; - u64 ttbr; - u64 tcr; - u64 mair; refcount_t refs; struct mm_struct *mm; From patchwork Wed Oct 11 23:25:49 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418060 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 81FC4CDB46E for ; Wed, 11 Oct 2023 23:27:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=OJKK+0nhoydNjPnqy1bMRpjxRMYYAwRVgC/oG40o5fo=; b=rajDZOeNysHgk4 ontycYKrwaoWDffJzojKs5QEqVhqu6cQLPMyM9NPy/DM+R20bi3ErbJ+Z6Ev0NmYu6xoWfRO4vrR4 eC/BKFdERqioVXxKzZHRcwLNnVUbZH3ysFG0XOcVeMJZeG2NgrOXoqur4BzJ8Ox0e0cvD36VDQbsg UHup3AeVuU3nas0vcwcAKSmI6iavlgiDcP8MgmfF9rqsL5yawcXAXOQHSYtRX8EahJtdPUAA0BbbY 35wHxyLqovAQLO++dNPBD4xkR6Af/OToEetOnL22y7TBpYlDKc2z0aKQmByxBfoZiBB9rCmiZ55WI zgLzFzsFojsHrQWAmgWg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqibF-00GvtF-2l; Wed, 11 Oct 2023 23:26:45 +0000 Received: from mail-dm6nam11on2060d.outbound.protection.outlook.com ([2a01:111:f400:7eaa::60d] helo=NAM11-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqiao-00GvOz-2N for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:20 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=NNXoYGSiZtq9e+rsOBpA66ocL+h5IzT+eR8D2P6PUvnNSDzcauPBPwlTalMta26x5lCHa7h7lFVGXOpgfrplHUZJzPZ5V2yH4cyXdwaulcxQcYPDGgYFyxI4qzNe8lzPau2fcXQUTrr/cCKZCbHglqEwckWf5rAMqS4fQhqtIApApZnnG5ERM0PQsNkA/Fz5NXPKAEgEKZC+96p7KM5oganNyxAt7vFffPCr1AGYsULxYd/BguQTnmGGrwErXBHunabJpv+qEyGAGxMuoddx97M154HoQrI3dAAbltZxYdiuUGdp0OOobr38wk5OC0gza8+6uDPfAZMxHz/BP1ZMkA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=N2i5gjTkWfy8uAUcDq/49E/mHT7SlJ/tQERVDsQxnAo=; b=JVEaqdqBXXk1YQqz0Ag6EipcWThcy0rluTTiB/bsRV+id3rhITmjkOtnQy/J/ptwAA8mbEWDbVQE948L3bRRcwzR+/fVUOn0xEPfCuJS8Nk+OFcrl2zHflxEcHVM3uz7lzSKy6I6UvSl9e3NlFcdE35TOQsiL2YhvCQpjBzoCPO/N1TGY0DvPtllt0qTQMx8CDXprtn51dS0RsIMt37zLTgxowmyGJHU4c4QINQdC7RSWLYXUoCch2LAPDhHj4iCtSzd7b1C+9lE1vlILMdc0AoyLmmaueHyQ3/Qz2WUX48/8ho7wQ8H+WTkHmoiAXg5Cqq8XJfzinw7VLOWyzOdag== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=N2i5gjTkWfy8uAUcDq/49E/mHT7SlJ/tQERVDsQxnAo=; b=seruNc4JOwOYVCeIj8Pn8/gvcK91vecXTTEMO6qnOU7BUTNP37P8em/ZaHgmqpB3AYtbaQfAlPTysynjlwJiGHb0j9+Gn1EeQ0m8nbw/zX+gdCU6z3wQlcKdw5o0XB/HTFCgIPvm777uxGiFzXy7L4ZnsxbZx85bjoiPNGyb1z/lXyQ0N2hYluT1EueeCXJGcq84cIX76AO2JTc3KvqHtGYxon0IodyBaIDiAUycy1Eg6dD3efpZEafQLB3rbbUjYV1dTJv9oo8fMtNgWQOd6yuhP4yV8aH0RoNUajPQJd4DDiCjcw/Ha/0QrS9mVJD1MsfZxBjrFQ7c+EhIAkk/VQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by DM8PR12MB5448.namprd12.prod.outlook.com (2603:10b6:8:27::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.36; Wed, 11 Oct 2023 23:26:07 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:06 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 13/27] iommu/arm-smmu-v3: Make smmu_domain->devices into an allocated list Date: Wed, 11 Oct 2023 20:25:49 -0300 Message-ID: <13-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: BL1PR13CA0281.namprd13.prod.outlook.com (2603:10b6:208:2bc::16) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|DM8PR12MB5448:EE_ X-MS-Office365-Filtering-Correlation-Id: e80081dc-0b77-4968-473e-08dbcab1702f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: K/jXiGbJsIviZdJM4p9L17d+QXYfLBsliFRLaJdioydjc0aFMHwJ/Ab3vPBeAjCvGTpDNUx/qNQuhWVnILh/dmtjo2xYo4rZHyzAWY1epY2tPbMufB6zCbZpG2l6DgKR2HDjQImjfw5k4+z2q+tOa2/bujz3nkS7m4HOLDZqRuFGZZCzMS1fCs83gIzhrtIOGrIzK2+Y7t2c8Zq76N800YT0EtPJNfOgmVrUCx0WxssnlYe78pMHhlskLdDjpWZaX00yZFpdDJtF9+cHHluYfVCGSD/AmheRi3K6uqGEnOrarYHk5nMcpbProJJQJ21uLqD7UXGJ6rD6duFYfOWEzduDnCJjx9Vrw666FQuY0ZU6JPqFX7gZjdGNPPc0rEJUrJN1bJi/wchFI+jVOES7mol8d7ST4iZ0warnb4tG5G2aURAzlhVeAWYvK2QIysn4Tcnv9TOoIKCUdlLk87ehEe2A7GvZ1Y3aPzLX50/wRNvIcVSq6iSdFPfqx+o3Z6RttM3NLFFbsUDdlhnoyMlSI/clUSQ+BwdhElCP04lEGB7L7BgdwkN/709zC0dToMV0 X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(396003)(39860400002)(136003)(366004)(376002)(346002)(230922051799003)(451199024)(1800799009)(186009)(64100799003)(54906003)(6486002)(110136005)(83380400001)(316002)(66476007)(6506007)(38100700002)(26005)(6666004)(66556008)(66946007)(107886003)(6512007)(2616005)(478600001)(86362001)(2906002)(41300700001)(8676002)(8936002)(5660300002)(4326008)(36756003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: AQv/tWpTA38D2Deu938brCngSMA+4DvazUGEPcc/T3kFAtACoycg/fGNALWI+jt6UMTIVQgXzBNs7DTYzEhdRunxTnkIQupjTPjvfLK3TQEvW1ZtcPCVZiqC6g/1cZo2SQIQ1IeBP7GFCWizGcDGBuOFlw4P0PZ1nzl5o2GdNTCEtf8Kr4VFsqBHOJsHsOpoNJxAaCLgNr/Rq95agnD7M/ayOUE200YrrPhvlYayZi/tbnrV3+Bf5JAucrAtu9XdJIseADNsixKmQ+mVAvgshhnWaWZccqTeHYliclH3e3Go6blg9Lr6oWpHgxo34EnzLtYI7V+Ij2qntsad4kOc2Yu78Wr0Gv7Zxj2vnru4k9RtX6xtSAfo2/mOMu+Bpn1CAOsVQGeUJiXTkC0l/AduwzoytPqSMIwKMBSe8H78molhOD+bMFN5hx1Y9p2ZcZjMj1txQ273cJsPKmVeEXtxwLTJmtQzr+szcnGiUw0Kt9At0+QIwo6dYEZUcfuz2QCpLU35wcXHAkRd8Kdvf5w2aom0byxyOw1Jz3EpAnbXw5ERTen9Dubr/BLLH25FE2P27UAxdEttpyI2MyWSOAZQg3KiBRoiigxxdJoCYpwgz1UAOALoeYDSG4rvvKXOesMTj9/Z9PG/5IKuwIqZQX4/nZNQfBACjTEICgcD8LxVBrWyrOE1cbyclibzVd+RtwS1hLbliM4MiBLpNLiU4tLm9QGr7s9POKbCB7RVmOdi7AoEs/m3fa6zJ5E60d9XO0tdJSZ9EfgU1g8RYWvl44O9MNzpQVQnykdvxvwmZCCR+r+G+sv4+UFmwP8rtfY1BtsLRws+lQCc8WYD3ZuS96ValjBRNnM1/1hbt0p9umPCcJ6Cpu591ezQS+6/97cYSp9ZiXUDn56Wrh7mqTZoBlbJIPOyHum5x1SN8OnJXMgb+PNDtSM7AChRDaLLKNVfGSgyOWVW9+Gpqd/Tu3ivQi6k7U+9kxJ0vDuBFxR26jqZxz0kNKvYMhGd+BdJ8E7+EYUN/XLX0gCoecckPn11Hn7SeWTUeI6fxReJCexbGvmiNI0W+JDb/nc6rKN4em5Z7s1+qOKI1xi9o1syeoZbxrJ8f9acjU7cxA+Ymu6LcRQ/suxmzZaZ6eaMrQeqz5DZCrqWjN8o43hH72nYu33Cw8884ZGMShM9b4lcNAawvBHSYJNidAHSfbrHMhpD72w+1x4fPYOtGCPf7SU8mlQisX71yjpMPUyNwCeGKUuO3sSBgm5+008i37+SJUDvcihBJ7qaLTzg2DDf8V/oTIVDdrqGQtFBh5gXr4YBQQ6QWIca5Hm20mYN5wuede+Q813QeJDnKRIeeYyPKl44jPNd22OvgBNa2tTfKtkw9glV7Rb+JHvsvTsp4uDadwVdldAaaJyAZRy4Wf3Vjs1ByUZh+R0BmA89YowkWufreOccPuMuzYfCxYN04T5fNziC1haAsP3ZJxvL8XQF3XJ8W3T/cVo9QZ9XbEuIIVpFknnbY4eRqS1htbmgb15pOg/siP4/GVIX+/HEdIHm86PVoo4a43HayCQEzJJaCt8uREwZacu/8NX/bYE1hdbx/9NwpQ5Edgq+ X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: e80081dc-0b77-4968-473e-08dbcab1702f X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:04.4830 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: fR9rz7bDcKRFySa6rYZRTxtz+QVvMYjsGmWsoreOhGiHQWa2YiwSI3Qrt98j+EpL X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM8PR12MB5448 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162618_818080_CBFFDFB7 X-CRM114-Status: GOOD ( 15.85 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org The next patch will need to store the same master twice (with different SSIDs), so allocate memory for each list element. Signed-off-by: Jason Gunthorpe --- .../iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 11 ++++-- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 38 +++++++++++++++++-- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 7 +++- 3 files changed, 47 insertions(+), 9 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c index aeacf2fb317a72..0a2339d9e518ac 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c @@ -40,12 +40,13 @@ static DEFINE_MUTEX(sva_lock); static void arm_smmu_update_s1_domain_cd_entry(struct arm_smmu_domain *smmu_domain) { - struct arm_smmu_master *master; + struct arm_smmu_master_domain *master_domain; struct arm_smmu_cd target_cd; unsigned long flags; spin_lock_irqsave(&smmu_domain->devices_lock, flags); - list_for_each_entry(master, &smmu_domain->devices, domain_head) { + list_for_each_entry(master_domain, &smmu_domain->devices, devices_elm) { + struct arm_smmu_master *master = master_domain->master; struct arm_smmu_cd *cdptr; /* S1 domains only support RID attachment right now */ @@ -291,7 +292,7 @@ static void arm_smmu_mm_release(struct mmu_notifier *mn, struct mm_struct *mm) { struct arm_smmu_mmu_notifier *smmu_mn = mn_to_smmu(mn); struct arm_smmu_domain *smmu_domain = smmu_mn->domain; - struct arm_smmu_master *master; + struct arm_smmu_master_domain *master_domain; unsigned long flags; mutex_lock(&sva_lock); @@ -305,7 +306,9 @@ static void arm_smmu_mm_release(struct mmu_notifier *mn, struct mm_struct *mm) * but disable translation. */ spin_lock_irqsave(&smmu_domain->devices_lock, flags); - list_for_each_entry(master, &smmu_domain->devices, domain_head) { + list_for_each_entry(master_domain, &smmu_domain->devices, + devices_elm) { + struct arm_smmu_master *master = master_domain->master; struct arm_smmu_cd target; struct arm_smmu_cd *cdptr; diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index 894add54013fe9..82613f5d24f478 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -1944,10 +1944,10 @@ static int arm_smmu_atc_inv_master(struct arm_smmu_master *master) int arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain, int ssid, unsigned long iova, size_t size) { + struct arm_smmu_master_domain *master_domain; int i; unsigned long flags; struct arm_smmu_cmdq_ent cmd; - struct arm_smmu_master *master; struct arm_smmu_cmdq_batch cmds; if (!(smmu_domain->smmu->features & ARM_SMMU_FEAT_ATS)) @@ -1975,7 +1975,10 @@ int arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain, int ssid, cmds.num = 0; spin_lock_irqsave(&smmu_domain->devices_lock, flags); - list_for_each_entry(master, &smmu_domain->devices, domain_head) { + list_for_each_entry(master_domain, &smmu_domain->devices, + devices_elm) { + struct arm_smmu_master *master = master_domain->master; + if (!master->ats_enabled) continue; @@ -2464,10 +2467,27 @@ static void arm_smmu_disable_pasid(struct arm_smmu_master *master) pci_disable_pasid(pdev); } +static struct arm_smmu_master_domain * +arm_smmu_find_master_domain(struct arm_smmu_domain *smmu_domain, + struct arm_smmu_master *master) +{ + struct arm_smmu_master_domain *master_domain; + + lockdep_assert_held(&smmu_domain->devices_lock); + + list_for_each_entry(master_domain, &smmu_domain->devices, + devices_elm) { + if (master_domain->master == master) + return master_domain; + } + return NULL; +} + static void arm_smmu_detach_dev(struct arm_smmu_master *master) { struct arm_smmu_domain *smmu_domain = to_smmu_domain_safe(iommu_get_domain_for_dev(master->dev)); + struct arm_smmu_master_domain *master_domain; unsigned long flags; if (!smmu_domain) @@ -2476,7 +2496,11 @@ static void arm_smmu_detach_dev(struct arm_smmu_master *master) arm_smmu_disable_ats(master, smmu_domain); spin_lock_irqsave(&smmu_domain->devices_lock, flags); - list_del(&master->domain_head); + master_domain = arm_smmu_find_master_domain(smmu_domain, master); + if (master_domain) { + list_del(&master_domain->devices_elm); + kfree(master_domain); + } spin_unlock_irqrestore(&smmu_domain->devices_lock, flags); master->ats_enabled = false; @@ -2490,6 +2514,7 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); struct arm_smmu_device *smmu; struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain); + struct arm_smmu_master_domain *master_domain; struct arm_smmu_master *master; struct arm_smmu_cd *cdptr; @@ -2526,6 +2551,11 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) return -ENOMEM; } + master_domain = kzalloc(sizeof(*master_domain), GFP_KERNEL); + if (!master_domain) + return -ENOMEM; + master_domain->master = master; + /* * Prevent arm_smmu_share_asid() from trying to change the ASID * of either the old or new domain while we are working on it. @@ -2539,7 +2569,7 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) master->ats_enabled = arm_smmu_ats_supported(master); spin_lock_irqsave(&smmu_domain->devices_lock, flags); - list_add(&master->domain_head, &smmu_domain->devices); + list_add(&master_domain->devices_elm, &smmu_domain->devices); spin_unlock_irqrestore(&smmu_domain->devices_lock, flags); switch (smmu_domain->stage) { diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h index 6d22a9f4c33a0b..a4da5c164dc62a 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h @@ -695,7 +695,6 @@ struct arm_smmu_stream { struct arm_smmu_master { struct arm_smmu_device *smmu; struct device *dev; - struct list_head domain_head; struct arm_smmu_stream *streams; /* Locked by the iommu core using the group mutex */ struct arm_smmu_ctx_desc_cfg cd_table; @@ -729,12 +728,18 @@ struct arm_smmu_domain { struct iommu_domain domain; + /* List of struct arm_smmu_master_domain */ struct list_head devices; spinlock_t devices_lock; struct list_head mmu_notifiers; }; +struct arm_smmu_master_domain { + struct list_head devices_elm; + struct arm_smmu_master *master; +}; + static inline struct arm_smmu_domain *to_smmu_domain(struct iommu_domain *dom) { return container_of(dom, struct arm_smmu_domain, domain); From patchwork Wed Oct 11 23:25:50 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418058 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id E7EF9CDB47E for ; Wed, 11 Oct 2023 23:26:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=mF0yrcU9s6eS3k5iNJtaIL9JD66tctTlexvg5+zKf3k=; b=U8y8D/pjaHdXHS C2GFeLjKr0TLXW7HQTm3dh9UDMCT8db4rRAp1y+6eYqDsR6l0Wzh8ROk4hK5BPTygJ+B8QyKKS417 UjIVcxhhyMIBz8+Ci0Wm4i00DuorSwrOyVT9t1meUZ4V9Wcx30WuA5hYbpHMCigSK66I8fxJKREz0 ZhN0c7v62qkT0cf2pLGtQ3GawCyjCm+8B85jTkx4vlCvEjkHDabN9PcHbQUiwxcSkEiXzJqLoAMsK 4ZQTQAa+LgGGgLsNb9Gpe3EbJQEEG1RWJHZUwbkGP1xkGiH32lfPhPa/FeUXWdsnFW305SyKmA3uL CkpoZ94qbLzbc8T49C1A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqiat-00GvXS-0g; Wed, 11 Oct 2023 23:26:23 +0000 Received: from mail-dm6nam11on20621.outbound.protection.outlook.com ([2a01:111:f400:7eaa::621] helo=NAM11-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqiam-00GvP3-0P for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:18 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Pd+KSIdTGHf1MeE/w//rM7GgxW7KsJzISHlBmphCxaSKAJlBT0lgkFf2y7c3YMv+YqyJQlKYugRL9tmmPWd6iH/ovU6lFbAd9IEexkoVBQTikAv/A/V3gSQw2IjMahJm0MLLUHldqGPad9uHcK7jKFWsP6+0BlMksPWeU3SHrS2AxDOyXxnTBx0VMvJ8Phr04zeq9BdOUJG3IKwkDIWRfI5zAMaDK+qjWiQD+oIFP2ZcUFrgjIgaGK4diIsr1218cUI7NGDcka01SaozEROSm3+TVoU1dBiiIoSseurGawrS2qTPRkkbZoDMWjwTuU3PuQP9oYi5F60HxxBgn6500w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=lNiINOEX57ntFM8sAYoEA+J+zx+6VjJCBmViGv7vaLg=; b=bRs5gk7MBMcgZDxNvavcjV4FQRN/XJJ76hzmRKkLQnZZuAHLShGQAjNCWI67YI1ayoNZ7McF4ht5eI9l99uuzMRPdwdq0CLxUP81zJ/MISNMFb1L8YMwK5puphOItv+K++CuXMDqFajfEVlUbhyq0qGduVWWZTfR0JOHH7pQ5mvxPVLvkhAl3iiVyCWsXs+CnCknvvsBuvgHffZq6sdP2M5CBFd/HZYGKNcxgCDYTU8ExmRDlBiHNDlsMMIwW4Tkk2oGy2Y+9QIo11QpPYIlErn5w7GLNRMBWUoJLap4z+5PBi8yD8298N7Los0b0mKn/4dow8KBQQVVwWVVbtPqeQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=lNiINOEX57ntFM8sAYoEA+J+zx+6VjJCBmViGv7vaLg=; b=omIBld6K8mvxLkH923qbxLYGRF7vd2Kf9VnDfEn+zgfP38lh60tfKyZ3fH2R3IPz09UWjH0Cbjno35lIpaEoomM0rdhNMD+n6jRvjz/UukfTTbJngP2PtpSpfRw9dow+uYwlHESuo2uS3tlJJcdJoh83XelsuUBX1ygBnxcYRcVIqDE5pOF5tWHfs627EEXjDBz8NWZC/XAl2CLhpYtNhuZ3+FgnG0wi2j/DEbw5Ij1gAI8l97+nVyeTWYqxQotIWYOlGBfkz9j4Fc3JKGxksV8sW+bAoFUCBNq5drhHgk5I7TkpB7m14UL8lz1L02tFp7EhzjC+ORpgiW3eqzcfYg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by DM8PR12MB5448.namprd12.prod.outlook.com (2603:10b6:8:27::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.36; Wed, 11 Oct 2023 23:26:06 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:06 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 14/27] iommu/arm-smmu-v3: Make changing domains be hitless for ATS Date: Wed, 11 Oct 2023 20:25:50 -0300 Message-ID: <14-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: BL1PR13CA0011.namprd13.prod.outlook.com (2603:10b6:208:256::16) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|DM8PR12MB5448:EE_ X-MS-Office365-Filtering-Correlation-Id: 03ad5024-91a3-427a-d32e-08dbcab17019 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: vTxRGtKSpO+zAnP9KU528eawfXlUOsWhfTevjvB4U1nlJpV1T4ha+UmwgTS8pJBOycIVUMRaSXachYqU/Qmi7q2IkBqJ/1aQB/czUn2QyYLDj0AruYDxQUZs+kYExXvA4G76mENqdC4vg8QGUl4Knqt+RsLgaM2CU7kiHwd6bh6wLLT5MAD4zvKeb+zCPRjJyuzkAdKrrKizxxOx9I6We3gy719b198rVJXSb3zr2XfvsV2TZJwHTvaPFBy5YlZtW71YqakHUP7TQwtT7S7iNPjJjDsQfhFmosjHf5AJ/0QyRrE6HOfl8aiFyMN0Cg7e3On4dYePkJ8KvupyhgaHSomQ/YtkxNIiCFhH1/P+jUGB27LKRCNhFMT2H89E6AAq7WR8k1gPdId4y8Pz8hTo998qcwYMUzoqF2iE36iv960tVe4yd9a/5jFUZ5e3a9uXzk20kk46YP8N9REqYTfHmlQzG/OBvGRcwqLwE2u1rV21o96H6lQUzM4l4rDOLyJiX4v3xaMNO2VIl5kT4lzOtUn8YMAhX6C5gQG1ji3dvhxNAVwHlqd1/T7WYcWFHPfY X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(396003)(39860400002)(136003)(366004)(376002)(346002)(230922051799003)(451199024)(1800799009)(186009)(64100799003)(54906003)(6486002)(110136005)(83380400001)(316002)(66476007)(6506007)(38100700002)(26005)(6666004)(66556008)(66946007)(107886003)(6512007)(2616005)(478600001)(86362001)(2906002)(30864003)(41300700001)(8676002)(8936002)(5660300002)(4326008)(36756003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: HL2nm2y/6B10BoqVT3NPghoR3KBKd+xYXZs39TjtAFFHVAkjmzWjwzg7s4/sAkc4OOhoSUk6GDjzFcyZzHUKh9Srox5sb3E10Om/psDJiy0SLUI35SefG3m0oH6gYJfDUpToOwneah3LbHr3iFW+m7PfRmqbizwI+nGPVrBs94mErRJ07W44/LbmVYy5uXBv/D3x8Dyxl3OuOLvmB8AuvA92RZjDgJuOtWhsIVfNVrWe6+g4eWvcRY26V139J3BDXz53witylMOCDFnYvcXWaiAG95SEnxmZcgZdfIE4nq12b6UXO2O+42sYTVcl7TmxVxCrT1mOe0p7fGbBBQ4nQtJ/peCRxHffrWXRsKWMiT765LxmdI03jSN0+4Rnlz/YV8fq2kQ29m9utyELQfl7uZjN+RtmUn0XdIRXa0hdrt83nm5rz2+c0tyEhIwxFpu1Uy6hjrVzCJTZpvshxuF93axxq+NFwrF/MR84Kr084npxAKMfX7cHTZHAa2fcwekAlotN5pbs0lv7JdRxuS2a9fVdD/3pjsk6QYORKQ4Gi0MliitHazs5mlwnHq4Fe8/yAlYLV2GdD85smXCTT9olr6uUn/HFlwhSsmjgJ2+f24Vm7INiv3cWw7ccMZ4RENtOqDjqh8ppei5TTMiXlwtZZunH1Meo92OjvDDclu6zElUnSTqYcVVYB5KzUWcPPmSAq5By0HTwohatWde++Q3dwP/PThMedLtxxynzCNdBoqzPj0dBYfLIpNMDWCUJcGHuI5EIpMfGbOpxYjrcUZ7CEtB7V3FqDTsv8M5JrBciRBy/YvtcVJ84+dZVkzbz0C8rxlTeFoY7i0YYdLbhEnLExs6+H63nzZV9wK7pVVa/Fx6Qs61UtIy8YI08yOWgUeDvjZT3HRzfY1icWlU3dLvxtQ93uAX0huEu2eibRQ5LyCtu5MZ+7WjuW4wSrCog1TQoIKJGpI6mKd2B74nuRYrzcUvOfXWvHtuON8mvhrmMRtyJNCP+E6I9iqCE5dY8Ec0oretl5CqFVRcXZFK6HGogfwrWMeEq/bNmvHgOOWHhdWl3+zGwJ5kth8EOirjIUjSA0L+6xA0lKpVXym2STLDWt2WuhgZ+ENrIBCJGfkuLfW/949HCx+QF8geNqWDEafY4vYVVInxvCmr5PK9thKeswHQuW4qxQJh97DGJwOoE6DsE+2LRP1ozIHU7/M7GcNCCV29DVO1NN5S16w02hbKqJ0AHtrX2QasY3P4j+EgHsHb0GTgbrRubWpUYcubm/C6JSdP6MhjfnXhgk6QaDtZWU/11VU8tWLV05D/SlnpyvS6TdUGskpwz+Ruj8Joj4r6bPEshimsoqLFaLg9S8Oe7iW5+7soF6y+B4G6aAWxc3nSwNkmSxZGw9Ey4UEaGjMlgFy8dvGQDoiaVPpMvtRAeHNLXbcUCbMX9FcXw4yoiYXvotHaPkzVRiQ0dzP9D8mqegFww/kI8TOB//kZ+oB686+Z6knwXYxknEAju1g4BtBshnpvEbZ16t+HRz9b8AU/us0IjRebP+wU1m670AP8yhqej1LDlU3MLLmt+OrZ7afYMI+CEW1L1Hc+vIo98yB/7 X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 03ad5024-91a3-427a-d32e-08dbcab17019 X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:04.3232 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: AqXrEjBT1bbSF/I1YPAmnDVeruDP3UjDsy/kDohmfvHb0C/HD1oUpcL1GtF/4XJ2 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM8PR12MB5448 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162616_194311_98D3EECC X-CRM114-Status: GOOD ( 29.59 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org The core code allows the domain to be changed on the fly without a forced stop in BLOCKED/IDENTITY. In this flow the driver should just continually maintain the ATS with no change while the STE is updated. ATS relies on a linked list smmu_domain->devices to keep track of which masters have the domain programmed, but this list is also used by arm_smmu_share_asid(), unrelated to ats. Create three new functions to encapsulate this combined logic: arm_smmu_attach_prepare() arm_smmu_attach_commit() arm_smmu_attach_remove() Going to IDENTITY or BLOCKED domains always disables the ATS and removes any arm_smmu_master_domain. Installing a S1/S2 domain always enables the ATS if the PCIe device supports it. The disable flow remains the same, but the enable flow is now ordered differently to allow it to be hitless: 1) Add the master to the new smmu_domain->devices list 2) Program the STE 3) Enable ATS at PCIe 4) Remove the master from the old smmu_domain This flow ensures that invalidations to either domain will generate an ATC invalidation to the device while the STE is being switched. Thus we don't need to turn off the ATS anymore for correctness. Move the nr_ats_masters adjustments to be close to the list manipulations. It is a count of the number of ATS enabled masters currently in the list. This is stricly before and after the STE/CD are revised, and done under a spin_lock which more clearly pairs with the smp_mb() on the read side. Signed-off-by: Jason Gunthorpe --- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 189 ++++++++++++++------ 1 file changed, 136 insertions(+), 53 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index 82613f5d24f478..5137f7b2ad3858 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -1465,7 +1465,8 @@ static void arm_smmu_make_bypass_ste(struct arm_smmu_ste *target) static void arm_smmu_make_cdtable_ste(struct arm_smmu_ste *target, struct arm_smmu_master *master, - struct arm_smmu_ctx_desc_cfg *cd_table) + struct arm_smmu_ctx_desc_cfg *cd_table, + bool ats_enabled) { struct arm_smmu_device *smmu = master->smmu; @@ -1487,7 +1488,7 @@ static void arm_smmu_make_cdtable_ste(struct arm_smmu_ste *target, STRTAB_STE_1_S1STALLD : 0) | FIELD_PREP(STRTAB_STE_1_EATS, - master->ats_enabled ? STRTAB_STE_1_EATS_TRANS : 0) | + ats_enabled ? STRTAB_STE_1_EATS_TRANS : 0) | FIELD_PREP(STRTAB_STE_1_STRW, (smmu->features & ARM_SMMU_FEAT_E2H) ? STRTAB_STE_1_STRW_EL2 : @@ -1496,7 +1497,8 @@ static void arm_smmu_make_cdtable_ste(struct arm_smmu_ste *target, static void arm_smmu_make_s2_domain_ste(struct arm_smmu_ste *target, struct arm_smmu_master *master, - struct arm_smmu_domain *smmu_domain) + struct arm_smmu_domain *smmu_domain, + bool ats_enabled) { struct arm_smmu_s2_cfg *s2_cfg = &smmu_domain->s2_cfg; const struct io_pgtable_cfg *pgtbl_cfg = @@ -1513,7 +1515,7 @@ static void arm_smmu_make_s2_domain_ste(struct arm_smmu_ste *target, target->data[1] |= cpu_to_le64( FIELD_PREP(STRTAB_STE_1_EATS, - master->ats_enabled ? STRTAB_STE_1_EATS_TRANS : 0)); + ats_enabled ? STRTAB_STE_1_EATS_TRANS : 0)); vtcr_val = FIELD_PREP(STRTAB_STE_2_VTCR_S2T0SZ, vtcr->tsz) | FIELD_PREP(STRTAB_STE_2_VTCR_S2SL0, vtcr->sl) | @@ -2380,22 +2382,16 @@ static bool arm_smmu_ats_supported(struct arm_smmu_master *master) return dev_is_pci(dev) && pci_ats_supported(to_pci_dev(dev)); } -static void arm_smmu_enable_ats(struct arm_smmu_master *master, - struct arm_smmu_domain *smmu_domain) +static void arm_smmu_enable_ats(struct arm_smmu_master *master) { size_t stu; struct pci_dev *pdev; struct arm_smmu_device *smmu = master->smmu; - /* Don't enable ATS at the endpoint if it's not enabled in the STE */ - if (!master->ats_enabled) - return; - /* Smallest Translation Unit: log2 of the smallest supported granule */ stu = __ffs(smmu->pgsize_bitmap); pdev = to_pci_dev(master->dev); - atomic_inc(&smmu_domain->nr_ats_masters); /* * ATC invalidation of PASID 0 causes the entire ATC to be flushed. */ @@ -2404,22 +2400,6 @@ static void arm_smmu_enable_ats(struct arm_smmu_master *master, dev_err(master->dev, "Failed to enable ATS (STU %zu)\n", stu); } -static void arm_smmu_disable_ats(struct arm_smmu_master *master, - struct arm_smmu_domain *smmu_domain) -{ - if (!master->ats_enabled) - return; - - pci_disable_ats(to_pci_dev(master->dev)); - /* - * Ensure ATS is disabled at the endpoint before we issue the - * ATC invalidation via the SMMU. - */ - wmb(); - arm_smmu_atc_inv_master(master); - atomic_dec(&smmu_domain->nr_ats_masters); -} - static int arm_smmu_enable_pasid(struct arm_smmu_master *master) { int ret; @@ -2483,40 +2463,148 @@ arm_smmu_find_master_domain(struct arm_smmu_domain *smmu_domain, return NULL; } -static void arm_smmu_detach_dev(struct arm_smmu_master *master) +static void arm_smmu_remove_master_domain(struct arm_smmu_master *master, + struct arm_smmu_domain *smmu_domain) { - struct arm_smmu_domain *smmu_domain = - to_smmu_domain_safe(iommu_get_domain_for_dev(master->dev)); struct arm_smmu_master_domain *master_domain; unsigned long flags; - if (!smmu_domain) - return; - - arm_smmu_disable_ats(master, smmu_domain); - spin_lock_irqsave(&smmu_domain->devices_lock, flags); master_domain = arm_smmu_find_master_domain(smmu_domain, master); if (master_domain) { list_del(&master_domain->devices_elm); kfree(master_domain); + if (master->ats_enabled) + atomic_dec(&smmu_domain->nr_ats_masters); } spin_unlock_irqrestore(&smmu_domain->devices_lock, flags); +} +struct attach_state { + bool existing_master_domain : 1; + bool want_ats : 1; +}; + +/* + * Prepare to attach a domain to a master. This always goes in the direction of + * enabling the ATS. + */ +static int arm_smmu_attach_prepare(struct arm_smmu_master *master, + struct arm_smmu_domain *smmu_domain, + struct attach_state *state) +{ + struct arm_smmu_master_domain *cur_master_domain; + struct arm_smmu_master_domain *master_domain; + unsigned long flags; + + /* + * arm_smmu_share_asid() must not see two domains pointing to the same + * arm_smmu_master_domain contents otherwise it could randomly write one + * or the other to the CD. + */ + lockdep_assert_held(&arm_smmu_asid_lock); + + master_domain = kzalloc(sizeof(*master_domain), GFP_KERNEL); + if (!master_domain) + return -ENOMEM; + master_domain->master = master; + + state->want_ats = arm_smmu_ats_supported(master); + + /* + * During prepare we want the current smmu_domain and new smmu_domain to + * be in the devices list before we change any HW. This ensures that + * both domains will send ATS invalidations to the master until we are + * done. + * + * It is tempting to make this list only track masters that are using + * ATS, but arm_smmu_share_asid() also uses this to change the ASID of a + * domain, unrelated to ATS. + */ + spin_lock_irqsave(&smmu_domain->devices_lock, flags); + cur_master_domain = arm_smmu_find_master_domain(smmu_domain, master); + if (cur_master_domain) { + kfree(master_domain); + state->existing_master_domain = true; + } else { + if (state->want_ats) + atomic_inc(&smmu_domain->nr_ats_masters); + list_add(&master_domain->devices_elm, &smmu_domain->devices); + } + spin_unlock_irqrestore(&smmu_domain->devices_lock, flags); + return 0; +} + +/* + * Commit is done after the STE/CD are configured to respond to ATS requests. It + * enables and synchronizes the PCI device's ATC and finishes manipulating the + * smmu_domain->devices list. + */ +static void arm_smmu_attach_commit(struct arm_smmu_master *master, + struct arm_smmu_domain *smmu_domain, + struct attach_state *state) +{ + lockdep_assert_held(&arm_smmu_asid_lock); + + if (!state->want_ats) { + WARN_ON(master->ats_enabled); + } else if (!master->ats_enabled) { + master->ats_enabled = true; + arm_smmu_enable_ats(master); + } else { + /* + * The translation has changed, flush the ATC. At this point the + * SMMU is translating for the new domain and both the old&new + * domain will issue invalidations. + */ + arm_smmu_atc_inv_master(master); + } + + if (!state->existing_master_domain) { + struct arm_smmu_domain *old_smmu_domain = to_smmu_domain_safe( + iommu_get_domain_for_dev(master->dev)); + + if (old_smmu_domain) + arm_smmu_remove_master_domain(master, old_smmu_domain); + } +} + +/* + * When an arm_smmu_master_domain is removed we have to turn off ATS as there is + * no longer any tracking of invalidations. + */ +static void arm_smmu_attach_remove(struct arm_smmu_master *master) +{ + struct arm_smmu_domain *smmu_domain = + to_smmu_domain_safe(iommu_get_domain_for_dev(master->dev)); + + if (!smmu_domain) + return; + + if (master->ats_enabled) { + pci_disable_ats(to_pci_dev(master->dev)); + /* + * Ensure ATS is disabled at the endpoint before we issue the + * ATC invalidation via the SMMU. + */ + wmb(); + arm_smmu_atc_inv_master(master); + } + + arm_smmu_remove_master_domain(master, smmu_domain); master->ats_enabled = false; } static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) { int ret = 0; - unsigned long flags; struct arm_smmu_ste target; struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev); struct arm_smmu_device *smmu; struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain); - struct arm_smmu_master_domain *master_domain; struct arm_smmu_master *master; struct arm_smmu_cd *cdptr; + struct attach_state state; if (!fwspec) return -ENOENT; @@ -2551,11 +2639,6 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) return -ENOMEM; } - master_domain = kzalloc(sizeof(*master_domain), GFP_KERNEL); - if (!master_domain) - return -ENOMEM; - master_domain->master = master; - /* * Prevent arm_smmu_share_asid() from trying to change the ASID * of either the old or new domain while we are working on it. @@ -2564,13 +2647,11 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) */ mutex_lock(&arm_smmu_asid_lock); - arm_smmu_detach_dev(master); - - master->ats_enabled = arm_smmu_ats_supported(master); - - spin_lock_irqsave(&smmu_domain->devices_lock, flags); - list_add(&master_domain->devices_elm, &smmu_domain->devices); - spin_unlock_irqrestore(&smmu_domain->devices_lock, flags); + ret = arm_smmu_attach_prepare(master, smmu_domain, &state); + if (ret) { + mutex_unlock(&arm_smmu_asid_lock); + return ret; + } switch (smmu_domain->stage) { case ARM_SMMU_DOMAIN_S1: { @@ -2579,18 +2660,20 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) arm_smmu_make_s1_cd(&target_cd, master, smmu_domain); arm_smmu_write_cd_entry(master, IOMMU_NO_PASID, cdptr, &target_cd); - arm_smmu_make_cdtable_ste(&target, master, &master->cd_table); + arm_smmu_make_cdtable_ste(&target, master, &master->cd_table, + state.want_ats); arm_smmu_install_ste_for_dev(master, &target); break; } case ARM_SMMU_DOMAIN_S2: - arm_smmu_make_s2_domain_ste(&target, master, smmu_domain); + arm_smmu_make_s2_domain_ste(&target, master, smmu_domain, + state.want_ats); arm_smmu_install_ste_for_dev(master, &target); arm_smmu_clear_cd(master, IOMMU_NO_PASID); break; } - arm_smmu_enable_ats(master, smmu_domain); + arm_smmu_attach_commit(master, smmu_domain, &state); mutex_unlock(&arm_smmu_asid_lock); return 0; } @@ -2640,7 +2723,7 @@ static int arm_smmu_attach_dev_ste(struct device *dev, * the stream (STE.EATS == 0b00), causing F_BAD_ATS_TREQ and * F_TRANSL_FORBIDDEN events (IHI0070Ea 5.2 Stream Table Entry). */ - arm_smmu_detach_dev(master); + arm_smmu_attach_remove(master); arm_smmu_install_ste_for_dev(master, ste); mutex_unlock(&arm_smmu_asid_lock); From patchwork Wed Oct 11 23:25:51 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418101 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 1E556CDB465 for ; Thu, 12 Oct 2023 00:30:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=QfH4pVbDao9TxQzVxxGsm1iZ38DzgrdeIQToFR0CvOc=; b=U9G8BC79nuQ8Z1 uv20TqZosG/vAKaxO53IWLHD8SBXRiyhW9iKLls17+Moo8bhNW+/QNmbrNHLAtlLgx93CjJKigZL2 czH3xLVb34kz7beApKe85392AFH7xuDbcmmr9Y/i5vPPubSd2AddoBYIf8D0Z/Ojp9iI1frpND+PY r+hP6EY3XcNz31+Pw1gKCve9P1UuXrUz7TBVeKbG8fgIyh1ZcqomUtDlzs5OOKM9NBMsmqDpNoKCN Cx1cE/d3dMLHNKZaTRbCjw2yR++p5yZ3fhAMsh9HVm42Wv0GhsqR+0DrgeGymB1YCNyqBs+5HdWfz MvBe9aSICDDgUMN1MXHA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqjbE-00H35F-29; Thu, 12 Oct 2023 00:30:48 +0000 Received: from mail-dm6nam10on20625.outbound.protection.outlook.com ([2a01:111:f400:7e88::625] helo=NAM10-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqibA-00GvP6-2G for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:43 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=BACloZ6OzdHEp9K28dMXwGSFpIDbYsJw+XsJo8gC6+M4Gwb8NlpiNytAN6vqXSOcweQqwkXcSOCeibeRWq33CJO5wMfz4K4tiFcOjHTEstdP4FompXxVKpBZy09ZfW0vzt6QOgvOqg6y8fXwfScze324rISyb6kv16tD+nQwBMUker2pOvkb8TeWbQzaYbb6EFM9f42rWY9HrkQIDffY0CM5/2k2XVSD9aHjpyfpw0WQL5pqSmE42UMIK5dkH6odaKpIVQ+VenLtCAleeyag2wqPndPXnr9Ouz7YHA5nW8yp4xHo1Q/rBqayeAVrZt/eu4IkFJ3GpHkoqxKveHpJVw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=mhXGrTp0hgRMYhKFlPhO8cgRmO5VDwer4GeDnd8O01E=; b=PZvbJtrcfg8uXYfaC6QuPhP1dikmHzNzicKDKWIrCtobeb1yq/c4LJ3GS2el72X+RcE4Se11O0kyGtVTt8dXcfS64+WqY3NrSZa/IHXGh9IQt8ezu2npt1YhYj3gEqteI27d+w8tzyVhDWTsF3rD9+rzjw29IUnzlqZjtCQbc1a7XWvFDmM6kxVjmxH18g0hBBrIXvX3k5U9c3zs6+e8tXDHD0S/oi8b2UmDztGbV0UhAfyI7XZ015r5fg+LW49Vi7LipK0akjiX90itjnDGOOrUzX+Hz28Id5mTnCmsIav+lUoUrM/YpblRPigIvi7HgrnElTbSZQ/TKRaK2sR6HQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=mhXGrTp0hgRMYhKFlPhO8cgRmO5VDwer4GeDnd8O01E=; b=fqHZCsh5h2t/SrhmeRA3p8JMk8iKC40rClolLBv+Ft//vET87i/Vjd7kTXszLYtSU8/uDwfvYTR3UAdxFoht64NgxaFI3QVQlJkq38Am2vuOYpmgmxWl5PdO4Pky6SMvuIDFrq5QkkH+N/L4cnRNU2j6rQ7qhaDGQabDrP+navYCIxjF6KmljXEitgJixCNUBRqyEukW/2jX7Zy3K055ooBrenPyYbUUdaN3y7G/lUpxiwQUzhynIvV8/DLfi2fDKNqekSXuOGoo8bLzcfl6L42o/EKdtWzATfqCRAxlhWDL/S2i2Yh8ZGyFSE94HcmQZ1XzZdft1ueYM38rtfUjsw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by CH0PR12MB8488.namprd12.prod.outlook.com (2603:10b6:610:18d::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.38; Wed, 11 Oct 2023 23:26:16 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:16 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 15/27] iommu/arm-smmu-v3: Add ssid to struct arm_smmu_master_domain Date: Wed, 11 Oct 2023 20:25:51 -0300 Message-ID: <15-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: BL1PR13CA0277.namprd13.prod.outlook.com (2603:10b6:208:2bc::12) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|CH0PR12MB8488:EE_ X-MS-Office365-Filtering-Correlation-Id: 2a4100c6-92d4-45e8-2fdd-08dbcab17127 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: /oL7UkGUjaOLBq1f8Ay0SW1DYSRMFX/l40FNhg4CpA0jsgJBQZ5czqT1hPjqRymNRYGPVg+p653Fst55YBf+v5vlDTfKE5nLRkiw2jUKUDqEEsZ3QYxKguSbYXwjlUdrYXh3dShtL46gZ01d1M3rSwg4TAdwR7Kgkc5mH6t3tvJEL933ccH5ZT/HoX6hnT61yDsHrT25IQ9mA7yACLqEhVwe9xE2YlSFxQhcdThFjq/WWyF9EYlh5D0QxXcaxGSRpLs3x7G8v3Y81j1e/3H4DAvvvJVMn2Bm8siwDs2GlA7//uNg8Mnwwc56KyEWZvRf+x3j+rccVW2L6nRxzraux+DIjv9fzi/lj3qEfSKecevBZSGhs9chMBZvBSeVYJmAqURgqejmOOSR0fm/c/33kD4gGvMkuqwLI6P2BPX7h9hFiSD/IB9fJAphM2dO6qDUtQLHPbd9GGbpboPd9smzfSDXocvo8v0+LsWa78YjmNUWKhBSHxbvVevmFFOkIVxNwJEoaT6I8Tqr4Ja2ezre1zqHjLB1hiw8+LrLIagFaVS31KEan2XJ9JuaDpkCKnPk X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(366004)(396003)(39860400002)(376002)(346002)(136003)(230922051799003)(1800799009)(451199024)(64100799003)(186009)(66476007)(66556008)(8936002)(66946007)(316002)(54906003)(110136005)(2906002)(5660300002)(41300700001)(8676002)(4326008)(6486002)(38100700002)(2616005)(6666004)(107886003)(36756003)(26005)(6512007)(83380400001)(478600001)(86362001)(6506007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 6GgZjwviSz6vXRbiLb28+JuZxwReLtj6RYBXKr+kPR4T6NXVsr0yXiUjnnNjXnqv7rQZwHusYxAoPzlt4oOptzl37vewp8Xo8emI0AyF48NYeRzrdukPULKrMpw2dTmBRbCCCPU43C4e5X0RT3wtMsR5jcDq1ITBQZgr7AnLE7eU96TQTUmUgT58nCJj0YQmAWFovsz5+IwyZLNRvAfF4czrj+g2iyXk9BwRi4oK+A714TqR+6rJ3CqUxcgS5QIvrBk3QbwXQ7TAJoFkfd3WPBG9X0znU+6lUKGNU8ZH7DisndxHUr5XUBzpCJx6oN3z68KxDhDzB65J6/1KG8uyJ5/Me0bYHmKvuCu4tSOkMdHPA8WgX9gXGRiQGcna4wwvToKZhZyKUqHPJdBfxwxcGUi5O2eRPtG0yqzdeoSuIzR1QkrQd9LfLftNJ35V2p+cDEckvrmn2kJoDALbxtUFRUqCGyb05j3Ysf6bLjayc/FnA3Hx0q+ZzqDl0E79fYt181JTDtb9i4MgXCwlWI4RzVjjOaMPhpN0ZAjFemAwxUI9ou3i19LPDoKjUft0td9XAjETAo9/MG8IO4UbPD2HMN7bNEGc5JEQ4bN2DDfhGaSuaJt2mBfHOq2q07DNvlMrfbANODdOvNioJYM9sPdPFuYQAMsLugO3+xSIuSUvf36EpTnVEk0OdlP/IFOe+M0RE9Xbys0ehuuHBBD2ZuP3vEjchuW6z0PJaOTdgip0oSLPmMVYyYt6m5RkUpK/rPWd3O8PyBskrHMNMzvTIwljbT47lfjmIKe82QBv9I2IbU/uHcbGYdurvqbX4Jg1KfAPC3DDlbqmXY2WorjF9OeiJ5DsAB7S3b1FCDk9JO8kSyWUcDZ4FaywzZsfBtfMU0iFfwMt4rHXEvsyQmNbOVYVwgEFa7cJ3gi2m6+DhRq+8i2HhBpcnRup6ErbVr45NyY0ZZlqNrYwqhcMqfFpGFt6Cv4fbNfp6sTrMxPFSKaphR2URYYJtCNy8Bk9aaEh3JF/DjynjYTqMdomo6AgJjPwGOv0E179Ct2sv+v/5xVJS4wZCkOJO+ki7b3xXRqHcl0hMSsk31RnCREdoV9e7+G1ECxBkhy8Uz7WmuUWhBvyjyPg6DAZPfmvvpYodZhUSM5K0UkjHnWOA/6U3qtM+M5Lgpnn/080/qTiS2G86TWppONLl5zygVSRToLco0n2ZW4e770gTbBodNarpaKwsIDbbFQMgOm9vihiFoPQml9+5sYnLiKFr8K9Pe0nAkHz3LMncb5CxtTgXz/n3YuyXfF/MlO+ZmiJXOPeu9x30VlerM3t4TMeKBI712gQ9FupGVOgzka6QduilImGvscZlcNQaDnhKCGWiqM13l4vG9DuNyLOObdtUeQNd90RFw9/vF/8XhPD+Wa40BYvOVGrVyY9dWw8rAp3rSyhP7cSUrYd79cyxjQJiG7iHl20QCPeyPcd1txJ3iJjQrVCWmkI7Vf5PtP9Zp8eqwYwbzK6Vs/znxT+iv6biHEmKc9bHviyS7rSlrHmlwB4ev3XSwVtF4eGxYbabv9f6URJsExW7R1adaK9Axb66TCG7iwAM9xbO/2Z X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2a4100c6-92d4-45e8-2fdd-08dbcab17127 X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:06.0814 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Qs2+L5V+tnRGNud1yVLmOOBluztjErkPYP84RlgRS5SoCboaNroRZCbp5XyMPaAf X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR12MB8488 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162640_761909_661DA9F3 X-CRM114-Status: GOOD ( 16.63 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Prepare to allow a S1 domain to be attached to a PASID as well. Keep track of the SSID the domain is using on each master in the arm_smmu_master_domain. Signed-off-by: Jason Gunthorpe --- .../iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 11 +++-- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 45 ++++++++++++++----- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 5 ++- 3 files changed, 43 insertions(+), 18 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c index 0a2339d9e518ac..702a6ef9df8a22 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c @@ -49,13 +49,12 @@ arm_smmu_update_s1_domain_cd_entry(struct arm_smmu_domain *smmu_domain) struct arm_smmu_master *master = master_domain->master; struct arm_smmu_cd *cdptr; - /* S1 domains only support RID attachment right now */ - cdptr = arm_smmu_get_cd_ptr(master, IOMMU_NO_PASID); + cdptr = arm_smmu_get_cd_ptr(master, master_domain->ssid); if (WARN_ON(!cdptr)) continue; arm_smmu_make_s1_cd(&target_cd, master, smmu_domain); - arm_smmu_write_cd_entry(master, IOMMU_NO_PASID, cdptr, + arm_smmu_write_cd_entry(master, master_domain->ssid, cdptr, &target_cd); } spin_unlock_irqrestore(&smmu_domain->devices_lock, flags); @@ -285,7 +284,7 @@ static void arm_smmu_mm_arch_invalidate_secondary_tlbs(struct mmu_notifier *mn, smmu_domain); } - arm_smmu_atc_inv_domain(smmu_domain, mm->pasid, start, size); + arm_smmu_atc_inv_domain_sva(smmu_domain, mm->pasid, start, size); } static void arm_smmu_mm_release(struct mmu_notifier *mn, struct mm_struct *mm) @@ -321,7 +320,7 @@ static void arm_smmu_mm_release(struct mmu_notifier *mn, struct mm_struct *mm) spin_unlock_irqrestore(&smmu_domain->devices_lock, flags); arm_smmu_tlb_inv_asid(smmu_domain->smmu, smmu_mn->cd->asid); - arm_smmu_atc_inv_domain(smmu_domain, mm->pasid, 0, 0); + arm_smmu_atc_inv_domain_sva(smmu_domain, mm->pasid, 0, 0); smmu_mn->cleared = true; mutex_unlock(&sva_lock); @@ -401,7 +400,7 @@ arm_smmu_mmu_notifier_put(struct arm_smmu_mmu_notifier *smmu_mn) */ if (!smmu_mn->cleared) { arm_smmu_tlb_inv_asid(smmu_domain->smmu, cd->asid); - arm_smmu_atc_inv_domain(smmu_domain, mm->pasid, 0, 0); + arm_smmu_atc_inv_domain_sva(smmu_domain, mm->pasid, 0, 0); } /* Frees smmu_mn */ diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index 5137f7b2ad3858..59de4f5302c57d 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -1943,8 +1943,8 @@ static int arm_smmu_atc_inv_master(struct arm_smmu_master *master) return arm_smmu_cmdq_batch_submit(master->smmu, &cmds); } -int arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain, int ssid, - unsigned long iova, size_t size) +static int __arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain, + ioasid_t ssid, unsigned long iova, size_t size) { struct arm_smmu_master_domain *master_domain; int i; @@ -1972,8 +1972,6 @@ int arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain, int ssid, if (!atomic_read(&smmu_domain->nr_ats_masters)) return 0; - arm_smmu_atc_inv_to_cmd(ssid, iova, size, &cmd); - cmds.num = 0; spin_lock_irqsave(&smmu_domain->devices_lock, flags); @@ -1984,6 +1982,16 @@ int arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain, int ssid, if (!master->ats_enabled) continue; + /* + * Non-zero ssid means SVA is co-opting the S1 domain to issue + * invalidations for SVA PASIDs. + */ + if (ssid != IOMMU_NO_PASID) + arm_smmu_atc_inv_to_cmd(ssid, iova, size, &cmd); + else + arm_smmu_atc_inv_to_cmd(master_domain->ssid, iova, size, + &cmd); + for (i = 0; i < master->num_streams; i++) { cmd.atc.sid = master->streams[i].id; arm_smmu_cmdq_batch_add(smmu_domain->smmu, &cmds, &cmd); @@ -1994,6 +2002,19 @@ int arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain, int ssid, return arm_smmu_cmdq_batch_submit(smmu_domain->smmu, &cmds); } +static int arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain, + unsigned long iova, size_t size) +{ + return __arm_smmu_atc_inv_domain(smmu_domain, IOMMU_NO_PASID, iova, + size); +} + +int arm_smmu_atc_inv_domain_sva(struct arm_smmu_domain *smmu_domain, + ioasid_t ssid, unsigned long iova, size_t size) +{ + return __arm_smmu_atc_inv_domain(smmu_domain, ssid, iova, size); +} + /* IO_PGTABLE API */ static void arm_smmu_tlb_inv_context(void *cookie) { @@ -2015,7 +2036,7 @@ static void arm_smmu_tlb_inv_context(void *cookie) cmd.tlbi.vmid = smmu_domain->s2_cfg.vmid; arm_smmu_cmdq_issue_cmd_with_sync(smmu, &cmd); } - arm_smmu_atc_inv_domain(smmu_domain, IOMMU_NO_PASID, 0, 0); + arm_smmu_atc_inv_domain(smmu_domain, 0, 0); } static void __arm_smmu_tlb_inv_range(struct arm_smmu_cmdq_ent *cmd, @@ -2113,7 +2134,7 @@ static void arm_smmu_tlb_inv_range_domain(unsigned long iova, size_t size, * Unfortunately, this can't be leaf-only since we may have * zapped an entire table. */ - arm_smmu_atc_inv_domain(smmu_domain, IOMMU_NO_PASID, iova, size); + arm_smmu_atc_inv_domain(smmu_domain, iova, size); } void arm_smmu_tlb_inv_range_asid(unsigned long iova, size_t size, int asid, @@ -2449,7 +2470,8 @@ static void arm_smmu_disable_pasid(struct arm_smmu_master *master) static struct arm_smmu_master_domain * arm_smmu_find_master_domain(struct arm_smmu_domain *smmu_domain, - struct arm_smmu_master *master) + struct arm_smmu_master *master, + ioasid_t ssid) { struct arm_smmu_master_domain *master_domain; @@ -2457,7 +2479,8 @@ arm_smmu_find_master_domain(struct arm_smmu_domain *smmu_domain, list_for_each_entry(master_domain, &smmu_domain->devices, devices_elm) { - if (master_domain->master == master) + if (master_domain->master == master && + master_domain->ssid == ssid) return master_domain; } return NULL; @@ -2470,7 +2493,8 @@ static void arm_smmu_remove_master_domain(struct arm_smmu_master *master, unsigned long flags; spin_lock_irqsave(&smmu_domain->devices_lock, flags); - master_domain = arm_smmu_find_master_domain(smmu_domain, master); + master_domain = arm_smmu_find_master_domain(smmu_domain, master, + IOMMU_NO_PASID); if (master_domain) { list_del(&master_domain->devices_elm); kfree(master_domain); @@ -2522,7 +2546,8 @@ static int arm_smmu_attach_prepare(struct arm_smmu_master *master, * domain, unrelated to ATS. */ spin_lock_irqsave(&smmu_domain->devices_lock, flags); - cur_master_domain = arm_smmu_find_master_domain(smmu_domain, master); + cur_master_domain = arm_smmu_find_master_domain(smmu_domain, master, + IOMMU_NO_PASID); if (cur_master_domain) { kfree(master_domain); state->existing_master_domain = true; diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h index a4da5c164dc62a..8349649654e2c9 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h @@ -738,6 +738,7 @@ struct arm_smmu_domain { struct arm_smmu_master_domain { struct list_head devices_elm; struct arm_smmu_master *master; + u16 ssid; }; static inline struct arm_smmu_domain *to_smmu_domain(struct iommu_domain *dom) @@ -783,8 +784,8 @@ void arm_smmu_tlb_inv_range_asid(unsigned long iova, size_t size, int asid, size_t granule, bool leaf, struct arm_smmu_domain *smmu_domain); bool arm_smmu_free_asid(struct arm_smmu_ctx_desc *cd); -int arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain, int ssid, - unsigned long iova, size_t size); +int arm_smmu_atc_inv_domain_sva(struct arm_smmu_domain *smmu_domain, + ioasid_t ssid, unsigned long iova, size_t size); #ifdef CONFIG_ARM_SMMU_V3_SVA bool arm_smmu_sva_supported(struct arm_smmu_device *smmu); From patchwork Wed Oct 11 23:25:52 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418071 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 7993ACDB465 for ; Wed, 11 Oct 2023 23:28:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=vSQjGgzGVP5MNd//HTbs+ZiOZYtMxT6peOjp1zqTd2U=; b=VIcWbcpmppOK/L 2dR7c4MWAwAgsYdHKVETPmr5pmNssZUZVgtw/9YolnQv0dDdTJzrv6kS8AjzGVqGumo442igKIK+1 Qq8a77S6jeAOZIIasdCAuuVFEFubsrytneKHfQXPxfdwdcOaVOR7d1r6Z7ZQUv2WG+WS964Z6naP3 v49oaVKbDqt4UEG/RLvQOpdLwmBw7fVZGrKf6bBqlBf1m7vyaMuJQyPjLGJ2FrsbOORZFuh109Ck3 PofOtRzMBj7Fno7sY220UuR8IqrPe3JsB4Bt/WP0FKzO5C2bcAOXQNd+hs+kWTdeMgPukrTxwsWQX PJy0QqbAfXAxHPdy5+5Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqic9-00Gwaj-0j; Wed, 11 Oct 2023 23:27:41 +0000 Received: from mail-dm6nam10on20625.outbound.protection.outlook.com ([2a01:111:f400:7e88::625] helo=NAM10-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqib4-00GvP6-2X for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:38 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=EfuGHkXsOi6SefW1ss1Y7QgGqDlgIZfTx+7peT0pbPrz5Dmf3X/I5ZylYJpWKrjmpirAk0omOPcoci8j0xkjPcumzcE+5IXvJwyBvPu6ckptFoIbwhnMFXEjINKL352WzHoB76lLgbEbHL53G8AJn2vlzfPbUYdJ+bdxYQFMUzbyLUFSf5GpbcZfwp2oYylYCVFpl+O+2NVLbx8MhQISLLm2hoVHXYTYBG3ALMz89oY/RXNF8fDU8QV+YYc356VBhFRJSCMMwjmXN5NsEfg9Jaw91P3jIObSZp5P4iUtYYnLz0/Z76ywXwV+cgmGay2UuNOiD+npteUvnp/Dvv7duw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=837dQpaj3Tn2epJ/3vfg4JCsvHYuo27DOgJ2vHLi5Zs=; b=InLlL3drLwlaozlo/mAVNs9p/q1zbMmKJGg1m4BGL/qCbzXOHjo5L3oJISWZGxW+qLbK+JZjB5PxsoAvkGmzUWviqOtUGY/xL77rIgAquXYLdkHzwTrUtJkN0VkRiy2GF3tP3x/z/45bX4yn7hv4QxRTvsM8Rptek6N61oVowL4Lu/P1hOb3vMEfTYTJyu4SOUvTOtXDsgptQ00A2CnQZagiilCmbgtbg+PgfreggkrZHN/2ASBbRvkj4ZlUNDBdWCpZFVTy46uF78QtZ3+XV1s8Y5vHlhQFxFhsaDmyMp832TcBBHId8iGEH3raoc44Y9pknOpfmdlmQccn3gvgCQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=837dQpaj3Tn2epJ/3vfg4JCsvHYuo27DOgJ2vHLi5Zs=; b=p0FbjwmELoiLIDz8fwKPiYQl2/N8+IEuKfGhMi7EEjtLjLscm/XyAdq6R5BwFPSvW2bkF9TUzBBtlcAbvnu/BPK2Jw3ykOylRdwbCk7AwUZyDeIbT5CKHKxGcGxbZpJ5cU7bB2nSHx3YKHWnWaMkMV/htbXGbkciQDpIUS5jQCcqZBVmmcyQvX3ruOVA3E0coRivPAsKW2WkWXKzZHWqVvfKRAKkclvqP5ZlO2zogbVPJOPknf9jKMLFxAu36SjT3HMoZluNBo2jA84904L13CQ1PRLdEHcmjYGkup4+1dGtiS22LbghYNT5QEWdC38YEUdHjbSHtHHOsTrs/BRjSA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by CH0PR12MB8488.namprd12.prod.outlook.com (2603:10b6:610:18d::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.38; Wed, 11 Oct 2023 23:26:12 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:12 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 16/27] iommu/arm-smmu-v3: Keep track of valid CD entries in the cd_table Date: Wed, 11 Oct 2023 20:25:52 -0300 Message-ID: <16-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: BL1PR13CA0017.namprd13.prod.outlook.com (2603:10b6:208:256::22) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|CH0PR12MB8488:EE_ X-MS-Office365-Filtering-Correlation-Id: 66840c2a-2956-4bee-5f6d-08dbcab170d1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: kV5yQUkr2ncKh/Tg6dpH6DiVt0u9GCiGtLOMIqdDHzSaJqGt9GjzftCQV3vqKWeptgvtX4wQY8JjiZUf8J7qz0x+0WnjehVql7vruvVcMNM9FnQ1GudLsS+GBuCwz+8aB+oc0/hqmjPYow3/CgWZsE/nifMEwbSjb/RGPOfo1ic6V2zc+vUkWjKge9AvgPZ6118vTmaPWKyi/+RKAQfQp7y4ptPKUNDJ8s4LltY9Q3Hrs2xZYRkEvvfydop+e7cgw+vHNEqN64UattaAq0DVpLQe8S6g8sOU4Pzuad1XGTtfKrt3A3wZVnsSJxoQJXmo1HmUb6UoWEoTAmYJK14oKDj4/sQ88Op9YBO/6i8aiA9cjIN8RMvW12vpGpwX7zNcK+pxDwd2LWTpG7nY8WCooZlhtGjzP09ITl4u13NyafzunNP/zTBUGLy7z1i/sRZcTiFnn9stR7hiUqJEz/JC3uf3bwQQ1X3+b9+P4R9vXB4rSMzupoiexNIZuaHERS5uLI/ilcvT6b6CaA1TP+Y/onzuOLKjXgfi+k96e+phPrJj3/x/f7TqGzquRW8U38YUZ1ouGl0exj7r6SobebbYMp7UTlzl2Y4BysEV6P5tTYkTfQ/u2s1+DeSSNVX6mLMiwoUo9WMHNm0JxZsFt8tkBA== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(366004)(396003)(39860400002)(376002)(346002)(136003)(230922051799003)(1800799009)(451199024)(64100799003)(186009)(66476007)(66556008)(8936002)(66946007)(316002)(54906003)(110136005)(2906002)(5660300002)(41300700001)(8676002)(4326008)(6486002)(38100700002)(2616005)(6666004)(107886003)(36756003)(26005)(6512007)(83380400001)(478600001)(86362001)(6506007)(414714003)(473944003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: +KPVlMnQ+F69OGyIqs4VSKy4ZFMxdt+h15MA+Hzxt0JeGdHbjpGE/tHT8R7JFExMhF5r8v5IqQ7aKbehHyBWgetHivdspouUOol2z55hxTdvGmeG2hK/sSYvXXmHWnnT2K3AlFGXxTHPK9XYVaXBV7/2JO2LTc15lh9nJvWfa3W2psog5INhe4Ne+y9smHLtitVDVgjLO2z5cY35jLcDmzNpi02y1eRR3BJBBBFv5CrYY2G5LENF/Wq+rnG89CXuKD6omTBessqULbu9dIzMNQOYToMQMrgQEh/pk2L3L7Xhwt0TGWHgshrLO12G5F2gafJVb0yMgdQmtMcWQqcutmigZcTiRIIgm0eKgVc4H7KkSz0pYbFHJsdfSD8iGQwomCjZLNonpByn8aqu1CaY6JZamKxHWrd3LjZjh9Ve7yOmLWhWvZQL4Zj2H3K/JcECRwwUyayZaMG+NUntswshqexXjV+u+nFtH515Dy7pqnEfuBhMgte2M51kawlCBm4Csd72URyTAyMA8HNaRLA0FnvL5JUCewwJSWHbZWE8XsJ+uF5Z8LTrMl9zRdxObBCxGrXrf+7VWPAdpznzUIRDRrTruSpvhdTDd/cn4OJUa+C4W91QOP4XfDksmSsnzNs2DKSRuzyKIMT60PYWzS+DgU+VG3sTuDVkKc9YdmxrXKwYNbnQ1GP/ZItQEdqAJI9TKXuva0ryIbmOe+aqjlEjo2tmlMrQnVRpIpkiGQ4zrvzQ47Xf3MJmSb7flkA5mPStt/kC4Hqda+7dNAaEECzsa3uogfaC2P2fIzpc2/xvbLubcOXs6SAFb7909KzB5EZl68ze2kFfIK/M/rI0KqzvsAtUAcz++NsAPEhZRMQWdfDTzoW+p+JX7r0cTjhIL/IpF24WFr78jSaOL7UOIz+h+GYhuB5zELrhHtieocE/Ywg9AvAlF7zUpaDM2s2XpPQvDPwG1eGUjEpmmabuW0Ia0mM8mzY5CoiWTLguqcQjv912vHefqeHdbifryRFwy9Mgk5AOs3lTFMH3Q7/kAzlekuwnvCPCIrOfUf6RV5UdTU4assudiGxx2bh5RAs00JZptciX7VRRW9buVCKWSxHLufLPArRLMgXVLrLIzohGeL7539Lpog3yH0goQVnwyBRnCPRlRgGqZPeWaLxBnT7QagrHFvzq/+hmWxcblmexlh+fjmjYbFYnG1EjwPjPnNPA+ddn9NAw2FKc5EfQl7iwfC/XUT0DxGBAm9k7WFZc6CEd2BQheItWo3Unr4mlV9CtTo/NdebCL0exFuh/DCP30re5dcE/bKvIs9SBLSLdQhcG5kBXoIZLXfIBlC9ph9iH5H1Rqm9HWXzqM0xaHLwsbqZ19/Hc7+1ivgSF2v0UfbV5gOH9hFz0fC4b8sGVkaduUNcV6x1yYG7RuGRtLjsDTcEi7z/ex+DhXZvKY6k4kLDrqkOhjWhcokkLIYSr0W75fGcxiC1SwtQSJIBFt+zV6sGuluuQJp6MmpjfLkMLum7MtSI5NCK2ag6mpLpoLR7qhBobIQfJQzmtsYnuCknFUKojOT0nqghDSEgDrm7QC1MhNV437xnyiJcxIIFBk3nN X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 66840c2a-2956-4bee-5f6d-08dbcab170d1 X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:05.4715 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: aHDBBwbpdD7+aJlP3oW7r0wHRmt697vZVJaxD0ryC1bVcVZaCwm5U87pOWRmJYLp X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR12MB8488 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162634_867525_2B711EAD X-CRM114-Status: GOOD ( 19.25 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org We no longer need a master->sva_enable to control what attaches are allowed. Instead keep track inside the cd_table how many valid CD entries exist, and if the RID has a valid entry. Replace all the attach focused master->sva_enabled tests with a check if the CD has valid entries (or not). If there are any valid entries then the CD table must be currently programmed to the STE. Signed-off-by: Jason Gunthorpe --- .../iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 5 +--- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 26 ++++++++++--------- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 10 +++++++ 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c index 702a6ef9df8a22..042daaef0c9703 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c @@ -421,9 +421,6 @@ static struct iommu_sva *__arm_smmu_sva_bind(struct device *dev, if (!smmu_domain || smmu_domain->stage != ARM_SMMU_DOMAIN_S1) return ERR_PTR(-ENODEV); - if (!master || !master->sva_enabled) - return ERR_PTR(-ENODEV); - /* If bind() was already called for this {dev, mm} pair, reuse it. */ list_for_each_entry(bond, &master->bonds, list) { if (bond->mm == mm) { @@ -643,7 +640,7 @@ static int arm_smmu_sva_set_dev_pasid(struct iommu_domain *domain, struct mm_struct *mm = domain->mm; struct arm_smmu_cd target; - if (mm->pasid != id) + if (mm->pasid != id || !master->cd_table.used_sid) return -EINVAL; if (!arm_smmu_get_cd_ptr(master, id)) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index 59de4f5302c57d..a3d2914bcc36ae 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -1154,8 +1154,19 @@ void arm_smmu_write_cd_entry(struct arm_smmu_master *master, int ssid, const struct arm_smmu_cd *target) { struct arm_smmu_cd target_used; + bool cur_valid = cdptr->data[0] & cpu_to_le64(CTXDESC_CD_0_V); + bool target_valid = target->data[0] & cpu_to_le64(CTXDESC_CD_0_V); int i; + if (cur_valid != target_valid) { + if (cur_valid) + master->cd_table.used_ssids--; + else + master->cd_table.used_ssids++; + } + if (ssid == IOMMU_NO_PASID) + master->cd_table.used_sid = target_valid; + arm_smmu_get_cd_used(target, &target_used); /* Masks in arm_smmu_get_cd_used() are up to date */ for (i = 0; i != ARRAY_SIZE(target->data); i++) @@ -2637,16 +2648,6 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) master = dev_iommu_priv_get(dev); smmu = master->smmu; - /* - * Checking that SVA is disabled ensures that this device isn't bound to - * any mm, and can be safely detached from its old domain. Bonds cannot - * be removed concurrently since we're holding the group mutex. - */ - if (arm_smmu_master_sva_enabled(master)) { - dev_err(dev, "cannot attach - SVA enabled\n"); - return -EBUSY; - } - mutex_lock(&smmu_domain->init_mutex); if (!smmu_domain->smmu) { @@ -2662,7 +2663,8 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) cdptr = arm_smmu_get_cd_ptr(master, IOMMU_NO_PASID); if (!cdptr) return -ENOMEM; - } + } else if (arm_smmu_ssids_in_use(&master->cd_table)) + return -EBUSY; /* * Prevent arm_smmu_share_asid() from trying to change the ASID @@ -2732,7 +2734,7 @@ static int arm_smmu_attach_dev_ste(struct device *dev, { struct arm_smmu_master *master = dev_iommu_priv_get(dev); - if (arm_smmu_master_sva_enabled(master)) + if (arm_smmu_ssids_in_use(&master->cd_table)) return -EBUSY; /* diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h index 8349649654e2c9..ae8b2d8c7192f6 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h @@ -602,11 +602,21 @@ struct arm_smmu_ctx_desc_cfg { dma_addr_t cdtab_dma; struct arm_smmu_l1_ctx_desc *l1_desc; unsigned int num_l1_ents; + unsigned int used_ssids; + bool used_sid; u8 s1fmt; /* log2 of the maximum number of CDs supported by this table */ u8 s1cdmax; }; +/* True if the cd table has SSIDS > 0 in use. */ +static inline bool arm_smmu_ssids_in_use(struct arm_smmu_ctx_desc_cfg *cd_table) +{ + if (cd_table->used_sid) + return cd_table->used_ssids > 1; + return cd_table->used_ssids; +} + struct arm_smmu_s2_cfg { u16 vmid; }; From patchwork Wed Oct 11 23:25:53 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418066 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 157ECCDB47E for ; Wed, 11 Oct 2023 23:27:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=L5+yzquKVbLKoTEs8lnFOaO0OEDvQNgzHg2IH4o/XrI=; b=Hr8gCZKt2aCYID g2PDsCStLuKxlDY+pH3lVAjE855E6GC5LyjGdkrxVsl07RreyxJnMS+OQ1+WFDvJN8jY2xxdgUSvY azr7Vd0zcz0NmO+tr1MN4KpfCMTpTquzBXnhmgbZsakm+yRwhHL8QQTHn0bGnoP0xjHbDdWxUjUUx ckEoGD0ZlmYPLmhEv3jXbpGOIEBf+01gsZ/jhm1BQOI4uUhA2eSRPeakoP8kznQBUgYW8+RWPab1D 8Nyaa50XdlHwDeWO5rAeumHCAf4u32iGIrYWjX5Y4vnvlBtCQZR8q4D+zGM8tmsr/nryJjmNSHTcd DmjQafP66P9n7zhPYHYg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqibN-00GvyT-1w; Wed, 11 Oct 2023 23:26:53 +0000 Received: from mail-dm6nam04on20620.outbound.protection.outlook.com ([2a01:111:f400:7e8b::620] helo=NAM04-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqiat-00GvSY-1a for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:29 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=iloaEi5vEEe0lOaVMmj1wXJ+hmtV+HfDPg++gv6pST/8a3O0oGQlZN9wDRfikr3yK0OXwpi/F91bStFL1uPwGHow/wiNFSEKc2OmpZHhSX3HXzHobQfwKjtPEctmALqIaAa/kOXGc7AQg1ZyrcugOXobdaujhuZbwrIMhLLAic3OKKAHY1M9dCNePecZ2QNTg/jSMWZmzkmwidoe4UCFgoYtxNsSAnREgUlGGIeYJFFQAfLQLG6Guj7+x/M43DfoSVUVrXq/hlVo6KOLETY1amS5zOGyfv4W84qJgZv7+EaHDoH9/51TQgCR8M1G7wKH/9VR4trBM/s4PCFvchowYA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=OIMsJB1EhKvw7N04McQ+UxuhT8RQoyA/rGBwiZW3XFY=; b=afjPoWOBvIrJNiJye4V6crvsh8jSN9O/47GESt0YbzsNfFcnr146zyj6fiM9nVanYWthAbsTDbTCSDFVImGOY/zMQy4tSm6XJPD19b5MoUXDowz0yeKV6Ym/FYM9OXBkdnfkAWoNLevMEpOs1TCmJjMwR0rC707PBvkuf2PWCRtMWstWkYIa9LcnWU90oMZ1o/FAt7QzpKDQsQysf9ICXjo1irnAZ1akm5r/cxiYBECimReY1vqE/a57u7WsvByzUMpgjXntZXfT4LG5hhbUXbX3BYdce3UGsstNnS1sc9er/z/MBRMLkO7whiqcxaxyfbi6Rqid3tM/ZlkhHLa6dw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=OIMsJB1EhKvw7N04McQ+UxuhT8RQoyA/rGBwiZW3XFY=; b=om9iepKGW7OrDImPyIc9zmzBuJBiWhPXr3fqOQ+zJWvaDDI4WULwTEOXuxsl2IKuWMSLGxAQwtczs6uH/esAsejguGBkK7XcWIho4PETGew5ayXPFx9kQaMee/j9oZXo20eCPg2/eE9Ah6hlOWckKHBAieB66mZ42CZRs4BgcZuZwx72MgDXQef9DcBxb4zXOaQUBMEGE6wsWsNzxzodmetB1456WvYHAlvo4WqX4UPUeMAxQentcfNYkQPaONQbQ3j5606eBKcB4ti3txpAPJVINgP0DyC5yABLo5MQN8S8Bah39hAisUuyypFt8+UBMh4ogjzLZ20iIlEKQmTd2w== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by PH7PR12MB7380.namprd12.prod.outlook.com (2603:10b6:510:20f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6838.31; Wed, 11 Oct 2023 23:26:14 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:14 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 17/27] iommu/arm-smmu-v3: Thread SSID through the arm_smmu_attach_*() interface Date: Wed, 11 Oct 2023 20:25:53 -0300 Message-ID: <17-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: BL1PR13CA0009.namprd13.prod.outlook.com (2603:10b6:208:256::14) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|PH7PR12MB7380:EE_ X-MS-Office365-Filtering-Correlation-Id: 781cef48-dbb1-4590-9506-08dbcab1710a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: NKED7TNzvgpQ5vslv+QC2v+FzXwbEvDhoGhHDHPlwNCOdeTOGj7lz+bNuCvV6KonAtTOQTh6C0fPxI3C24a9PRTorkDQlvnIX5KiVf6dcbErnGYCwBsDURpRfUlQbo0kAyfYZN6yQBfY8HrdDXOE1D7LQy3tnKynPDw0EdT9yR+iJcBKOZ6cnsTzTvKt5fBwAsptcxX7WKaBJbpMqAkG1cQRYc69UhIk7idXq+UW/eewhScz9JhfB2PNlTRJZVjCPud3T5Y5/mCpP4WZD9YwhgbUZfku2FtiQafSrDEWEg2yLS4pPvZBcxOjhxFKa4O2XqmSC3gi7CyjZstAdCX/I0vYLOyZ38dKpLGEjfIm0bjzYdBdidnAYzZsgI9Ou+QzSCENV4iZSDvDjzzv7KXtxCCDonsUqMXh0CO/l850yumSXfjHLWPOTcAg028eMDchSD3x9TT0nH2QFfU3d1oKNqsb5rFaS/h+FklHXbjGGrNbUf4v8Zpm3qavfSYW8MHf9Sh2ibyy0Oe1CZfzt2yQPpPpNZWanIe00uWZsVOpxmXm0kWqxj5tKfCYosJIvVS8 X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(39860400002)(396003)(346002)(376002)(366004)(136003)(230922051799003)(451199024)(64100799003)(1800799009)(186009)(36756003)(6512007)(6506007)(8676002)(2616005)(83380400001)(26005)(107886003)(6486002)(6666004)(478600001)(38100700002)(4326008)(86362001)(41300700001)(66556008)(8936002)(316002)(2906002)(66476007)(110136005)(66946007)(54906003)(5660300002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: uFNjcvlCQ9OxUbDPZ7wUBk60kJmpSdQBUqzlu91thwpBZ5RnDUMWfH5gpnAfo42EEWlAOlA2WGy7UYaESE86EmzBJy14RdsxovhjFDMqBlEyUFrrhbVy81vTvUPDDa1lr379meFLJ2Us0rvot5rphbN1YL3Z59DPyH6E1W1O9rGkSVfMz26tDs4SEgQ2AXi+hPpBKHl+JdgCpYKoZVqZd2zJ2uX9FTuxsr8B6vydGsGIXqRp2JowLHOc1UoQ9EhD1Yw4urh9PH3ziC0oP9eF4qlghFhMA5HxztuY3m2HVXO9XPQzal0McoyiVO4hQKIwTJy+6Mg2kF2YBMOtHnYIeuLLd8ghkPBpzKBn7i71HOI+opotI+PofklLrUgsxz8SWEasmgEkoaR/iL5f8szzNy7uEG92vU8fQpoJQDsFo8Uiree5s1G/q0A45L1G0OvVjIFtnLoZ+SmLi5MZadCHQSGW+ftwws6eea4Mpk3Me92IWh03kULx79C5wgOc2ILKsYuoAEE/KMqynI3qtFkVV61j32Sm/MIA8GKWxwt9Eq2wV5PjaMVGTXiSEzaothrna/Rq0oQQGaSJaVrefOXfl8mnYcBG+CBYuIkc0K6E7FICY8xJwi8C7TDo3Zwtprp0+p62FQexEYaUSnFaQlfIlJc9vV/4YpddvnhtGtcxBzpYt5+C/aDI3peLxiBkTGP6y0IfQd6GEp6zSWXk3XGSFSZ64GvkN4MlH6uPycGMu0u1rre0/qlxLH/EpL+4BNFaWM0+D1get3TEulW+qljnu0kLzbPYTLWQWx8Komb8T7vGnaG5w39RHa9cxdP8Q09q/qhix4XwKPdR3sViOnZAwHwiO3w0lvysQwcg1hAOheLLtkQiYVhIOqHLR0mvtF8QuQCv1JheRegiv5Yi8fsdgV1M4H1EiiwWtagkgYCOHROfjnayDHK+BAxOAsGh6pC01I9BkgvJlTtz5bGpW78ecV6Nfo1VfjPm+vjGTIJkLBjda8YKn6v4ihhHbEvOGAzXsaBapE91LEP95fwcTWzR8PpYWRsn2f4lrVCUGu8r2LMW51lhexZO+Dz3HzSDO+PQD56wnqOlDrs6e7VwY1lU24VAuswz9OLCImA59K3370UKDvnc/MEtAcXE3/zcWgLdz4lcwOIW2+WB0NzFqfjSVW4p4LGI3oFzLsSL2IoJqtRp6dWsqi4cE4BIJNcOeJQJk1l0aPNb8dcDAFzsw9dbG1yE8TtDYBKQ4kGj5no0gEq1JwM6KP+CpakMYr4P8ShyA9IZC0pIX6F0F3g/f1Xk0TEpLq6v/7c1mxGXMK1yVqoj0C/u0BoBEJa9Qx05sELFWLOo9AbgyjR8CB0SefTVr1v98c6IKUZobcBIX/lzsTjKo74RUwOfzB31Rdyf7XOiZaCQint8w+l7KZC2kW79qCnpalLmlQ4+QRlurOSI9E42x84hVV7QIFpA7fLqS5sDb1yx4ssz5Qr7WM9ViFP9INTbnVf+/PBD5J30AlFQGffACoIcXMIhIH+jn2Z9tHj71IpsEmQuYiyeoV9DjKSI9xMvx37r24PBc2YjWdu6btEcd+4R23/UqHNMhKQzNnqI X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 781cef48-dbb1-4590-9506-08dbcab1710a X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:05.8407 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: KZNrCEHPXciAp1QgehcgpUJp2ghf3ItS6mJcneBZjq+dQGDcTbmSWnHKjYc/eleL X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB7380 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162623_601787_490CF845 X-CRM114-Status: GOOD ( 16.64 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Allow creating and managing arm_smmu_mater_domain's with a non-zero SSID through the arm_smmu_attach_*() family of functions. This triggers ATC invalidation for the correct SSID in PASID cases and tracks the per-attachment SSID in the struct arm_smmu_master_domain. Signed-off-by: Jason Gunthorpe --- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 59 ++++++++++++--------- 1 file changed, 35 insertions(+), 24 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index a3d2914bcc36ae..43e0c15432073f 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -1937,13 +1937,14 @@ arm_smmu_atc_inv_to_cmd(int ssid, unsigned long iova, size_t size, cmd->atc.size = log2_span; } -static int arm_smmu_atc_inv_master(struct arm_smmu_master *master) +static int arm_smmu_atc_inv_master(struct arm_smmu_master *master, + ioasid_t ssid) { int i; struct arm_smmu_cmdq_ent cmd; struct arm_smmu_cmdq_batch cmds; - arm_smmu_atc_inv_to_cmd(IOMMU_NO_PASID, 0, 0, &cmd); + arm_smmu_atc_inv_to_cmd(ssid, 0, 0, &cmd); cmds.num = 0; for (i = 0; i < master->num_streams; i++) { @@ -2427,7 +2428,7 @@ static void arm_smmu_enable_ats(struct arm_smmu_master *master) /* * ATC invalidation of PASID 0 causes the entire ATC to be flushed. */ - arm_smmu_atc_inv_master(master); + arm_smmu_atc_inv_master(master, IOMMU_NO_PASID); if (pci_enable_ats(pdev, stu)) dev_err(master->dev, "Failed to enable ATS (STU %zu)\n", stu); } @@ -2498,14 +2499,14 @@ arm_smmu_find_master_domain(struct arm_smmu_domain *smmu_domain, } static void arm_smmu_remove_master_domain(struct arm_smmu_master *master, - struct arm_smmu_domain *smmu_domain) + struct arm_smmu_domain *smmu_domain, + ioasid_t ssid) { struct arm_smmu_master_domain *master_domain; unsigned long flags; spin_lock_irqsave(&smmu_domain->devices_lock, flags); - master_domain = arm_smmu_find_master_domain(smmu_domain, master, - IOMMU_NO_PASID); + master_domain = arm_smmu_find_master_domain(smmu_domain, master, ssid); if (master_domain) { list_del(&master_domain->devices_elm); kfree(master_domain); @@ -2526,7 +2527,7 @@ struct attach_state { */ static int arm_smmu_attach_prepare(struct arm_smmu_master *master, struct arm_smmu_domain *smmu_domain, - struct attach_state *state) + ioasid_t ssid, struct attach_state *state) { struct arm_smmu_master_domain *cur_master_domain; struct arm_smmu_master_domain *master_domain; @@ -2543,6 +2544,7 @@ static int arm_smmu_attach_prepare(struct arm_smmu_master *master, if (!master_domain) return -ENOMEM; master_domain->master = master; + master_domain->ssid = ssid; state->want_ats = arm_smmu_ats_supported(master); @@ -2557,8 +2559,8 @@ static int arm_smmu_attach_prepare(struct arm_smmu_master *master, * domain, unrelated to ATS. */ spin_lock_irqsave(&smmu_domain->devices_lock, flags); - cur_master_domain = arm_smmu_find_master_domain(smmu_domain, master, - IOMMU_NO_PASID); + cur_master_domain = + arm_smmu_find_master_domain(smmu_domain, master, ssid); if (cur_master_domain) { kfree(master_domain); state->existing_master_domain = true; @@ -2577,8 +2579,9 @@ static int arm_smmu_attach_prepare(struct arm_smmu_master *master, * smmu_domain->devices list. */ static void arm_smmu_attach_commit(struct arm_smmu_master *master, - struct arm_smmu_domain *smmu_domain, - struct attach_state *state) + struct arm_smmu_domain *old_smmu_domain, + struct arm_smmu_domain *new_smmu_domain, + ioasid_t ssid, struct attach_state *state) { lockdep_assert_held(&arm_smmu_asid_lock); @@ -2593,7 +2596,7 @@ static void arm_smmu_attach_commit(struct arm_smmu_master *master, * SMMU is translating for the new domain and both the old&new * domain will issue invalidations. */ - arm_smmu_atc_inv_master(master); + arm_smmu_atc_inv_master(master, ssid); } if (!state->existing_master_domain) { @@ -2601,7 +2604,8 @@ static void arm_smmu_attach_commit(struct arm_smmu_master *master, iommu_get_domain_for_dev(master->dev)); if (old_smmu_domain) - arm_smmu_remove_master_domain(master, old_smmu_domain); + arm_smmu_remove_master_domain(master, old_smmu_domain, + ssid); } } @@ -2609,26 +2613,27 @@ static void arm_smmu_attach_commit(struct arm_smmu_master *master, * When an arm_smmu_master_domain is removed we have to turn off ATS as there is * no longer any tracking of invalidations. */ -static void arm_smmu_attach_remove(struct arm_smmu_master *master) +static void arm_smmu_attach_remove(struct arm_smmu_master *master, + struct arm_smmu_domain *smmu_domain, + ioasid_t ssid) { - struct arm_smmu_domain *smmu_domain = - to_smmu_domain_safe(iommu_get_domain_for_dev(master->dev)); - if (!smmu_domain) return; - if (master->ats_enabled) { + if (ssid == IOMMU_NO_PASID && master->ats_enabled) { pci_disable_ats(to_pci_dev(master->dev)); /* * Ensure ATS is disabled at the endpoint before we issue the * ATC invalidation via the SMMU. */ wmb(); - arm_smmu_atc_inv_master(master); + arm_smmu_atc_inv_master(master, ssid); } - arm_smmu_remove_master_domain(master, smmu_domain); - master->ats_enabled = false; + arm_smmu_remove_master_domain(master, smmu_domain, ssid); + + if (ssid == IOMMU_NO_PASID) + master->ats_enabled = false; } static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) @@ -2674,7 +2679,8 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) */ mutex_lock(&arm_smmu_asid_lock); - ret = arm_smmu_attach_prepare(master, smmu_domain, &state); + ret = arm_smmu_attach_prepare(master, smmu_domain, IOMMU_NO_PASID, + &state); if (ret) { mutex_unlock(&arm_smmu_asid_lock); return ret; @@ -2700,7 +2706,9 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) break; } - arm_smmu_attach_commit(master, smmu_domain, &state); + arm_smmu_attach_commit( + master, to_smmu_domain_safe(iommu_get_domain_for_dev(dev)), + smmu_domain, IOMMU_NO_PASID, &state); mutex_unlock(&arm_smmu_asid_lock); return 0; } @@ -2750,7 +2758,10 @@ static int arm_smmu_attach_dev_ste(struct device *dev, * the stream (STE.EATS == 0b00), causing F_BAD_ATS_TREQ and * F_TRANSL_FORBIDDEN events (IHI0070Ea 5.2 Stream Table Entry). */ - arm_smmu_attach_remove(master); + arm_smmu_attach_remove( + master, + to_smmu_domain_safe(iommu_get_domain_for_dev(master->dev)), + IOMMU_NO_PASID); arm_smmu_install_ste_for_dev(master, ste); mutex_unlock(&arm_smmu_asid_lock); From patchwork Wed Oct 11 23:25:54 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418068 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id D5FBDCDB465 for ; Wed, 11 Oct 2023 23:27:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=uv6B5AhsB1/YgfXRuyGSjVqcibtD78lIXc77VFp8838=; b=2bCMRKZyYF4yur XNe9XfQyRD3Dxeio/5uUhJjthB6rrC6o0dm+cRFYHOIAj04u8tc9vp21RyWvbaCdnx5nNSTIwD5pr vztC1BcTbIoQ+yihtECXb464TtRdpcl9dVYCHXbTkJIOPEqwH+4CSIHVriJuEoYLkLutMjyg4hYBm BVXdnpzIcEP2yNlasbhnpM57C/S0hw54bGD2AhIvneJGOyjhAT1wZCtaGT9N0WcDXyCJv92DL3ALB hwHaJosdTU5Qc2hkKbQ3eTOMbD4S3EVgtZetlNAanN0OLwWAxWR6J3ojUMZ4tiXTqhk4D+hHRhu02 swtBrqpyo7Mt9NpskV9A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqibT-00Gw2E-06; Wed, 11 Oct 2023 23:26:59 +0000 Received: from mail-dm6nam10on20621.outbound.protection.outlook.com ([2a01:111:f400:7e88::621] helo=NAM10-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqiay-00GvVq-2X for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:32 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=COf+U5XML6kjs3EPNkiXbvEAzJGN9irj7u50ryDzPHdJOVYTFWirFxJxDbA17FqpQ+adgiQHXJ5mlCYtUOGkDe7jPFAttMRNyLUthFds+3aff8uIwc00jbD00m+g+BVrIJ+bpXfBknYwYg462E2SX9YUtfB5Duh39HD+jmed/ip/c0F/Z82mZEX8DQukmzwOUVNTB2ONJaOA/uA+oinhpMqP7HtUdvMmkwNmGJ9FVeUX5YdRFozYcWpsl5QHY52yOuJi3xWD/C2XeApb9gl5DrBDgvMnBjK9m2fS6GCcfPKqFjGbtFz01Ful6XtGWHYBjCIjgqae8181zf5Cw+Yy4g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=EOBDTfeTV3Tj5j4XQAd5rTMvjK2UZWqaahLTGofq4k4=; b=MMaMVQdfgcBrlr7oAdw656IKMIZsUPlrO2PXowt5V7CAeNjkcJb4b3rAWNMPG2ns8hKeD6+vjhT0K6y/IMsx6oa/BdI9Gt43uUc0wRT/XwYnCQV1t6BoVUQkrhqPjOXtfJAnwJUY6z8wyV/28ixJ8Kr3R1WXSMNnoWYrMqOHlmZbNk9sEZit2fFLFXT2FhK7Elo6gg9vHZRxa4wJ8Wztf3G3FatkIbj7uXgqMcd+eN1on8TfQRZFrOaTlNve7BcmosW9oCV7UIcyWCRYbODClvceL2chGSdQdSocLKEeF8JxEPu6RdVuAw6kkYd1SVESKeyc+dQMtXoTl3mOeSiQnQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=EOBDTfeTV3Tj5j4XQAd5rTMvjK2UZWqaahLTGofq4k4=; b=QW9Go6qsIi4fiJyaUdDO4NDSd3Da0iUoD0og5j4ilSX1AZopSltD0g3ttQ4Pufwhbu3RCFH0cC9Jyzfiko3PI759Fg+VKrlVnWn1h2Pr17sDzE+QzPD0rLhhubkPydoUQCc0+sHQ6vEWa+/Zng9YnDXUuBt7U2FXAbsUFb02yTXZQXzKg00ClEBwKJCh3SwUrmnUkBEZKTmx3F10/15iB4sLeChIRqUwidsoPyYyMB8NOgf7hoCJOtBW6+Up7C1QP7JpV2aWRqNO0jtChh0XDiSUDunZqHt2IzmnEjBv/5vXzfGFRHz+qtDe+wJJdRH6qHOhVd5W4a57ZJkX4R+MOg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by CH0PR12MB8488.namprd12.prod.outlook.com (2603:10b6:610:18d::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.38; Wed, 11 Oct 2023 23:26:11 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:10 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 18/27] iommu/arm-smmu-v3: Make SVA allocate a normal arm_smmu_domain Date: Wed, 11 Oct 2023 20:25:54 -0300 Message-ID: <18-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: BL1PR13CA0030.namprd13.prod.outlook.com (2603:10b6:208:256::35) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|CH0PR12MB8488:EE_ X-MS-Office365-Filtering-Correlation-Id: cf162110-35ac-43a3-b2e3-08dbcab170a1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: XDLV8BdtPADh/hGkqU+QFtd74ef13MmPdz9eqCJJxM583Vv/FC+htTgH6kqSJnleNOjfznFH0stOXTjXA4+Wfmgi9UUWJQloVLXgrtyvF97Yc0EEcs6FsUHOz1C4HEZ4CSorg5Grun3hQYF4ij9s5qUOKwQlVAmWOvmgsPl2iPWcgu0e7gvZH+aXK2AvZEca53DKRn6U93go8SrkQfJ8AVK2vMzZMtwfUqq4o22ugnIOxKZ3djPjx0b8W6Wd+H9OFVbf/jNL+1ielSxbn18fzez528KwAeqanllinhmWugSnxwOMPxOaC8uv4WMzuB0EIZ1cZlTyBSA4PUWKxydjczu59Rp33LUJKQL4OlGR6K4V2z4a8ERkR57UR5tLAkuqSgSYbV2I5qk2rjC/kD9X6QiKiYw+TwZZgQQwvdAOnf7vfQQ1egSHZQhlJKhxmyLGpshJEMrqXDuT4RyHkOvp/jw1CVrkqkc53/ZCOUls1FgI+Oj/TwKR8D5JvyzXrrNCDp7ZKJ2DXCtMoLFQtLlTMPuFpHi1MMPBYTMnC1yJLl4= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(366004)(396003)(39860400002)(376002)(346002)(136003)(230922051799003)(1800799009)(451199024)(64100799003)(186009)(66476007)(66556008)(8936002)(66946007)(316002)(54906003)(110136005)(2906002)(5660300002)(41300700001)(8676002)(4326008)(6486002)(38100700002)(2616005)(6666004)(107886003)(36756003)(26005)(6512007)(83380400001)(478600001)(86362001)(6506007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 5rKCRGDp2d/QAo7ZR94ND7EPf4LGtG9g5Lp0WGBrrhnQForzvW+V6YPnK7EM+x+8cegfMKqRnfsMvGDcNP8Bk2nlnWY4o8+8F834eS/PA8WUgT5+MSpNpAl3mtmdbjEdN8oFJSlXH98psdff83hZmmlYTWiYAf0CGwvICyouAIjzVK8dmy08QBkj3WBx8OI74pO0GjqhDyjgcs/7fuksHCV4dgYn6R9QuaUJrdU3lgz37e3E7Qcut3iaXD3+FttL2ZeS0IX1sZiD6uuYaR9pPRA5BAOdwmggbRd9k+32gtzV2C3SaAFZ6h2IclmWiC91lLz5eE5cLUi+AsWuDPOFuDYn6EFQXJIC/04cHRKCzPdSZ/uST9W2sIuQc9x1LJwasELgjDxeVyGcH0X53rCYSuH1d/p/5ervOFxD8HR65StJaI92lyqPe6BIfcycjkEFc3ZqrV85kP3p0bG2y30XIVWOmJrbny/37kt60G1NUbsnuw7GPcGcVRm/B66WwvDGV7QgRp166Wq37AQV8eXmoTMSmtmJxRpG7iIxDLsbR9tzAYwmxm9zMBuhO6JfautiqjPYdpNBjRegpHAveqsBGodGP3EZ3zsnpW5ZX5fH2kwrtkpH8SQXYaSGWlaWdyUw4pUmQnktRT1/+DBZC7uwySmBK8ALLJHPcASS871Kgicp7In1kzZUR3YcjaO8BMjyjDxIuTD8YVbZx+ZjhCGq5aYp5/xznqRS5EwazHb0erCLdX76cGuSRRvXjHA3URlPE+CrXrQ4VnZnUH2M1JmPZAmI/eVBAq6HQDl3wb+yU/Sll2GEpVtCsvi3LmtvaRdQEaY0lk1ECE5P7xFleZW3p9qkzCWMfLnf3b6I8zO+XMutNDZuZkKsYLIARxcWelQpOmEnCusY3s5HjGhasM8tVKp1AonGns671zrf+3pk3iZ2Or5QlzE+zMvsjDfvtIRbfu9AkLOd21lJtYXSAmVTHvjmkyupgN98/GH7BYEcRZnYO9whzTabtMkcIFRdI12jwaGeD9hZOcoHbyaoXD+yQljTPHLYpkYOw54J+zPG5CVVrfoZHnCKJBLtTlnCKFSoWatxltbaIOZVhckSBam1dWiAP4he4/9KXMdtcwbCZm2nw48eaXS7xU6Jynbzb3aqamRRo2DhlxrTuocwrK5sdmJ61GYDak5YgSeUznDPyEuGq3TI+vO8AAOxkWMk9yvebemguEJDYedHTa3AUbzeFsXd8ZdNLlX/jK9TrO/sA3s1iaEnnCoHJpKSZgEXXdoJWyPHBaLCgmRrFKXfLi66nyTDGip44gEDIENmj5O6JKyrVumbU47nP282f9j+h0X1cc1kb+yXc9DWGiOiIBvzYWG7Rzn9tA1HgJof+pQOWMY6DPM8JdEmRydgx0WZU+DLHRw7Zr5m9OyEGrdNjDPwWetMSjaXW0LSDdZ47vbfyeHyfM6i0n5Oh+LQZJaeDdb5gHikSHIHaV6Om26RnsO+nZg3I6GHE9kgLKpjCrIWPg5j/5Tg4HcMWnHUcut1ckYiTKswycyB0u4brEvEPgWYL9o2/uK87gsOnuBANJws6KGhR2pFpMuoF/CIIM7U7V3D X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: cf162110-35ac-43a3-b2e3-08dbcab170a1 X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:05.1614 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: b70Wie/mlSaE/kYyKbXLwf44qrRmCQ+u7+A0wpwPfZeMO2l+d4iGPVqrLeXpTQfQ X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR12MB8488 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162628_853111_D63EAC41 X-CRM114-Status: GOOD ( 16.12 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Currently the SVA domain is a naked struct iommu_domain, allocate a struct arm_smmu_domain instead. This is necessary to be able to use the struct arm_master_domain mechanism. Signed-off-by: Jason Gunthorpe --- .../iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 11 +++--- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 34 +++++++++++-------- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 7 ++-- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c index 042daaef0c9703..bc3cc51dffc2e7 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c @@ -669,14 +669,13 @@ static const struct iommu_domain_ops arm_smmu_sva_domain_ops = { .free = arm_smmu_sva_domain_free }; -struct iommu_domain *arm_smmu_sva_domain_alloc(void) +struct iommu_domain *arm_smmu_sva_domain_alloc(unsigned type) { - struct iommu_domain *domain; + struct arm_smmu_domain *smmu_domain; - domain = kzalloc(sizeof(*domain), GFP_KERNEL); - if (!domain) + smmu_domain = arm_smmu_domain_alloc(); + if (!smmu_domain) return NULL; - domain->ops = &arm_smmu_sva_domain_ops; - return domain; + return &smmu_domain->domain; } diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index 43e0c15432073f..08eac534cffd36 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -2204,23 +2204,10 @@ static bool arm_smmu_capable(struct device *dev, enum iommu_cap cap) } } -static struct iommu_domain *arm_smmu_domain_alloc(unsigned type) -{ - - if (type == IOMMU_DOMAIN_SVA) - return arm_smmu_sva_domain_alloc(); - return NULL; -} - -static struct iommu_domain *arm_smmu_domain_alloc_paging(struct device *dev) +struct arm_smmu_domain *arm_smmu_domain_alloc(void) { struct arm_smmu_domain *smmu_domain; - /* - * Allocate the domain and initialise some of its data structures. - * We can't really do anything meaningful until we've added a - * master. - */ smmu_domain = kzalloc(sizeof(*smmu_domain), GFP_KERNEL); if (!smmu_domain) return NULL; @@ -2230,6 +2217,23 @@ static struct iommu_domain *arm_smmu_domain_alloc_paging(struct device *dev) spin_lock_init(&smmu_domain->devices_lock); INIT_LIST_HEAD(&smmu_domain->mmu_notifiers); + return smmu_domain; +} + +static struct iommu_domain *arm_smmu_domain_alloc_paging(struct device *dev) +{ + struct arm_smmu_domain *smmu_domain; + + smmu_domain = arm_smmu_domain_alloc(); + if (!smmu_domain) + return NULL; + + /* + * Allocate the domain and initialise some of its data structures. + * We can't really do anything meaningful until we've added a + * master. + */ + if (dev) { struct arm_smmu_master *master = dev_iommu_priv_get(dev); @@ -3203,7 +3207,7 @@ static struct iommu_ops arm_smmu_ops = { .identity_domain = &arm_smmu_identity_domain, .blocked_domain = &arm_smmu_blocked_domain, .capable = arm_smmu_capable, - .domain_alloc = arm_smmu_domain_alloc, + .domain_alloc = arm_smmu_sva_domain_alloc, .domain_alloc_paging = arm_smmu_domain_alloc_paging, .probe_device = arm_smmu_probe_device, .release_device = arm_smmu_release_device, diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h index ae8b2d8c7192f6..1f6d528d949fff 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h @@ -765,7 +765,8 @@ to_smmu_domain_safe(struct iommu_domain *domain) { if (!domain) return NULL; - if (domain->type & __IOMMU_DOMAIN_PAGING) + if (domain->type & __IOMMU_DOMAIN_PAGING || + domain->type == IOMMU_DOMAIN_SVA) return to_smmu_domain(domain); return NULL; } @@ -773,6 +774,8 @@ to_smmu_domain_safe(struct iommu_domain *domain) extern struct xarray arm_smmu_asid_xa; extern struct mutex arm_smmu_asid_lock; +struct arm_smmu_domain *arm_smmu_domain_alloc(void); + void arm_smmu_clear_cd(struct arm_smmu_master *master, int ssid); struct arm_smmu_cd *arm_smmu_get_cd_ptr(struct arm_smmu_master *master, u32 ssid); @@ -805,7 +808,7 @@ int arm_smmu_master_enable_sva(struct arm_smmu_master *master); int arm_smmu_master_disable_sva(struct arm_smmu_master *master); bool arm_smmu_master_iopf_supported(struct arm_smmu_master *master); void arm_smmu_sva_notifier_synchronize(void); -struct iommu_domain *arm_smmu_sva_domain_alloc(void); +struct iommu_domain *arm_smmu_sva_domain_alloc(unsigned int type); void arm_smmu_sva_remove_dev_pasid(struct iommu_domain *domain, struct device *dev, ioasid_t id); #else /* CONFIG_ARM_SMMU_V3_SVA */ From patchwork Wed Oct 11 23:25:55 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418072 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id ADA89CDB465 for ; Wed, 11 Oct 2023 23:28:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=N3nr2/jpVAfvgq28seT5SjyoiHi964oYsQTF38mVyv8=; b=YeRflU/Iq+JRTu OjhKJu1tvcNMx0NeVH+hfGer+ef3kO2rSw2g+wCP1BI4PUS5sQ2DJlBwXJWK8gKYN3oErmZxSNrSD xeLyZEWO7N2W0C1wxr3PTvfcvT3lXg94D+aWIAcXBSwuiuShEoSYiv1PMy2AJUA0w6NOJtTCRLyeS Wp5fNVOsh6uJ0fsEEGHOMDjuRLBTsSd6SIeQe7oG3ZjN5Xz3tKNPWH76gtIuCUAbLVgP5X2l/H37/ Aj+J/HBcdFwhXmPqWWd5Ryye4lDoErKSWAbd1QxKMbxF095kroVJH7C0myWnZ3+03qud53234jx53 M+uuiylC15HHpbnJ7lmw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqicG-00GwgL-1l; Wed, 11 Oct 2023 23:27:48 +0000 Received: from mail-dm6nam10on20625.outbound.protection.outlook.com ([2a01:111:f400:7e88::625] helo=NAM10-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqib8-00GvP6-2g for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:40 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=k8nTpzw/l7/u+EEH6vK+bn8NwnF+QYCusQyQjzPJEd+88DgIOcVUvtHt2z3Naw5zzKayci1dUDVBo05aBk/1zAK9xLcXOuHAQwn7z7/L/sWjEy6yFHguiTWh3Pym6h3qGEST64qHXdDQ2S4/6l16avx3g8h8U3Ui4guhKgQGxaHe1HB9j2rFw9rQwAdoFdXatfbcFbvDqrdWKzEh0wdX/HZLNv9XhLXHo2H+Se8wdWQLMvshqKKJNGadSle4p1Vl8kLraUD7r+45HMyJ0rVBkO2xATkJgKIQmIyWZbukoPov9kt1GDNNy8EdFEHeOWPNZL4uZfBH/L0IAjg4hAKprQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Nuw1dvdvpjKmN0pGaLmUCOQNM9gnEw2izq/8rixVPCg=; b=GAaxxo6n0BBcz+BReFbntstXtyCaZenZPYzmGFtoOMrIGSqpW5RzZptss5fzF3pFTrti42q0yFywbYMIIq7cewq6mp/SdYE8/0J7RhJh9p7/ehFueFUBvFVB1zy/6RToeHnN9HKEh+/15YPCIeOnEurDRi7Dfej5eOTZ0COdDiHXsbovYNYinS8IVpj41UhIf3gKBfhJrOrhHznAKuFj7EoFeu10wfEvBJPBNjoBKWU1SxgwakjFrZMaCLkLJYnydAk8p7J7rCnXpsyOTeVnsPwyyumMJ5LBHEmURwbHAbxo6UU+Fe4hdpDOJzuhQcAPiQ08vqnJ3++i/FvcDNZ+lA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Nuw1dvdvpjKmN0pGaLmUCOQNM9gnEw2izq/8rixVPCg=; b=IwJVIR2JSPZBH+n9eEQzh1ApvVIEmCyMH4Aiwv5OL6e5MBopfcetC4nFz494XIUyeivpgW+4dAlWrHPQkhdqdfZdS9mRDLgCu5dHX8FTShloY5foCXQXDI9EQ0YJ1SErQgj9Jd+kDCxzi+bpiyz8lKdqaNEkyPlKiqfwomwA3BbbdiZfTVDAlioakKuav3iImN/m315Cnj1eHHyVoSbAEUr7f4UGRJvlct0s97dBUbEXPk27n8R10ABZop2+5G+uKbf44b8z2o3+ZE4yx6JVfiZxinqRbyt1hagRfIbGdN1epaJaj64nhkkms/VFPnoF9MbhJr82LTUm+ZKlsg7CbA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by CH0PR12MB8488.namprd12.prod.outlook.com (2603:10b6:610:18d::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.38; Wed, 11 Oct 2023 23:26:15 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:15 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 19/27] iommu/arm-smmu-v3: Keep track of arm_smmu_master_domain for SVA Date: Wed, 11 Oct 2023 20:25:55 -0300 Message-ID: <19-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: MN2PR20CA0041.namprd20.prod.outlook.com (2603:10b6:208:235::10) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|CH0PR12MB8488:EE_ X-MS-Office365-Filtering-Correlation-Id: 4076ea42-cca6-4ce8-2fdd-08dbcab17127 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 6mWfsUORkMLlhrdlyiF9zd0s2rBYTnaALuuqZ1s25ncWAbAn66PFcCZnvqTjxvKChtXw5uBEQJwvhJSSCofQo4BYnjCyudARdw4Ff405d5A3Uvc/evxN+q50SpvMDi/oVu1/Iu9LjCjtAEkjBYK1INZOdOfPwYL1AUJ90pK3PM4EsXNhZaI5rCmpTk4u0W+u9k2ULD4FxwI8obBytW+t6wv/lHqdYSzZCHpDUQ7+wf/szwSerAtRO+pHYVrNVUqbQls2syMfDFUNsK0aVBgYpnF2+mpvzM7u9rAYHLBJCW54ReSzhSL51GHlkaOcSiu7S1OXXGm1MpmgV2xnusUJ17qg3OzLo+uTTfxaWV/MhrzKy4E74tFcyIZ91gjymdHD3nrwk82FLR8ShrZlWvkcYiazzIADjVlRDSFJp1jaQ6Sy/1OX/BAZstAkrN58BWD0bQrDxNi7nl6xmcltl7gVxdM92t3qfnMEl/rEPOKGjc0OVxXbKidsE12sTrxqlV29aND8qh0iNZ5K96tbxX9nYx2I4IflUaIUUjGveoz5dYJOTuJuZUczpIRiUiuF2Z/L X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(366004)(396003)(39860400002)(376002)(346002)(136003)(230922051799003)(1800799009)(451199024)(64100799003)(186009)(66476007)(66556008)(8936002)(66946007)(316002)(54906003)(110136005)(2906002)(5660300002)(41300700001)(8676002)(4326008)(6486002)(38100700002)(2616005)(6666004)(107886003)(36756003)(26005)(6512007)(83380400001)(478600001)(86362001)(6506007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: g7JT7+apIdNPG3WL93OFdoPZJUS5VDOV7cbVbBcDAwA27HE1SANbqI4K7wdEFRPBSSt9VNplsmZz9eQ4kYh0+B3zUM6xzqDIvrBgxE8WbOkfLdq2pA2ibJ6JTndWg5lcbJ21N4O8wuKXG99eN1hurD105FYxI2fyrXXV/bY/imxOlPF2MB1Fhy1dxyKzWqy8PqNeD0g46l1W4jWiHicb5JhRVKAuu20VjUKsJJy/7NOmT5Q/nbXrbgw4RjDGOs4peC69HReXI9VKT956JjA80wfd8X3KTBhj/fyQyuvE1/KzSJnd6hXiBK6Po4Lcj6BfP+ppPZvDFlONOVlBiK+USbOh+eowo/OP2Fit37Wxf2MXH5Jszo2ma0VgL5nvB0AK/GSF4LKvomMP7XAGBi8EstA7ZQsDOEODR91DJ26+udfLXV3hp1/SxdA02oDCS0r5/mJiqab0Xz2MnFFAge6Vp7UNt0izItojKNn0HBAdHUNcTFUqSKCNH1eI0p0JH+03J7o6XPWI6I+MLy7q+4feRkvCz/Bq1SgFWj4fOckjS5LGOs4CM+s8JJc7HlIZXSijIaaN+UFQykuLSoOyq2EXlWYZukO2o3W5rMLhD2ZLJDqVTi/DXhcIHER5rcJw8jOKgE1RuCmRjr9+r686MxmVjqte3Pi3cjV/rpLX6JpgFDNjYVr5HEZ74D00GnCRFGIpKyWJ5SzOIV2MvxZOIyqap01He5wTl5y7UbG4H46z4/jNfE/Hwsdx241pLd8H5ErUxasyssMJ9V9Lo0IJFXn3/3AxtPRV/WV8vhZa4lgPQi5Ji3yUqfQXxQsdnlseLIBHv62GGGfP42VQrUrKRcxuQdgXMmuSCT66OviDi7uYE/dWKDY6V4BxFHNQD9SYvrJ2jveyw6d4q2Cn4eacT9XSQ66ZXz7lVjqQ+BCHfhwr3xKjxkTIlJzBH3iu4ngftQN+7m9TuTQ3Ky81lJpGpm0TVXx0uR7804fs5Aez8nAqJyMkWNWrUBBR7MQFeRuFpe19e6qdEfY1UWz9/QUd/lC46jDmvkiaqN5BLJzD+AKxd1kilZIatVWxGBSeYD4I7wvCRf3ZCBr3sB3j+ZX5Mpj9Y/l9F3CQY0+21ldUnLAqwY8Qyh5arB9sAt3UBQnLI0b7rF+3GtcL5+24p+0tZMcmU67tIJbG9wWBr8ZU1C1qjT8MqomBMbHk5ovnErl+Xo6AVDyXLkz+or58ZLCwLZS5JV+G/s3sA33Y0fD1aa84hfajkkkN6VuEYCWk/AcecF969BUH63HaihmMpWe2r2jmg5wkjc28Q8hxzjUOCK/TS/z4BjA8qietiidOnlMHXASJ8aghoena4flzkXNqYw2vWl2cZRQnwoPK/r68HSvltpt7UQX5llTE5C0XWMhOIJM6ITjCrpUuKf8sVFbfX/kfLiKhPScY+u79qxaiHsMX2N4xMw+ppBKEyr+TZBfZ0BzIR2TFHVkeqA5ZOsfaiwE5HsyhM463xQv/K/LzPancuZAMQ9K/cYc3axrBhK0gupRbifnb0GhUqlRozFLcablTG3o1Lu+hR/C2rlDImmseVPHsLHpRMfM6DBzhchKyr4Pt X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4076ea42-cca6-4ce8-2fdd-08dbcab17127 X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:06.0215 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: q3ov6dO2aK7QoNgMU4GvdItc3LXnXJ/xSzPlpkFhCBhZrcAQ08xZ++FInet7GBah X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR12MB8488 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162638_911179_BFDC83E7 X-CRM114-Status: UNSURE ( 9.06 ) X-CRM114-Notice: Please train this message. X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Currently the smmu_domain->devices list is unused for SVA domains. Fill it in with the SSID and master of every arm_smmu_set_pasid() using the same logic as the RID attach. Signed-off-by: Jason Gunthorpe --- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index 08eac534cffd36..540666986a0a39 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -2724,6 +2724,8 @@ int arm_smmu_set_pasid(struct arm_smmu_master *master, struct arm_smmu_domain *old_smmu_domain = to_smmu_domain_safe(iommu_get_domain_for_dev(master->dev)); struct arm_smmu_cd *cdptr; + struct attach_state state; + int ret; if (!old_smmu_domain || old_smmu_domain->stage != ARM_SMMU_DOMAIN_S1) return -ENODEV; @@ -2731,14 +2733,32 @@ int arm_smmu_set_pasid(struct arm_smmu_master *master, cdptr = arm_smmu_get_cd_ptr(master, id); if (!cdptr) return -ENOMEM; + + mutex_lock(&arm_smmu_asid_lock); + ret = arm_smmu_attach_prepare(master, smmu_domain, id, &state); + if (ret) + goto out_unlock; + arm_smmu_write_cd_entry(master, id, cdptr, cd); + + arm_smmu_attach_commit( + master, + to_smmu_domain_safe( + iommu_get_domain_for_dev_pasid(master->dev, id, 0)), + smmu_domain, id, &state); + +out_unlock: + mutex_unlock(&arm_smmu_asid_lock); return 0; } void arm_smmu_remove_pasid(struct arm_smmu_master *master, struct arm_smmu_domain *smmu_domain, ioasid_t id) { + mutex_lock(&arm_smmu_asid_lock); + arm_smmu_attach_remove(master, smmu_domain, id); arm_smmu_clear_cd(master, id); + mutex_unlock(&arm_smmu_asid_lock); } static int arm_smmu_attach_dev_ste(struct device *dev, From patchwork Wed Oct 11 23:25:56 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418062 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id E545ECDB482 for ; Wed, 11 Oct 2023 23:27:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=/04XYif0ppP3BzvlA14TmfxzoYxI3/2iz/unngbe3G0=; b=QexkQOoN+6FPqo tfSkaFel3o0vs/sQOcxZc8fkngl6w4a4ciULma5fxoVJ4LwzKbxoQL0puZpnPgyPcyJQXCkUzM7lY hdGAUw44WMOhD49vy5oGvTPJK6+EeX9lDcGoTMsXRCqSo8ds3jAOedEWfWhuhuMmnrLkg0xuuahsV PYKsZ7lVp/UUnHuKRKHdMqXwiGEJnnm2e1MpJZBqOqDccNwMwxfPSkV+icP+anklr7L2mkMS1lR36 1J0SOBSBAbiCpKJxgm/fBin0iN1rAnG5smf1DD3akBBdnr+0ymYeECqJc9b1yvFhSRuZLQxpQsrDD oIY50kFx1W8hJRzzeqBA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqibH-00Gvtx-04; Wed, 11 Oct 2023 23:26:47 +0000 Received: from mail-dm6nam04on20620.outbound.protection.outlook.com ([2a01:111:f400:7e8b::620] helo=NAM04-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqiaq-00GvSY-0M for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:23 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=YvM5nHC+kuoGXvGpgwHQTza+KVRvdMkXhvuAzI6W6SZAqC2Loan+aTDiqbWEBt0F14RGmDFJ1N0Nehd6NEt/UjYPjGI0Mx+T4eqYIWV+UMgdpoTCzzMqSefmDRIU6AaeLyd7XfjgPVedeLprvlMoeuU5LeiuXMae7GHresjVmsgmTqf6BQ/BPGG2Ehrslzd0CajKf/bAQa974mkSpGauSI+q9PC/k+9qWmgVhDDX+oGoGKh/jZFhfzhKwnrvxVw1x1wO1BmxvVbK+pymqLnHsv8HNxl5sUns+ZVSp4fF264BvQyCZ4fqhv1mAIiFHnDFor4Bc4p0XW0SDLfNt13ALg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=LHv7gIR+3eM/0/oDvChRMTjzFnDrzu5BM2X6taenbhk=; b=YwsUGCRWesstH/EEY/ZXcmfxeaa/nORi21Jn0G8zt8waKl/a0rjudwwGjEEn+WUAlB0arAM1bInyhafKQtuAjbxQsDiSUVUwbdt4eqlBjO961vowguMOvVB50gyAJdxEQcDLXo5oB6tyEZsl8DR4lTpVDghooFNLFMkwnbajJxsSdS+Iy1qVd9mHBc4h55aLvzIzxJ418GS3Xgd8FbrWQUV1UA6+r19lDz6rBVy0j7c/SqAHJlRXrCa+KQf3qaoMhUR7Jp+CZ8Ad30M4y4vsJo/b4bc6wUbYair8E8gEg45c6BcDTJZeM7Nw0xklHnV66HMZaWIjX/3kfDtpT7/29A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=LHv7gIR+3eM/0/oDvChRMTjzFnDrzu5BM2X6taenbhk=; b=CuW3sSfxplElktjpE39eSlA/B3L/IdoazUrkT1u87yxTjbqqCcZ+pIRdKkPVLhAERlSNiNRFLlg34lyvndxblr3yBdRf8Nl5QLvKQOpfccgIq+80YhOPLOJIHl/U2tgai96MSYcdyO/iEHulHhgQrmH7m+udifGow1On3hzGKEVBHqbCxlt93ChHdP1NVZTfZm2yUa3o8bPSC5VZ/kC/wF8MnaXq+Q7R8UgrZCo4bDXdOVIymIvV/XW2zHCOyn5sPdgAx+hc8tnnYDspH/qeHvuVQIL03N5s7dUufbVeft6r8rJpqIeRcEvY0FyRhAtMLpgp0paKH9ptYr7/KN2h7g== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by PH7PR12MB7380.namprd12.prod.outlook.com (2603:10b6:510:20f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6838.31; Wed, 11 Oct 2023 23:26:13 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:13 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 20/27] iommu: Add ops->domain_alloc_sva() Date: Wed, 11 Oct 2023 20:25:56 -0300 Message-ID: <20-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: BL1PR13CA0283.namprd13.prod.outlook.com (2603:10b6:208:2bc::18) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|PH7PR12MB7380:EE_ X-MS-Office365-Filtering-Correlation-Id: 3f2a5192-7f9e-4746-5c64-08dbcab170f0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: fdo8gtcn7WGyznN9urtGyvUTWDKyrqdd2qQQ0jKdCqSiwDo9VfGjw9Z/YrPQgTubl+eqhi34smYwH9paTCWo8/oB5D6P78P83C6vUrNcJDpNyJFmGmfegHktxrUc7QjpPwGUb2J0Ei1tUliyYdfsb05KCSCSqMUqMUEdaiuj1JYhZDuO1YHUqiiWHLuv8rv7RztOdO7QELvJ7uL8KKFZz5UKBShW5BzVJADmz5mIMydDV8HbKGX0Pn65dQLZe4JHwJI2COgl7HEcfVaO/ePaAVtnamyvZ60iXCBFeeovGJAQMB/uFd2eOQJh6gw5Bgp2RZqxk9qqg/+Vw1e/xr8Td2zPCMtPlKB1JAPwdAtUhFm2PuzM3TaSiMbm3Fbiho3uJaeCSGdW4ghi0aRgNv9NT7LuvNekMaLzMx8ttsO0CQsl5/cdnn6RQBsZCAT4e5xYNKYQxXG4zZuecT4Mp97AYl095VI59FmC2PTb3DrioNa9OdzRBmL8oJPXcuulbZ4n8/KelBXlzGF3HnOQ7g6LDkecJ23h4BtU6IqWy89F2gj0Wau4FkV+K7V9KoZGYzAC X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(39860400002)(396003)(346002)(376002)(366004)(136003)(230922051799003)(451199024)(64100799003)(1800799009)(186009)(36756003)(6512007)(6506007)(8676002)(2616005)(83380400001)(26005)(107886003)(6486002)(6666004)(478600001)(38100700002)(4326008)(86362001)(41300700001)(66556008)(8936002)(316002)(2906002)(66476007)(110136005)(66946007)(54906003)(5660300002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: lurZOhSHPVrpcoqMG7rUPtbRXnA3oLjixgJzoE2h7gRF/Vhar3F0uKdgFZ4dVpJQrgpK4QZvCd+40NlHWa510Ptmem2E+GNDQ8F15d0bM+LPskFuh6ar1ut0Oqai1BGSFFirJ/BrCxMMvfdd4ngKvH7oRPSaxJTLz/Tr06wByukt4qBrfn2KyaDHzesQx7OYQYwbOmxfERLXQ7PZ16StEbohsytMbGceho6OeF0IquS7rQOz2w3gvthD0QVoU2o+ykSPYslbJZDta3G0VBB/X+oMC8fsOoGYuFFuD9kr6LMdKpyTH4oIwXM73ZPbaMwB6W+ELCEw+uqsqOqr5Fgl6z+ozcCOToy1mL/dQQ19GhrVeWfLGDgFmB1NKtuP7hMgOptlYJNNx4xOAYU4YXeRzMEVVAJBTXMuvoj6SPy6Ml6D1VqtyPqVc2xjQ04+nBAgqSwKiGrKCDIHzOwHQBrVQN0o5sWERWEPJHwIWbQr7NmLxdv8p/8fQfmry/qCv3EVy0C/LRpP5CLLCgeefboklrffI7n5LhAVQ2Add3QpTR7DDlDqZjyxAGMHvIfrH/HJdyF3J+ScbLCX/6r9+24SmFvvyJOWoFj+gNDqXwmSMid2vvDG2/vIJDINc946XmTfXQnwJwcWDdwh/e4bQVUXev3GXA8NIjM7jioxUFhYXIrvWF1vCZ2D5Q+EBfF+TbTE5DKpz7W9nMGdca1WWLqBeCpDaYlx0kRNdVjVwcU3oSboEFQCAA9iKRZfy6Tf9ZpYPDtB6G9LgIMfJsULDjnysP+RXpqjtlHBC6D/zLhtogTiq/iryyG0xvz0P7xT49+58lexKPP+05CjZOd7BkMBJuTce0eoAk3v7npzvrPvA7RpLhRtLBtzWVmg/OJ5qKPtIWaYpeeCGfRO6zjYDcyd5k2rjdrcJMuvCdrZLGly3P6UZiGvNaFu8tvFEhr94OH51lHLGymHYYR7/7SpBzkamDWiZZuGAUs/f8dt9a4jbjZ7QoStmgyn3OCXuGIILq/bun2CeIJt4DQR3WTGFJu9hnvceTWIJiaqHOIokOZIerL6z8dPwsHwKVI+HcJ2VMxZETXTNZo1lOYVav0Ls+jiVjqcGX3fT+n3+QwWr6OE0t5E8qpKyNT/6V2ioXepewxz5+3lIPu2sfm8E8lzXV6i0q5T2HmspPYgo210ag5LtuQkBK71jm+q97Hl4nh8SjVkwNF0ThjkolOyry4cg+QVpajaajAQtLKFnDZoVwfhreE1KmSBhiSWaTPSp5KSZvDCBpE9awRTiBE9Etu3gI1ec19yWaO7cs5c6/KuOY3lJZ9fguoZ+b1BARDL+hMHTOv5dCi3kLvDpn+/r2XCMZP/WLjcr+Yi+P7aJZharYfibHUaTMTSegpNmyW+YeSA6IUiz2Xapjq6sBG5YqGfm8Mbn3mLUZaKLx0KJ9NUEOMjg/u5qAAr41VGkfITcO/0k+UCysqwjek4iBKxgUXK2EQyiP8dj06CvS/UO7oZarbHzix8UEBpQ+oLVeJ+H3zsVzsBvwWLf5wBKe4DPIpc1UIFirRh7AvCMdoBFdRAZW5Qw1o5DhlhBZiHcPTzwndFsFT6 X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 3f2a5192-7f9e-4746-5c64-08dbcab170f0 X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:05.6729 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: tY9a1VFzprEgNHjw+Sg9uhmdlcQybqvPjBhpqNDgfld6pA9EBQgrApTCoP6u1nbo X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB7380 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162620_187547_8F1E918B X-CRM114-Status: GOOD ( 20.54 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Make a new op that receives the device and the mm_struct that the SVA domain should be created for. Unlike domain_alloc_paging() the dev argument is never NULL here. This allows drivers to fully initialize the SVA domain and allocate the mmu_notifier during allocation. It allows the notifier lifetime to follow the lifetime of the iommu_domain. Since we have only one call site, upgrade the new op to return ERR_PTR instead of NULL. Change SMMUv3 to use the new op. Signed-off-by: Jason Gunthorpe --- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 13 ++++++++++--- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 2 +- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 6 +++++- drivers/iommu/iommu-sva.c | 4 ++-- drivers/iommu/iommu.c | 12 +++++++++--- include/linux/iommu.h | 3 +++ 6 files changed, 30 insertions(+), 10 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c index bc3cc51dffc2e7..3a9a83febec6ca 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c @@ -661,7 +661,7 @@ static int arm_smmu_sva_set_dev_pasid(struct iommu_domain *domain, static void arm_smmu_sva_domain_free(struct iommu_domain *domain) { - kfree(domain); + kfree(to_smmu_domain(domain)); } static const struct iommu_domain_ops arm_smmu_sva_domain_ops = { @@ -669,13 +669,20 @@ static const struct iommu_domain_ops arm_smmu_sva_domain_ops = { .free = arm_smmu_sva_domain_free }; -struct iommu_domain *arm_smmu_sva_domain_alloc(unsigned type) +struct iommu_domain *arm_smmu_sva_domain_alloc(struct device *dev, + struct mm_struct *mm) { + struct arm_smmu_master *master = dev_iommu_priv_get(dev); + struct arm_smmu_device *smmu = master->smmu; struct arm_smmu_domain *smmu_domain; smmu_domain = arm_smmu_domain_alloc(); if (!smmu_domain) - return NULL; + return ERR_PTR(-ENOMEM); + + smmu_domain->domain.type = IOMMU_DOMAIN_SVA; + smmu_domain->domain.ops = &arm_smmu_sva_domain_ops; + smmu_domain->smmu = smmu; return &smmu_domain->domain; } diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index 540666986a0a39..a249421a83a4fd 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -3227,8 +3227,8 @@ static struct iommu_ops arm_smmu_ops = { .identity_domain = &arm_smmu_identity_domain, .blocked_domain = &arm_smmu_blocked_domain, .capable = arm_smmu_capable, - .domain_alloc = arm_smmu_sva_domain_alloc, .domain_alloc_paging = arm_smmu_domain_alloc_paging, + .domain_alloc_sva = arm_smmu_sva_domain_alloc, .probe_device = arm_smmu_probe_device, .release_device = arm_smmu_release_device, .device_group = arm_smmu_device_group, diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h index 1f6d528d949fff..4d23aec227d492 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h @@ -808,7 +808,8 @@ int arm_smmu_master_enable_sva(struct arm_smmu_master *master); int arm_smmu_master_disable_sva(struct arm_smmu_master *master); bool arm_smmu_master_iopf_supported(struct arm_smmu_master *master); void arm_smmu_sva_notifier_synchronize(void); -struct iommu_domain *arm_smmu_sva_domain_alloc(unsigned int type); +struct iommu_domain *arm_smmu_sva_domain_alloc(struct device *dev, + struct mm_struct *mm); void arm_smmu_sva_remove_dev_pasid(struct iommu_domain *domain, struct device *dev, ioasid_t id); #else /* CONFIG_ARM_SMMU_V3_SVA */ @@ -854,5 +855,8 @@ static inline void arm_smmu_sva_remove_dev_pasid(struct iommu_domain *domain, ioasid_t id) { } + +#define arm_smmu_sva_domain_alloc NULL + #endif /* CONFIG_ARM_SMMU_V3_SVA */ #endif /* _ARM_SMMU_V3_H */ diff --git a/drivers/iommu/iommu-sva.c b/drivers/iommu/iommu-sva.c index b78671a8a9143f..a52b206793b420 100644 --- a/drivers/iommu/iommu-sva.c +++ b/drivers/iommu/iommu-sva.c @@ -87,8 +87,8 @@ struct iommu_sva *iommu_sva_bind_device(struct device *dev, struct mm_struct *mm /* Allocate a new domain and set it on device pasid. */ domain = iommu_sva_domain_alloc(dev, mm); - if (!domain) { - ret = -ENOMEM; + if (IS_ERR(domain)) { + ret = PTR_ERR(domain); goto out_unlock; } diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 89db35e2c21771..a048f30ca7c260 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -3536,9 +3536,15 @@ struct iommu_domain *iommu_sva_domain_alloc(struct device *dev, const struct iommu_ops *ops = dev_iommu_ops(dev); struct iommu_domain *domain; - domain = ops->domain_alloc(IOMMU_DOMAIN_SVA); - if (!domain) - return NULL; + if (ops->domain_alloc_sva) { + domain = ops->domain_alloc_sva(dev, mm); + if (IS_ERR(domain)) + return domain; + } else { + domain = ops->domain_alloc(IOMMU_DOMAIN_SVA); + if (!domain) + return ERR_PTR(-ENOMEM); + } domain->type = IOMMU_DOMAIN_SVA; mmgrab(mm); diff --git a/include/linux/iommu.h b/include/linux/iommu.h index e1a4c2c2c34d42..6cfe863aa72925 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -241,6 +241,7 @@ struct iommu_iotlb_gather { * @domain_alloc: allocate iommu domain * @domain_alloc_paging: Allocate an iommu_domain that can be used for * UNMANAGED, DMA, and DMA_FQ domain types. + * @domain_alloc_sva: Allocate an iommu_domain for Shared Virtual Addressing. * @probe_device: Add device to iommu driver handling * @release_device: Remove device from iommu driver handling * @probe_finalize: Do final setup work after the device is added to an IOMMU @@ -278,6 +279,8 @@ struct iommu_ops { /* Domain allocation and freeing by the iommu driver */ struct iommu_domain *(*domain_alloc)(unsigned iommu_domain_type); struct iommu_domain *(*domain_alloc_paging)(struct device *dev); + struct iommu_domain *(*domain_alloc_sva)(struct device *dev, + struct mm_struct *mm); struct iommu_device *(*probe_device)(struct device *dev); void (*release_device)(struct device *dev); From patchwork Wed Oct 11 23:25:57 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418061 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 41E75CDB465 for ; Wed, 11 Oct 2023 23:27:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=u2jLoUJkvMNo/Flp0uby6iz4E6qJByh0RFBGhQtbSks=; b=2f3SUHE2JOL3Z0 9I2b7FdyNhu7YTgwitZ/vPhIFifZfgT+w+rxKIYUHEBeTyBp0okQr7I30ad7axc5+nJbuR0d8U8ea KgjIES8Z/PAKKD0AMDXenbnhD7m9XOaszLP+xIda/K5Jn2fsCZ/OC0K6+BYf3G4VjRdWQEE9mo9F3 OGGjHYn9ijU/nKiKN8LzvnAfPDc2PV/yl741ONrpnRh1od4Vcu1hmu22qU76tvb72E21E/sX6ch9g j5dF3wHl9w09bfXNBNOSDCF9AYvxJ6SJnJFQvlvho7avH2FVLCTEMmcZgBJe5jiD9nH9qIMrZvLEN 9yKaV/kuoSeSwNmRD1vQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqibE-00Gvrz-06; Wed, 11 Oct 2023 23:26:44 +0000 Received: from mail-dm6nam10on20625.outbound.protection.outlook.com ([2a01:111:f400:7e88::625] helo=NAM10-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqiam-00GvP6-0H for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:20 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=hOLEvb1PczrBZcQzSl+iOBXSAoEZ7y6vUBwPhJW8hQS1uUQrjhF7fDVuwkxHQ6aanuJl0c1udota+CzS6FEtwpR79akQMwASBMW51u7WRJ6bESTwhKu7CK9uWfiloGHPT05EHoLEWkclFMB3q+6YhKjm35yVIStlDiC7fGcAD0KFUnpik189MALBjzb5L1tqShykrRpnIVOjr5UzBdkXH27wUnuNI2qSFSkr+H5h/0jdHvVh0r8Pv1XkEDDck5zdobPrZifBR4v5JWiurvcWTS1s/qCIWWOunC4nIG37ZHrjyI8DhtU2qD8zocFVFIoJ7jVqGF4GWUFK3EQgEMxIhQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=P+TVOKGiQ+s79E90qh4SP4FhIZjaIa5DZpXAqFg+F+4=; b=n74rLUWf0MKC7b36Y3WRqn7yM2teSZChcK/bbg7PJ1W/VmvBUP7ObvLXAx1wskVEj2V15i3XCy8kSQ2fccQk6tkANBZdUHiJDK/M4ZBST9BnHfmGQnYGac1s9W76svHJaO+wwt9rmcurW8to4YQcNPu217icWu41GbDq4jffctBD1PR7Z2HMpjyuMM3qkVuOwsDLCsgjq8fSXYtljxnDBvusNxxeS9C1i8A6yMdqlpFFUUz2Eh8k8H5rFfy9fd8xZVauYDN6la/ldBf9iFjDOJBoWU9Uqbjy9Uey6xay5A1Bj/hiBZ9IagZkeIbuIfAf/txYiX0i6Ifa3U3jJkJJjw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=P+TVOKGiQ+s79E90qh4SP4FhIZjaIa5DZpXAqFg+F+4=; b=Qy6yI4oWOwlrEG4QxASILhwckXcAPDnlVfGWlkfljHYefdSiHK/RSKSnoPoljgwXTfbNuT8Quz+fQBYK3nVicu0Z/og69OVWgeFdWHtpZpDQAuj9cIEAsR8L/15zBKQslVd/peOSmHVBGvZF1CCXOxZ2G7LDH6vM8UWmrG13vhtcXp4rTdkE/xNHzPd5qg2D0kXQRVz7v8pp82fWSszVT14Zfj+KGAiTXKppFp7bbgzKemaMd4FmV5YVwVbO5Xe1y7Ee24slZUZIRketDqYrG82Hm0JSgp6UEhYxpTHY5FatPuAwcReOpCdtc5SNXdaOB5yqa9KmeRZoEvqwDatIsA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by CH0PR12MB8488.namprd12.prod.outlook.com (2603:10b6:610:18d::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.38; Wed, 11 Oct 2023 23:26:08 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:08 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 21/27] iommu/arm-smmu-v3: Put the SVA mmu notifier in the smmu_domain Date: Wed, 11 Oct 2023 20:25:57 -0300 Message-ID: <21-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: MN2PR03CA0016.namprd03.prod.outlook.com (2603:10b6:208:23a::21) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|CH0PR12MB8488:EE_ X-MS-Office365-Filtering-Correlation-Id: 911ca85e-1d21-4922-e220-08dbcab1704b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: HuOU7bdg5lu2YKRhjttFyLVusCoKCHr4Hi9kBZiNOwHIlHUbN179Vyb2C9/8VyYNeyQcRgQaHq+5aQlKZzc+0pLmAs2RPHV6vZ149iTqYvDmk4/s22KIEmBASzp7msVJznO13pfquIU1LCgsiaKhNww/CqSgSjI1kRxb9WaFSVPFikXyvm0OVG7zbN+Ib711OX+rrXSBg3iEstGUCxuw9S2s10fMecukQHSeg7Q/yCtN68z0m2bUVgHBi22+Vtr96Vfs/3YSsxjX94bw94vqsvdNRXlEwq5hcLYeVJCvV9qTFANTTTXtRqXGThIDOF/URDNJaaanK8hMnnezpUM2Lz+rWDpCh3K7ZsvNUnLQIr2S97w8GUYzj2nG4aeggimarpJUCPpZu8VsjGeRTxvef8pOW1tofd/0E02QbaEXs+0zprtTB74PyK65K0Qbwdpm+tnn0Qo46jRV3SCJRoVdvWpDKhlZ02oX9nhouE953iZa0WBNXWYFZdciQgd+0Ibn3sooBXASd2fj2X+tr48FQXapTfeAU8CUIRp3aiK+DKpCAghYmHWtU56RtAly/2j5 X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(366004)(396003)(39860400002)(376002)(346002)(136003)(230922051799003)(1800799009)(451199024)(64100799003)(186009)(66476007)(66556008)(8936002)(66946007)(316002)(54906003)(110136005)(2906002)(5660300002)(41300700001)(8676002)(4326008)(6486002)(38100700002)(2616005)(6666004)(107886003)(36756003)(26005)(6512007)(30864003)(83380400001)(478600001)(86362001)(6506007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: mKi7i2DiNjAcP6egvcDqMiSX3xOH+Z2lx9L2U1EfAgjAw23LQfqy3SYU836ukokOPPvMKv/8fyDVGGD0WeVi835Elf+SE6elRcGM3a5fDFxBOUaPrFZnYYR5QO6w71D/vwxXwwxPekYcyGgKKT8OCffM9k8LOG/nCWogAY714/09jvezCsRPekigiXIfOferbrJbmoLAULNIBYvc7xYAaKDtJAbXDgHWB0YJdMneH5DAVhF2pe6GLkLRqMUoJREx6pAB0vGekqJJBYTcTrpPg+NHlTTLKIRMWz5wXlF7iyGTgppTfyKvEfwT5zGrba/u3OQVFPDcvmlp9du4uEM6q8aIVybx8Ropf8lM6Pvp6ZoxBMxtkuAMboUHC9PKdb8qNLOxgNohUgZ0Pb0vSTY02N38O8YeXrFjbZrpaLYQkzE11oJrRRGTUpI/+/Kcq/5Q1GKefuCEDeb3OfgWkquQjIOzx9+CWBQYOa2YMW6iTMFaCdCWHs8H8j3wpQHSq+Eg96qlggidvc9iGUdpOCCoUIqknHfGEdlZ8AeiVjw0MalLtRPudAgDbi3c6wY6+anmbS1u0WMwyruJLDTztfuRfuSQAjiT4Ehk2gxrxy6xu82Unb2TjDSB2TLT1Wh8hhVoDmbp6cneBchx35u5LeWP1etfVIuuviN2TjGEdjq1N9k+6HQNuZs7uciUEZV0SkdmVPCqEYdmK3foYVxRNkLSHQB8o3EhdqxqqBzw6BlY1YwGuFGszMhDtD1cRTmqECRY7H8pUh2rs/2Qx4gcUYfGBTHBL8oRY+/7E1IF2uDAqD9EPILMrKQ2LedOJMUiQW1ljs5tD0mkRkVWLXDH2LOdm7nEqLtm6Ly7p2ax9qv/784Gf/sOVBWXmuuSyh8rFBkyGxHNP89lgnUHkFjTheq2/HwE0I5JdB/K/zDRpklJs+1R7HmDaCsTdkTWuP2bs6+a3iFtzq1qGjaLppG86avUsI5FdGQt5DykuPXMooiQmTu2a7jzgY3zdb0wW269tOCPuOyzaQql7tNw3/tOdgtxyE6mKiIzfKf6utYUI/HJCVeitqPGvFYwa0PTQQl91VjYmCKQ5KVOSMB3hgVS/r4hwoHHTnqZaoI3vvf5ZNx4RU+/IMv+G0DVTVZWAWxJqKIwao+lK6omTj4tezTCw1KXIauh8nbm/anKRjw/3ujdHf6Y+XC4DQ0+o9Rxgxx+oSUcxR92glv/J5xljN0Ab/NzGUjlavoToDaauWB7gelSJ7H2veNi7eVkJRDEcAIaf84UbX5jhs+OKkAzqokbWYQSFi1OWKB4wUCIp/zkfmmQpG11sfXOaQ3NHXZ6b1RE5DT1uaLXnbTaEMZ4HEAPLqjpidLpADjMfdxhHJdsCG8RLHhLJX736+irx/qToVYo3SzL/GBd7IRTdnccKrev5ycAHM3R2Bgo1WGOu2Mj09KScVx8rIJKR0SIWS/oOSmU+5OTS5+3B0JPXwPg9UScjrx38Eaqu+nLj+95AL7O1nCxV0JFkvzyI+ie3PIzpZhP3VvLaF2G17zQTmTnPOo3FXOAhxTpkhU62pYEJji2GZhyTkhPK2pxB18e0XBb6dg9+O9J X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 911ca85e-1d21-4922-e220-08dbcab1704b X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:04.6909 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: zqxtICC+qt2D8jCsTwzjaJApiK6ghjCFXBmA5jWXY6lgMWwSuHVMCG8I1Ai1X1jb X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR12MB8488 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162616_223940_3AB5DAA4 X-CRM114-Status: GOOD ( 20.86 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org This removes all the notifier de-duplication logic in the driver and relies on the core code to de-duplicate and allocate only one SVA domain per mm per smmu instance. This naturally gives a 1:1 relationship between SVA domain and mmu notifier. Remove all of the previous mmu_notifier, bond, shared cd, and cd refcount logic entirely. For the purpose of organizing patches lightly remove BTM support. The next patches will add it back in. BTM is a performance optimization so this is bisection friendly functionally invisible change. The bond/shared_cd/btm/asid allocator are tightly wound together and changing them all at once would make this patch too big. The core issue is that having a single SVA domain per-smmu instance conflicts with the design of having a global ASID table that BTM currently needs, as we would end up having to assign multiple SVA domains to the same ASID. Signed-off-by: Jason Gunthorpe --- .../iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 407 ++++-------------- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 82 +--- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 14 +- 3 files changed, 101 insertions(+), 402 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c index 3a9a83febec6ca..a3b85aa5e48ce6 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c @@ -13,31 +13,9 @@ #include "../../iommu-sva.h" #include "../../io-pgtable-arm.h" -struct arm_smmu_mmu_notifier { - struct mmu_notifier mn; - struct arm_smmu_ctx_desc *cd; - bool cleared; - refcount_t refs; - struct list_head list; - struct arm_smmu_domain *domain; -}; - -#define mn_to_smmu(mn) container_of(mn, struct arm_smmu_mmu_notifier, mn) - -struct arm_smmu_bond { - struct iommu_sva sva; - struct mm_struct *mm; - struct arm_smmu_mmu_notifier *smmu_mn; - struct list_head list; - refcount_t refs; -}; - -#define sva_to_bond(handle) \ - container_of(handle, struct arm_smmu_bond, sva) - static DEFINE_MUTEX(sva_lock); -static void +static void __maybe_unused arm_smmu_update_s1_domain_cd_entry(struct arm_smmu_domain *smmu_domain) { struct arm_smmu_master_domain *master_domain; @@ -60,58 +38,6 @@ arm_smmu_update_s1_domain_cd_entry(struct arm_smmu_domain *smmu_domain) spin_unlock_irqrestore(&smmu_domain->devices_lock, flags); } -/* - * Check if the CPU ASID is available on the SMMU side. If a private context - * descriptor is using it, try to replace it. - */ -static struct arm_smmu_ctx_desc * -arm_smmu_share_asid(struct mm_struct *mm, u16 asid) -{ - int ret; - u32 new_asid; - struct arm_smmu_ctx_desc *cd; - struct arm_smmu_device *smmu; - struct arm_smmu_domain *smmu_domain; - - cd = xa_load(&arm_smmu_asid_xa, asid); - if (!cd) - return NULL; - - if (cd->mm) { - if (WARN_ON(cd->mm != mm)) - return ERR_PTR(-EINVAL); - /* All devices bound to this mm use the same cd struct. */ - refcount_inc(&cd->refs); - return cd; - } - - smmu_domain = container_of(cd, struct arm_smmu_domain, cd); - smmu = smmu_domain->smmu; - - ret = xa_alloc(&arm_smmu_asid_xa, &new_asid, cd, - XA_LIMIT(1, (1 << smmu->asid_bits) - 1), GFP_KERNEL); - if (ret) - return ERR_PTR(-ENOSPC); - /* - * Race with unmap: TLB invalidations will start targeting the new ASID, - * which isn't assigned yet. We'll do an invalidate-all on the old ASID - * later, so it doesn't matter. - */ - cd->asid = new_asid; - /* - * Update ASID and invalidate CD in all associated masters. There will - * be some overlap between use of both ASIDs, until we invalidate the - * TLB. - */ - arm_smmu_update_s1_domain_cd_entry(smmu_domain); - - /* Invalidate TLB entries previously associated with that context */ - arm_smmu_tlb_inv_asid(smmu, asid); - - xa_erase(&arm_smmu_asid_xa, asid); - return NULL; -} - static u64 page_size_to_cd(void) { static_assert(PAGE_SIZE == SZ_4K || PAGE_SIZE == SZ_16K || @@ -125,7 +51,8 @@ static u64 page_size_to_cd(void) static void arm_smmu_make_sva_cd(struct arm_smmu_cd *target, struct arm_smmu_master *master, - struct mm_struct *mm, u16 asid) + struct mm_struct *mm, u16 asid, + bool btm_invalidation) { u64 par; @@ -146,7 +73,7 @@ static void arm_smmu_make_sva_cd(struct arm_smmu_cd *target, (master->stall_enabled ? CTXDESC_CD_0_S : 0) | CTXDESC_CD_0_R | CTXDESC_CD_0_A | - CTXDESC_CD_0_ASET | + (btm_invalidation ? 0 : CTXDESC_CD_0_ASET) | FIELD_PREP(CTXDESC_CD_0_ASID, asid)); /* @@ -178,69 +105,6 @@ static void arm_smmu_make_sva_cd(struct arm_smmu_cd *target, target->data[3] = cpu_to_le64(read_sysreg(mair_el1)); } -static struct arm_smmu_ctx_desc *arm_smmu_alloc_shared_cd(struct mm_struct *mm) -{ - u16 asid; - int err = 0; - struct arm_smmu_ctx_desc *cd; - struct arm_smmu_ctx_desc *ret = NULL; - - /* Don't free the mm until we release the ASID */ - mmgrab(mm); - - asid = arm64_mm_context_get(mm); - if (!asid) { - err = -ESRCH; - goto out_drop_mm; - } - - cd = kzalloc(sizeof(*cd), GFP_KERNEL); - if (!cd) { - err = -ENOMEM; - goto out_put_context; - } - - refcount_set(&cd->refs, 1); - - mutex_lock(&arm_smmu_asid_lock); - ret = arm_smmu_share_asid(mm, asid); - if (ret) { - mutex_unlock(&arm_smmu_asid_lock); - goto out_free_cd; - } - - err = xa_insert(&arm_smmu_asid_xa, asid, cd, GFP_KERNEL); - mutex_unlock(&arm_smmu_asid_lock); - - if (err) - goto out_free_asid; - - cd->asid = asid; - cd->mm = mm; - - return cd; - -out_free_asid: - arm_smmu_free_asid(cd); -out_free_cd: - kfree(cd); -out_put_context: - arm64_mm_context_put(mm); -out_drop_mm: - mmdrop(mm); - return err < 0 ? ERR_PTR(err) : ret; -} - -static void arm_smmu_free_shared_cd(struct arm_smmu_ctx_desc *cd) -{ - if (arm_smmu_free_asid(cd)) { - /* Unpin ASID */ - arm64_mm_context_put(cd->mm); - mmdrop(cd->mm); - kfree(cd); - } -} - /* * Cloned from the MAX_TLBI_OPS in arch/arm64/include/asm/tlbflush.h, this * is used as a threshold to replace per-page TLBI commands to issue in the @@ -255,8 +119,8 @@ static void arm_smmu_mm_arch_invalidate_secondary_tlbs(struct mmu_notifier *mn, unsigned long start, unsigned long end) { - struct arm_smmu_mmu_notifier *smmu_mn = mn_to_smmu(mn); - struct arm_smmu_domain *smmu_domain = smmu_mn->domain; + struct arm_smmu_domain *smmu_domain = + container_of(mn, struct arm_smmu_domain, mmu_notifier); size_t size; /* @@ -273,33 +137,27 @@ static void arm_smmu_mm_arch_invalidate_secondary_tlbs(struct mmu_notifier *mn, size = 0; } - if (!(smmu_domain->smmu->features & ARM_SMMU_FEAT_BTM)) { + if (smmu_domain->btm_invalidation) { if (!size) arm_smmu_tlb_inv_asid(smmu_domain->smmu, - smmu_mn->cd->asid); + smmu_domain->cd.asid); else arm_smmu_tlb_inv_range_asid(start, size, - smmu_mn->cd->asid, + smmu_domain->cd.asid, PAGE_SIZE, false, smmu_domain); } - arm_smmu_atc_inv_domain_sva(smmu_domain, mm->pasid, start, size); + arm_smmu_atc_inv_domain(smmu_domain, start, size); } static void arm_smmu_mm_release(struct mmu_notifier *mn, struct mm_struct *mm) { - struct arm_smmu_mmu_notifier *smmu_mn = mn_to_smmu(mn); - struct arm_smmu_domain *smmu_domain = smmu_mn->domain; + struct arm_smmu_domain *smmu_domain = + container_of(mn, struct arm_smmu_domain, mmu_notifier); struct arm_smmu_master_domain *master_domain; unsigned long flags; - mutex_lock(&sva_lock); - if (smmu_mn->cleared) { - mutex_unlock(&sva_lock); - return; - } - /* * DMA may still be running. Keep the cd valid to avoid C_BAD_CD events, * but disable translation. @@ -311,24 +169,26 @@ static void arm_smmu_mm_release(struct mmu_notifier *mn, struct mm_struct *mm) struct arm_smmu_cd target; struct arm_smmu_cd *cdptr; - cdptr = arm_smmu_get_cd_ptr(master, mm->pasid); + cdptr = arm_smmu_get_cd_ptr(master, master_domain->ssid); if (WARN_ON(!cdptr)) continue; - arm_smmu_make_sva_cd(&target, master, NULL, smmu_mn->cd->asid); - arm_smmu_write_cd_entry(master, mm->pasid, cdptr, &target); + arm_smmu_make_sva_cd(&target, master, NULL, + smmu_domain->cd.asid, + smmu_domain->btm_invalidation); + arm_smmu_write_cd_entry(master, master_domain->ssid, cdptr, + &target); } spin_unlock_irqrestore(&smmu_domain->devices_lock, flags); - arm_smmu_tlb_inv_asid(smmu_domain->smmu, smmu_mn->cd->asid); - arm_smmu_atc_inv_domain_sva(smmu_domain, mm->pasid, 0, 0); - - smmu_mn->cleared = true; - mutex_unlock(&sva_lock); + arm_smmu_tlb_inv_asid(smmu_domain->smmu, smmu_domain->cd.asid); } static void arm_smmu_mmu_notifier_free(struct mmu_notifier *mn) { - kfree(mn_to_smmu(mn)); + struct arm_smmu_domain *smmu_domain = + container_of(mn, struct arm_smmu_domain, mmu_notifier); + + kfree(smmu_domain); } static const struct mmu_notifier_ops arm_smmu_mmu_notifier_ops = { @@ -337,123 +197,6 @@ static const struct mmu_notifier_ops arm_smmu_mmu_notifier_ops = { .free_notifier = arm_smmu_mmu_notifier_free, }; -/* Allocate or get existing MMU notifier for this {domain, mm} pair */ -static struct arm_smmu_mmu_notifier * -arm_smmu_mmu_notifier_get(struct arm_smmu_domain *smmu_domain, - struct mm_struct *mm) -{ - int ret; - struct arm_smmu_ctx_desc *cd; - struct arm_smmu_mmu_notifier *smmu_mn; - - list_for_each_entry(smmu_mn, &smmu_domain->mmu_notifiers, list) { - if (smmu_mn->mn.mm == mm) { - refcount_inc(&smmu_mn->refs); - return smmu_mn; - } - } - - cd = arm_smmu_alloc_shared_cd(mm); - if (IS_ERR(cd)) - return ERR_CAST(cd); - - smmu_mn = kzalloc(sizeof(*smmu_mn), GFP_KERNEL); - if (!smmu_mn) { - ret = -ENOMEM; - goto err_free_cd; - } - - refcount_set(&smmu_mn->refs, 1); - smmu_mn->cd = cd; - smmu_mn->domain = smmu_domain; - smmu_mn->mn.ops = &arm_smmu_mmu_notifier_ops; - - ret = mmu_notifier_register(&smmu_mn->mn, mm); - if (ret) { - kfree(smmu_mn); - goto err_free_cd; - } - - list_add(&smmu_mn->list, &smmu_domain->mmu_notifiers); - return smmu_mn; - -err_free_cd: - arm_smmu_free_shared_cd(cd); - return ERR_PTR(ret); -} - -static struct arm_smmu_ctx_desc * -arm_smmu_mmu_notifier_put(struct arm_smmu_mmu_notifier *smmu_mn) -{ - struct mm_struct *mm = smmu_mn->mn.mm; - struct arm_smmu_ctx_desc *cd = smmu_mn->cd; - struct arm_smmu_domain *smmu_domain = smmu_mn->domain; - - if (!refcount_dec_and_test(&smmu_mn->refs)) - return cd; - - list_del(&smmu_mn->list); - - /* - * If we went through clear(), we've already invalidated, and no - * new TLB entry can have been formed. - */ - if (!smmu_mn->cleared) { - arm_smmu_tlb_inv_asid(smmu_domain->smmu, cd->asid); - arm_smmu_atc_inv_domain_sva(smmu_domain, mm->pasid, 0, 0); - } - - /* Frees smmu_mn */ - mmu_notifier_put(&smmu_mn->mn); - return cd; -} - -static struct iommu_sva *__arm_smmu_sva_bind(struct device *dev, - struct mm_struct *mm, - struct arm_smmu_cd *target) -{ - int ret; - struct arm_smmu_bond *bond; - struct arm_smmu_master *master = dev_iommu_priv_get(dev); - struct arm_smmu_domain *smmu_domain = - to_smmu_domain_safe(iommu_get_domain_for_dev(dev)); - - if (!smmu_domain || smmu_domain->stage != ARM_SMMU_DOMAIN_S1) - return ERR_PTR(-ENODEV); - - /* If bind() was already called for this {dev, mm} pair, reuse it. */ - list_for_each_entry(bond, &master->bonds, list) { - if (bond->mm == mm) { - refcount_inc(&bond->refs); - arm_smmu_make_sva_cd(target, master, mm, - bond->smmu_mn->cd->asid); - return &bond->sva; - } - } - - bond = kzalloc(sizeof(*bond), GFP_KERNEL); - if (!bond) - return ERR_PTR(-ENOMEM); - - bond->mm = mm; - bond->sva.dev = dev; - refcount_set(&bond->refs, 1); - - bond->smmu_mn = arm_smmu_mmu_notifier_get(smmu_domain, mm); - if (IS_ERR(bond->smmu_mn)) { - ret = PTR_ERR(bond->smmu_mn); - goto err_free_bond; - } - - list_add(&bond->list, &master->bonds); - arm_smmu_make_sva_cd(target, master, mm, bond->smmu_mn->cd->asid); - return &bond->sva; - -err_free_bond: - kfree(bond); - return ERR_PTR(ret); -} - bool arm_smmu_sva_supported(struct arm_smmu_device *smmu) { unsigned long reg, fld; @@ -581,11 +324,6 @@ int arm_smmu_master_enable_sva(struct arm_smmu_master *master) int arm_smmu_master_disable_sva(struct arm_smmu_master *master) { mutex_lock(&sva_lock); - if (!list_empty(&master->bonds)) { - dev_err(master->dev, "cannot disable SVA, device is bound\n"); - mutex_unlock(&sva_lock); - return -EBUSY; - } arm_smmu_master_sva_disable_iopf(master); master->sva_enabled = false; mutex_unlock(&sva_lock); @@ -602,66 +340,54 @@ void arm_smmu_sva_notifier_synchronize(void) mmu_notifier_synchronize(); } -void arm_smmu_sva_remove_dev_pasid(struct iommu_domain *domain, - struct device *dev, ioasid_t id) -{ - struct mm_struct *mm = domain->mm; - struct arm_smmu_bond *bond = NULL, *t; - struct arm_smmu_master *master = dev_iommu_priv_get(dev); - - mutex_lock(&sva_lock); - list_for_each_entry(t, &master->bonds, list) { - if (t->mm == mm) { - bond = t; - break; - } - } - - if (!WARN_ON(!bond) && refcount_dec_and_test(&bond->refs)) { - struct arm_smmu_ctx_desc *cd; - - list_del(&bond->list); - cd = arm_smmu_mmu_notifier_put(bond->smmu_mn); - arm_smmu_remove_pasid(master, to_smmu_domain(domain), id); - arm_smmu_free_shared_cd(cd); - kfree(bond); - } else { - arm_smmu_remove_pasid(master, to_smmu_domain(domain), id); - } - mutex_unlock(&sva_lock); -} - static int arm_smmu_sva_set_dev_pasid(struct iommu_domain *domain, struct device *dev, ioasid_t id) { + struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain); struct arm_smmu_master *master = dev_iommu_priv_get(dev); - int ret = 0; - struct iommu_sva *handle; - struct mm_struct *mm = domain->mm; struct arm_smmu_cd target; + int ret; - if (mm->pasid != id || !master->cd_table.used_sid) + /* Prevent arm_smmu_mm_release from being called while we are attaching */ + if (!mmget_not_zero(domain->mm)) return -EINVAL; - if (!arm_smmu_get_cd_ptr(master, id)) - return -ENOMEM; + /* + * This does not need the arm_smmu_asid_lock because SVA domains never + * get reassigned + */ + arm_smmu_make_sva_cd(&target, master, smmu_domain->domain.mm, + smmu_domain->cd.asid, + smmu_domain->btm_invalidation); - mutex_lock(&sva_lock); - handle = __arm_smmu_sva_bind(dev, mm, &target); - if (IS_ERR(handle)) - ret = PTR_ERR(handle); - mutex_unlock(&sva_lock); - if (ret) - return ret; + ret = arm_smmu_set_pasid(master, to_smmu_domain(domain), id, &target); - /* This cannot fail since we preallocated the cdptr */ - arm_smmu_set_pasid(master, to_smmu_domain(domain), id, &target); - return 0; + mmput(domain->mm); + return ret; } static void arm_smmu_sva_domain_free(struct iommu_domain *domain) { - kfree(to_smmu_domain(domain)); + struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain); + + /* + * Ensure the ASID is empty in the iommu cache before allowing reuse. + */ + arm_smmu_tlb_inv_asid(smmu_domain->smmu, smmu_domain->cd.asid); + + /* + * Notice that the arm_smmu_mm_arch_invalidate_secondary_tlbs op can + * still be called/running at this point. We allow the ASID to be + * reused, and if there is a race then it just suffers harmless + * unnecessary invalidation. + */ + xa_erase(&arm_smmu_asid_xa, smmu_domain->cd.asid); + + /* + * Actual free is defered to the SRCU callback + * arm_smmu_mmu_notifier_free() + */ + mmu_notifier_put(&smmu_domain->mmu_notifier); } static const struct iommu_domain_ops arm_smmu_sva_domain_ops = { @@ -675,6 +401,8 @@ struct iommu_domain *arm_smmu_sva_domain_alloc(struct device *dev, struct arm_smmu_master *master = dev_iommu_priv_get(dev); struct arm_smmu_device *smmu = master->smmu; struct arm_smmu_domain *smmu_domain; + u32 asid; + int ret; smmu_domain = arm_smmu_domain_alloc(); if (!smmu_domain) @@ -684,5 +412,22 @@ struct iommu_domain *arm_smmu_sva_domain_alloc(struct device *dev, smmu_domain->domain.ops = &arm_smmu_sva_domain_ops; smmu_domain->smmu = smmu; + ret = xa_alloc(&arm_smmu_asid_xa, &asid, smmu_domain, + XA_LIMIT(1, (1 << smmu->asid_bits) - 1), GFP_KERNEL); + if (ret) + goto err_free; + + smmu_domain->cd.asid = asid; + smmu_domain->mmu_notifier.ops = &arm_smmu_mmu_notifier_ops; + ret = mmu_notifier_register(&smmu_domain->mmu_notifier, mm); + if (ret) + goto err_asid; + return &smmu_domain->domain; + +err_asid: + xa_erase(&arm_smmu_asid_xa, smmu_domain->cd.asid); +err_free: + kfree(smmu_domain); + return ERR_PTR(ret); } diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index a249421a83a4fd..c8042b037673a0 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -1307,22 +1307,6 @@ static void arm_smmu_free_cd_tables(struct arm_smmu_master *master) cd_table->cdtab = NULL; } -bool arm_smmu_free_asid(struct arm_smmu_ctx_desc *cd) -{ - bool free; - struct arm_smmu_ctx_desc *old_cd; - - if (!cd->asid) - return false; - - free = refcount_dec_and_test(&cd->refs); - if (free) { - old_cd = xa_erase(&arm_smmu_asid_xa, cd->asid); - WARN_ON(old_cd != cd); - } - return free; -} - /* Stream table manipulation functions */ static void arm_smmu_write_strtab_l1_desc(__le64 *dst, struct arm_smmu_strtab_l1_desc *desc) @@ -1955,8 +1939,8 @@ static int arm_smmu_atc_inv_master(struct arm_smmu_master *master, return arm_smmu_cmdq_batch_submit(master->smmu, &cmds); } -static int __arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain, - ioasid_t ssid, unsigned long iova, size_t size) +int arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain, + unsigned long iova, size_t size) { struct arm_smmu_master_domain *master_domain; int i; @@ -1994,15 +1978,7 @@ static int __arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain, if (!master->ats_enabled) continue; - /* - * Non-zero ssid means SVA is co-opting the S1 domain to issue - * invalidations for SVA PASIDs. - */ - if (ssid != IOMMU_NO_PASID) - arm_smmu_atc_inv_to_cmd(ssid, iova, size, &cmd); - else - arm_smmu_atc_inv_to_cmd(master_domain->ssid, iova, size, - &cmd); + arm_smmu_atc_inv_to_cmd(master_domain->ssid, iova, size, &cmd); for (i = 0; i < master->num_streams; i++) { cmd.atc.sid = master->streams[i].id; @@ -2014,19 +1990,6 @@ static int __arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain, return arm_smmu_cmdq_batch_submit(smmu_domain->smmu, &cmds); } -static int arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain, - unsigned long iova, size_t size) -{ - return __arm_smmu_atc_inv_domain(smmu_domain, IOMMU_NO_PASID, iova, - size); -} - -int arm_smmu_atc_inv_domain_sva(struct arm_smmu_domain *smmu_domain, - ioasid_t ssid, unsigned long iova, size_t size) -{ - return __arm_smmu_atc_inv_domain(smmu_domain, ssid, iova, size); -} - /* IO_PGTABLE API */ static void arm_smmu_tlb_inv_context(void *cookie) { @@ -2215,7 +2178,6 @@ struct arm_smmu_domain *arm_smmu_domain_alloc(void) mutex_init(&smmu_domain->init_mutex); INIT_LIST_HEAD(&smmu_domain->devices); spin_lock_init(&smmu_domain->devices_lock); - INIT_LIST_HEAD(&smmu_domain->mmu_notifiers); return smmu_domain; } @@ -2256,7 +2218,7 @@ static void arm_smmu_domain_free(struct iommu_domain *domain) if (smmu_domain->stage == ARM_SMMU_DOMAIN_S1) { /* Prevent SVA from touching the CD while we're freeing it */ mutex_lock(&arm_smmu_asid_lock); - arm_smmu_free_asid(&smmu_domain->cd); + xa_erase(&arm_smmu_asid_xa, smmu_domain->cd.asid); mutex_unlock(&arm_smmu_asid_lock); } else { struct arm_smmu_s2_cfg *cfg = &smmu_domain->s2_cfg; @@ -2274,8 +2236,6 @@ static int arm_smmu_domain_finalise_s1(struct arm_smmu_device *smmu, u32 asid; struct arm_smmu_ctx_desc *cd = &smmu_domain->cd; - refcount_set(&cd->refs, 1); - /* Prevent SVA from modifying the ASID until it is written to the CD */ mutex_lock(&arm_smmu_asid_lock); ret = xa_alloc(&arm_smmu_asid_xa, &asid, cd, @@ -2727,7 +2687,10 @@ int arm_smmu_set_pasid(struct arm_smmu_master *master, struct attach_state state; int ret; - if (!old_smmu_domain || old_smmu_domain->stage != ARM_SMMU_DOMAIN_S1) + if (smmu_domain->smmu != master->smmu) + return -EINVAL; + + if (!old_smmu_domain || !master->cd_table.used_sid) return -ENODEV; cdptr = arm_smmu_get_cd_ptr(master, id); @@ -2752,12 +2715,21 @@ int arm_smmu_set_pasid(struct arm_smmu_master *master, return 0; } -void arm_smmu_remove_pasid(struct arm_smmu_master *master, - struct arm_smmu_domain *smmu_domain, ioasid_t id) +static void arm_smmu_remove_dev_pasid(struct device *dev, ioasid_t pasid) { + struct arm_smmu_master *master = dev_iommu_priv_get(dev); + struct arm_smmu_domain *smmu_domain; + struct iommu_domain *domain; + + domain = iommu_get_domain_for_dev_pasid(dev, pasid, IOMMU_DOMAIN_SVA); + if (WARN_ON(IS_ERR(domain)) || !domain) + return; + + smmu_domain = to_smmu_domain(domain); + mutex_lock(&arm_smmu_asid_lock); - arm_smmu_attach_remove(master, smmu_domain, id); - arm_smmu_clear_cd(master, id); + arm_smmu_attach_remove(master, smmu_domain, pasid); + arm_smmu_clear_cd(master, pasid); mutex_unlock(&arm_smmu_asid_lock); } @@ -3030,7 +3002,6 @@ static struct iommu_device *arm_smmu_probe_device(struct device *dev) master->dev = dev; master->smmu = smmu; - INIT_LIST_HEAD(&master->bonds); dev_iommu_priv_set(dev, master); ret = arm_smmu_insert_master(smmu, master); @@ -3212,17 +3183,6 @@ static int arm_smmu_def_domain_type(struct device *dev) return 0; } -static void arm_smmu_remove_dev_pasid(struct device *dev, ioasid_t pasid) -{ - struct iommu_domain *domain; - - domain = iommu_get_domain_for_dev_pasid(dev, pasid, IOMMU_DOMAIN_SVA); - if (WARN_ON(IS_ERR(domain)) || !domain) - return; - - arm_smmu_sva_remove_dev_pasid(domain, dev, pasid); -} - static struct iommu_ops arm_smmu_ops = { .identity_domain = &arm_smmu_identity_domain, .blocked_domain = &arm_smmu_blocked_domain, diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h index 4d23aec227d492..5f021d6cee0b14 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h @@ -587,9 +587,6 @@ struct arm_smmu_strtab_l1_desc { struct arm_smmu_ctx_desc { u16 asid; - - refcount_t refs; - struct mm_struct *mm; }; struct arm_smmu_l1_ctx_desc { @@ -713,7 +710,6 @@ struct arm_smmu_master { bool stall_enabled; bool sva_enabled; bool iopf_enabled; - struct list_head bonds; unsigned int ssid_bits; }; @@ -742,7 +738,8 @@ struct arm_smmu_domain { struct list_head devices; spinlock_t devices_lock; - struct list_head mmu_notifiers; + struct mmu_notifier mmu_notifier; + bool btm_invalidation; }; struct arm_smmu_master_domain { @@ -796,9 +793,8 @@ void arm_smmu_tlb_inv_asid(struct arm_smmu_device *smmu, u16 asid); void arm_smmu_tlb_inv_range_asid(unsigned long iova, size_t size, int asid, size_t granule, bool leaf, struct arm_smmu_domain *smmu_domain); -bool arm_smmu_free_asid(struct arm_smmu_ctx_desc *cd); -int arm_smmu_atc_inv_domain_sva(struct arm_smmu_domain *smmu_domain, - ioasid_t ssid, unsigned long iova, size_t size); +int arm_smmu_atc_inv_domain(struct arm_smmu_domain *smmu_domain, + unsigned long iova, size_t size); #ifdef CONFIG_ARM_SMMU_V3_SVA bool arm_smmu_sva_supported(struct arm_smmu_device *smmu); @@ -810,8 +806,6 @@ bool arm_smmu_master_iopf_supported(struct arm_smmu_master *master); void arm_smmu_sva_notifier_synchronize(void); struct iommu_domain *arm_smmu_sva_domain_alloc(struct device *dev, struct mm_struct *mm); -void arm_smmu_sva_remove_dev_pasid(struct iommu_domain *domain, - struct device *dev, ioasid_t id); #else /* CONFIG_ARM_SMMU_V3_SVA */ static inline bool arm_smmu_sva_supported(struct arm_smmu_device *smmu) { From patchwork Wed Oct 11 23:25:58 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418096 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id DBEE3CDB465 for ; Thu, 12 Oct 2023 00:30:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=knU9i62FQ+KOPnotmiwrxfT732CE9zNlgTQ0Bh9XmKQ=; b=vonF9k3g1KzYyA 4HBIYzsE7xBU+llLYuLD3fc9QN7DWqScBu9gk71BgJMlFZr4mM4ZDexHQElIUoaSMWMPR8t4zNPqj x6JAnmDehcaS2ix9sFYcXglMiEMhBnn3fp8hykxviSTgGK0R3efSEGjRf4mI8qgNZ59qgAzJBeV1/ 0YAe0VU5hcQWGiz2m6W4p+Mrp2wIMnEJ0JplIf/K9d6eN6bDSz469zPSeRcaqe92WM3q/u44qzDhQ hxr3tbirkFf04McPaVtUuHfmcW88K4Quz2a2cKwI9b0Bm9j19EzVx3SMSHRKh0BHx5WCheVoE6PJd 10Pb4H/h3+u6A9KLvuhg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqjb6-00H2xW-1x; Thu, 12 Oct 2023 00:30:40 +0000 Received: from mail-dm6nam10on2062f.outbound.protection.outlook.com ([2a01:111:f400:7e88::62f] helo=NAM10-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqib3-00GvWu-2n for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:38 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=iJwTimqwrEvfQReATYBvQVF/LoLNn0ef25py/wwaYPbdGAAxl6D4nP9IoKZXUOc4KFFgS3Uiun90XDvMIXNL4fmTEkF2hsbBTxkGZfhbZWjs9TT4x+qHamn1qwQ66kVLs1dVFHp263Au96SSUN6g7NmX01LG1APvMMFsCacZsa4ciuXFmzaeRJ7tTEbhax8hOFXyaLG30vMhf1T4Udw1nuKhT8BKzvuSoG9uqrzXDCN00rRMPeos2mBJhQ4c3AjDbIdGW7Zgt7eSh3+FAr+BhfTTn04V8WA4Sgomlx+CayKVGloJ5Sf2cnuYiFjXbdi8jNX9xyigr1qQ1NzEBxylpg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Da3Ahr5nlwmiVXVwyEftq11hL7cX0ltzNwm19Pp5fVM=; b=d1qDo4+OL0mBJ3eA/1geCYjag/gkh3ZL9ortG4CwUh4GavrPev2tc+5txG7loY7uMR2Qlp+dUNW6MSLHRaQod3I8PnTspqvlECDKmHa0DqJaebmhJL+gmXWqghj52GRTRUOaDJ4t0Hc1elS7V9fBx7y2wM3ANaOEMgLx4nmxpZKl4UA5G0nGXDRe+HLKw3+J1OQthdhUz4ogVDqGg39ot8ErvUzmwoFv/J9rh3S75SmtRxf0Y8rzv9DoPaUEDLXibokOW24myuOxYlBhwIivO9SCvd8Hav87f3HCgeFoacaxCw38MQQWYo47XD7EMs342tvykomMdDPlzPlEafWyoA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Da3Ahr5nlwmiVXVwyEftq11hL7cX0ltzNwm19Pp5fVM=; b=MFaTP8uLARk9fqfd56I+wJQNKTjKad2HuHgyMMBeIcQaxrnR2XCihMmc8GHwWi1D60Lpgz449TitEhFBP+aXj/JHbnruaLBDOHuVPVViBRBVyzZMSibOi5YlJW+s/6EfWYY0GfmjbhRLt/ku9Xb7F7uz8lTIEeShx+1gqJZU/2Kx9Im2odLFUVnfGfALFHzX4s+c7dzjOh3CwpgbcnXToOeXOlLxAhW1dTTHiMS+Xvmr5MZh6qyAwedTEtWr2gks2dA1zrsnuKQI1wwmLIbtr0ogTE6b87s7d1nO5/TxkV4ayS3eXrkwVD/fA1ZhSHP12iHFXOWXJMRK0JxFkJPzAQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by CH0PR12MB8488.namprd12.prod.outlook.com (2603:10b6:610:18d::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.38; Wed, 11 Oct 2023 23:26:12 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:12 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 22/27] iommu/arm-smmu-v3: Consolidate freeing the ASID/VMID Date: Wed, 11 Oct 2023 20:25:58 -0300 Message-ID: <22-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: MN2PR03CA0027.namprd03.prod.outlook.com (2603:10b6:208:23a::32) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|CH0PR12MB8488:EE_ X-MS-Office365-Filtering-Correlation-Id: b651e8cb-a49e-4d3e-fd1d-08dbcab170ce X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 8gq+BVEVkZybMmOC90PD4MypC92DX5Z3GtAPQgMqfVG58mA7El+Ne/8WDpzNQzgiUAREB5WZBW5ydlgOl5X9/wNEBnfst7520mSDcILuxgDft1uzy6iHXkCSdulGvOIRfjRrgsy0pNpdzbUptmkZzHyeJp1gkfVp/bXaibUdTFQaNjWGG/VczRyC0cMRCBzQuQC1qhS3tXZFT4O3QfLkrL/x8YvdMlPd6tFdgmTe0ockPN554elX/ZcwCmq2TMABAKoxh6xc8TmBNU+mYJZWU6lK+qhFTaB5PY0Lfq4TFpz4ySHU5vA+07YWbWhaL2n0m2rXMwTGjaYMWDvy8NdckAZayuHpMvYB4SMaViRwjFxS/wVfF3Q1lqDhcM+594gP6KVhUUE0NK50/tvqQGGmO0fFMC/WKynp7SDmibGE7ja7HYPGlEZQOLEefqxibVOPYRPQSsICbcTq0xsj0lWAxdE76b1UI/k/ewILyg7IpU+4Bt6AlI4e4bQbfKTT3GzCH/812hZt0vtM8H00N32tg5+6/YzW9DP0uj3levgM2H3ZXZHqJB2vJmo52HXInXRI X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(366004)(396003)(39860400002)(376002)(346002)(136003)(230922051799003)(1800799009)(451199024)(64100799003)(186009)(66476007)(66556008)(8936002)(66946007)(316002)(54906003)(110136005)(2906002)(5660300002)(41300700001)(8676002)(4326008)(6486002)(38100700002)(2616005)(6666004)(107886003)(36756003)(26005)(6512007)(83380400001)(478600001)(86362001)(6506007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: kVuWuU0/QWSOb0S1x0OKBzxj9+XPO2sWk3gtqd2ASbtqHGth65LwBRm3OuSsdKR3CoG5gaEXB0PHpdcpE1aUyxZSuECH4b2gWxcs3+I+QkBioupiHi3FpAXOGsfG6R3qMCAUCJMipy7eqoG0UuUE/G2KVAfD58YMxOShDZWUq8HQNZ+fKnV3a/JB7OFrWHhc2uHP7jOjMDT4x16NuuxWqlhvrlNpAXB5/lm4TQSTKWZRKfChlUq/xcYiLgJI0iaFFbRUQB2Hkn1XmSUtqHaOA6FBaAkaeD8ZqcGbh3zrc//HiEjYEFxg3DGb4wY3D1ds+ghucKk5Rx/JAaMxaZiArl7T6QV7+9vPMGRDgxQRXAt2V+WNGAuyCbgR1zA/OzYyemKwcWa8xz52JyqEAz/lDq/x+q0pHg9IYLFV4zZLFwryToS1giIPyHNsPtWZqG2uBkbchFFakmlaJd4SvWxhhWJ8kO/XYMKU1YzHm/T27idCBiFG9t/l/H9UteIW12OPFGEdyHK2UJp+qabbpleOuNXYNbZ5ptNOMXxv66S+mCRvqNTXW9dT2zSFN9xtKwPJIOeYqjo0GSMMsCBCdwd6h+6/7GlOlHv7OFbCPe4EvzWnD+eFaVbLpBYG4ruYkJ+bbCnSu0jGwPFzjUckM4lwNniB8QNfaQCRqmOS3+pljcqPnYo1vWw8M3io8cvyk+UNZuUPjezsKWYYkIZvhCsuqps8rCEIz/3RcnlNnrO5AsKNvuNGmY5cvSXCyYV2CMF6jlqlGH//ISlGPOCXSB0+zt3H+R6DQOaT/ECA+lQ0M5Aq1vSFOyzM3EszKZ5S4IO6Ils/qrb9cXvXF6CHZFV0TRNJPD/L76FVXP9/BxhpBrWn46DmNMZfzm7nL51CYCfYuQA9M3EJ4kEKuYF4Rq8i+l8jPtf4gHvAQ1jKGSkFtsZkmbkxYGSnoojSe94X0MXW+NNH5MKb0ayXfiAECAcn4EbWPnQ5MqXggYT8yF0VT8W0bsS+pWYOblx3tZgLrJy2nfpO5LW6ptuj9CmmSqpym1+5KPQu9oyJ6gp60k0T9VhR1dYVLESvofj+GFpxs43a8PxqPqldfV5r4eS1rfK1QVUvaZfFhivHMxLw9Xqw2BCrPOHDkYAaEApP8OMbAttfXG7IAdGlPPR/Y/LXx24KFy6rKKqurRFpHAHAttXyWpYFFx16F1AFofsC3fY3ulgwgyv7NgkdFDemed9HqkiwMG++5sXwiQWqjgRBr1t6MRcaWfgSPRTA1TGGmUiu3i+P+9u/v7HcZX4dyS+l9vYIGk15KwmL7uLIMpV7ISZBhtF6Do+/+DRqojPabIDe81f0QjiVZhZmtgeWVe3GCRgCllubgvyiKwVTQRoIJJLzu2vuqigNUgPkIuy7Ca4qVOb7NnG+4WK2sDZcyVQO7JKIL+/DHBJz2fNrhn7rpr80CN52immCopJGJzT0OPS1eklcDjJ+k/K5NyVOexhqnFMYdFVKkKg3N8MflcmZu6mTqJm3/xYmx4AnNYx24e5dVwnCBHBgYWnBgFGuafpU5OdGiQlyCrQqcfDHYuaRfdZmTtR3vmooW56ch6R2skyKD31s X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: b651e8cb-a49e-4d3e-fd1d-08dbcab170ce X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:05.4552 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: IOeIGsUqXXj7XFDVku8RM7B6Ze3uNcy95YGf+mVm36GRSWYcJh3wh37BWcXSZjWb X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR12MB8488 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162633_921378_6E0D8196 X-CRM114-Status: GOOD ( 20.07 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org The SMMUv3 IOTLB is tagged with a VMID/ASID cache tag. Any time the underlying translation is changed these need to be invalidated. At boot time the IOTLB starts out empty and all cache tags are available for allocation. When a tag is taken out of the allocator the code assumes the IOTLB doesn't reference it, and immediately programs it into a STE/CD. If the cache is referencing the tag then it will have stale data and IOMMU will become incoherent. Thus, whenever an ASID/VMID is freed back to the allocator we need to know that the IOTLB doesn't have any references to it. The SVA code correctly had an invalidation here, but the paging code does not. Consolidate freeing the VMID/ASID to one place and consistently flush both ID types before returning to their allocators. Signed-off-by: Jason Gunthorpe --- .../iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 9 ++--- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 36 +++++++++++++------ drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 1 + 3 files changed, 29 insertions(+), 17 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c index a3b85aa5e48ce6..66de6cb62f9387 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c @@ -370,18 +370,13 @@ static void arm_smmu_sva_domain_free(struct iommu_domain *domain) { struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain); - /* - * Ensure the ASID is empty in the iommu cache before allowing reuse. - */ - arm_smmu_tlb_inv_asid(smmu_domain->smmu, smmu_domain->cd.asid); - /* * Notice that the arm_smmu_mm_arch_invalidate_secondary_tlbs op can * still be called/running at this point. We allow the ASID to be * reused, and if there is a race then it just suffers harmless * unnecessary invalidation. */ - xa_erase(&arm_smmu_asid_xa, smmu_domain->cd.asid); + arm_smmu_domain_free_id(smmu_domain); /* * Actual free is defered to the SRCU callback @@ -426,7 +421,7 @@ struct iommu_domain *arm_smmu_sva_domain_alloc(struct device *dev, return &smmu_domain->domain; err_asid: - xa_erase(&arm_smmu_asid_xa, smmu_domain->cd.asid); + arm_smmu_domain_free_id(smmu_domain); err_free: kfree(smmu_domain); return ERR_PTR(ret); diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index c8042b037673a0..322add56bbdfe7 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -2207,25 +2207,41 @@ static struct iommu_domain *arm_smmu_domain_alloc_paging(struct device *dev) return &smmu_domain->domain; } -static void arm_smmu_domain_free(struct iommu_domain *domain) +/* + * Return the domain's ASID or VMID back to the allocator. All IDs in the + * allocator do not have an IOTLB entries referencing them. + */ +void arm_smmu_domain_free_id(struct arm_smmu_domain *smmu_domain) { - struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain); struct arm_smmu_device *smmu = smmu_domain->smmu; - free_io_pgtable_ops(smmu_domain->pgtbl_ops); + if ((smmu_domain->stage == ARM_SMMU_DOMAIN_S1 || + smmu_domain->domain.type == IOMMU_DOMAIN_SVA) && + smmu_domain->cd.asid) { + arm_smmu_tlb_inv_asid(smmu, smmu_domain->cd.asid); - /* Free the ASID or VMID */ - if (smmu_domain->stage == ARM_SMMU_DOMAIN_S1) { /* Prevent SVA from touching the CD while we're freeing it */ mutex_lock(&arm_smmu_asid_lock); xa_erase(&arm_smmu_asid_xa, smmu_domain->cd.asid); mutex_unlock(&arm_smmu_asid_lock); - } else { - struct arm_smmu_s2_cfg *cfg = &smmu_domain->s2_cfg; - if (cfg->vmid) - ida_free(&smmu->vmid_map, cfg->vmid); - } + } else if (smmu_domain->stage == ARM_SMMU_DOMAIN_S2 && + smmu_domain->s2_cfg.vmid) { + struct arm_smmu_cmdq_ent cmd = { + .opcode = CMDQ_OP_TLBI_S12_VMALL, + .tlbi.vmid = smmu_domain->s2_cfg.vmid + }; + arm_smmu_cmdq_issue_cmd_with_sync(smmu, &cmd); + ida_free(&smmu->vmid_map, smmu_domain->s2_cfg.vmid); + } +} + +static void arm_smmu_domain_free(struct iommu_domain *domain) +{ + struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain); + + free_io_pgtable_ops(smmu_domain->pgtbl_ops); + arm_smmu_domain_free_id(smmu_domain); kfree(smmu_domain); } diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h index 5f021d6cee0b14..a24d37e0212eac 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h @@ -789,6 +789,7 @@ int arm_smmu_set_pasid(struct arm_smmu_master *master, void arm_smmu_remove_pasid(struct arm_smmu_master *master, struct arm_smmu_domain *smmu_domain, ioasid_t id); +void arm_smmu_domain_free_id(struct arm_smmu_domain *smmu_domain); void arm_smmu_tlb_inv_asid(struct arm_smmu_device *smmu, u16 asid); void arm_smmu_tlb_inv_range_asid(unsigned long iova, size_t size, int asid, size_t granule, bool leaf, From patchwork Wed Oct 11 23:25:59 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418099 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 7484ECDB46E for ; Thu, 12 Oct 2023 00:30:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=QeLtyTKVe6N+j7oEVqcDv8MPV+scK3RM1E79uES+EmE=; b=gxWnZLSVOwOtZq yyddCQ4PDwPYJp0iGnFDg0FKXlU7ddBZu8pL5AXpvd/I3EUOtvyt0atEWMLEtiaH/qLYsTO9TWBxR +UEtQ2nmbPB39pViDVlTnfvqXR6bx+lXg2XELHD6r/+WUFXBXFicnzy/UvPRbrzYUDSh48hmdJRGI LduHz8XLNuT0w+ynHpq8bgftDH5hTZIvEfICDEXYvpsMb6PjmLbrgUs/s60ZJVi7WH7OIiAt+mh5e /zAuu36NAliV2xJXtxVKWEzipIGYibLzh37S2jIbcOTgYLVGy35lFSDRb5Li/lS+NkksvbzHD5XI+ 4HXlPJWveZDlNc9ktrfg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqjbB-00H328-2i; Thu, 12 Oct 2023 00:30:45 +0000 Received: from mail-dm6nam10on2062f.outbound.protection.outlook.com ([2a01:111:f400:7e88::62f] helo=NAM10-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqib8-00GvWu-1v for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:40 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=KNE68wgJoJHCEkBDwQnWNgM8XhTa2/21qfe9rKmEjTm8jmcoigkpecGlXeMSljX09lQ070Zgm7mChohuagQeVJ8rttbHNxYgxeihdc4YW/4tHlKdOCZ8ptFvJm/XJDHKwnx41e1VFh6B/bPGZv9GtFKWRB8q1dPhJCNukEQSP4uAWfjLadrukLFL5e47Nm/pGb1DDKBwmweqnNe6Y75syN6VKLHxINcIfNgkgZtB3tZPGOWE1cR0UA0JH6+ivJJzGHUDPMSreN1MS4ap1jPR0R31Cl6wijc+H1ojQZFG4rq7FtKHGmo6/wrztaLJw8Pv/H2hPPPJa7sFfpLbTGONvg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=xXlW5cEmf2lXDw1C4CnyfiShh3KU/QTq/1qtcAlXgyQ=; b=QYc39dDAno0P8ZS8ubtA16zsbcR34CrcbQltKGX0RN59TH7ghzqgwaGraqUFiAAVlUnG5QnirzBocFnV5lF57WApdlceLIfihrZobzfrYfWQbBXAoDU+0R8Y1A9SJwJqSZxyOjtNFFT1CXMUjwDtXa7h24MDIfIPxNbdZktVvWyYveFIJEbzNY22E+F1KXbGF7OknJ0gNpnHVJp2QMp8+PDb4VYBrjU89M+4J33oSMrjHPlrUSAWpZoGt1czSTcEEW1hUxaAlitjVR3l37SGa4dl3pyt8TwWNUC9uzrZLbn+9JZpBcl+mRe8iS0YrAar4Mke/EKZvZlTatsEaG3dGg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=xXlW5cEmf2lXDw1C4CnyfiShh3KU/QTq/1qtcAlXgyQ=; b=QzzJa4J8Jpjq3ES3u/yoolJGoh88b1xlnlfuHMizTGi4lx76V07734DT2kIVvtA2EoXGLT8/NNty/e1Tw+uWIh9mTEU9e8jkeFw16EU2//QLreUh/6IYf4XzQ0mmxD6XA3fFDICTfsXuNV3JGCvL4A6ta6m5/SwwCWufcrkNReiIP1RavLrb5a5EKo+/vO5KSam6bUtqRgu8qUVfu7FMvskv/kPA4W2JaDu7B41vmlt2Wa/6TVin/RsTT1+2P7ttQGlcBCAhOVBj7BVW0B5S1Ir7odOLyUqecH11Ge6Xerdl9Aa77314uasxE9GrZ1hXmP9+M4tMXQJZJ7WncQdA6g== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by CH0PR12MB8488.namprd12.prod.outlook.com (2603:10b6:610:18d::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.38; Wed, 11 Oct 2023 23:26:13 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:13 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 23/27] iommu/arm-smmu-v3: Move the arm_smmu_asid_xa to per-smmu like vmid Date: Wed, 11 Oct 2023 20:25:59 -0300 Message-ID: <23-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: MN2PR20CA0057.namprd20.prod.outlook.com (2603:10b6:208:235::26) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|CH0PR12MB8488:EE_ X-MS-Office365-Filtering-Correlation-Id: bc73ad48-a6ce-4a46-d381-08dbcab170e6 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: GOFIuvLeNch8GhUrsP6Gophy7Mp3PkOrU990WxFPFHrrKbemPnzHty/uD/l0Od6ldigt2c26KE20tsuKda1/ffXu1Qf+dTdA7MV++F4IjE/IcYTA0a1CH0UXJ0PPc0cE2CjwBKKG+/qcUEyLfpvqAsJZjNpfdMiMRwlaLvbF47p5RNRPRhdjcOtL1tYqeK8hpd4E8RS2qAtPjfUa4eMe3xM3NFtE2HYO7I2pdZeYkoAFFbNMFHOz2kdvotTH2DMoJG7lwfVumP2igPlgZ8pBnLZOVCj5k5MtW9APROznbLo64Kc+uhenYiLypkgKwBXjs8BXAPsc6SGV26hmcFUWFBk9B4W/CidnyWRa2onkLqHJb/ZhM5IY2LtBsNFluXkxXlhyF03AHFb8gCq96l7YMWL+fEE/LMfkmdJt2+tKORmJMD5rG41BgEUNQQAbBZbFm33Y45vSNCSdySdbZjpg18SMNonUmO/119xN2cZUXupydclNbhryp0XSA55rvwdEbO5MUuFNJ0RQSghiPNkLy2w3dPlKWevy3EhH0tUFqzwqwebPWP+b5I6JHI7PnWvI X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(366004)(396003)(39860400002)(376002)(346002)(136003)(230922051799003)(1800799009)(451199024)(64100799003)(186009)(66476007)(66556008)(8936002)(66946007)(316002)(54906003)(110136005)(2906002)(5660300002)(41300700001)(8676002)(4326008)(6486002)(38100700002)(2616005)(6666004)(107886003)(36756003)(26005)(6512007)(83380400001)(478600001)(86362001)(6506007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: gxLTAM6JqGqLTYNHIGTMscfoQ4DohKEejVmGDOnc1+EVA+G23LEjdpZMRbDfxOHexPQ8kgzLXf7eAnhrsAwBnMrn4gBfv5SPcrP/QPUx3qmgL4e4PizPCTazJcoR4akBafBPfyYwwBZUUyT52uSOFO4ZOW/1rdMyqBz+5mMHabCKOh3a0lcghNM25urEjX+Lb5EXf0rz+vUXFkDmQXEp1SdaUxCB0qXASnjPM+GSfE4CX1NudBznnyuIzLT0s0UIzKlmTlPUeuhB4gFIehi8cSbHyXuvJNJqxa9W6JNIJZzm+5M6y/xvRGyvAcG+PkyUwXU9PKx3gY8gnFDVbQLl5rjBUA1uDV9Lqr7aUX7bUmq2nbfGHt+jT6tSKTPHhOUleWP3xRMCc0v4+tD9xI+ng9B5XMIv4g2naDTvPD2Yki1k7qcMRcYmsh/9CLsmueb9apfkfiLHBspchCAN/XJlDUIkOBK6MD/Im43VltGa4HNB5VmYLKAIsZHU042zfxcEUjLQgkA9XGLh5rKdHS1GBkBi7TOFBMmTlaxnjaLJy+nWajlEOdYP8APKCjuK6isarGcWurTTa0rdTTArF3yRLuU0fQiw5MLUIBYWRIaACcfFZoYcRoLofLDGD/Jbv/QDdEyXQxgG0Qhe9NsWp6XmZDiwMlDeCR37mVZGzaaY0S6bGOi6ufV8HZS+b/iNXuuplqrULh6hY+F9OtEMagOuQppdpqRoX0t4tkNAe0o7cn9Ql4tgYys7aASPxqTVBHexyNUCMWAmnY6Z+G508Xe4xB/esVb+4PXC8SmXwTVhYjzoW+zRkwxj3gO+9dertgsSmX02kh8Nm+WCqKUmRZi8atgnEgauuDyWESmzdQbpvt8PTbZgUSaZPw7HWNVlMT0tKoS1UuaXNywGF4lO7N3DrxKxpLo1L5E7M1R+BsUGbpTrYXyb7oK/aVpbv9pEypy2Pty1/aGiq7beYKUiZhbgk2Mb788700BTfPgvBqCIfnQl8n0Ka03SnPTrRR4RE6M3VLLzUQZNgla58ZRwS1GV5vcQRTCVvhJ6IRT1E7P5sLCOmP+kYcsiK2oOmLmQiHSFzJm4ZhXd03qvpXSQL7HQEo3SwClF6ece/m25vXoF8I7g3kADaNdczyQxi7DI1QaKHPiE+OtmUw2lIK/tFfGswHhWee2Q4o07j1UJVYG/xXxqJmQ+xmAy5F41oZpdRhZQgXl2O7Bt3bpxkaCvek5UHHn8y104F6HuI/l7Dty8/aw131xxT8ieevbwIPANZ7Ud23rwmDgltnl7rZ7D7a3tXykxaDoPZ1Lb3jOFHK7piKz3Hj0uMzyW8XeTq43g42jUDfVjwwdoTTAVZAOghR8c1cqIqa0km8zKdSA45p8kBh3z5b0H2ViK+gMcT42jQZ9uwbHHqRiIF/iwtKp/j0sxg/47/fxbzMsKv8i8B/IHWcIhheEgvQ4Hdd0Yj2DKLXC2e6balYK/uWyoNiLym30UBFt805M9GbHDoRqpVcenh80G8LZmwDIxkjd2+aUXJbjQE9EIRg9Db6QlpYWuo8pDPLD5Ob44fuuZFJpLtgu7hmpg0kUTOf2qNtFBjqSpa13p X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: bc73ad48-a6ce-4a46-d381-08dbcab170e6 X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:05.5999 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: DQuGcG/RXlV05M5B3jZwiqfmQWOtLPqix1n2uX9UCFrk406G50AWS2a4YH/2kIS3 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR12MB8488 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162638_656665_C413259C X-CRM114-Status: GOOD ( 18.32 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org The SVA BTM and shared cd code was the only thing keeping this as a global array. Now that is out of the way we can move it to per-smmu. Signed-off-by: Jason Gunthorpe --- .../iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 2 +- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 39 +++++++++---------- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 5 +-- 3 files changed, 22 insertions(+), 24 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c index 66de6cb62f9387..aa238d463cf808 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c @@ -407,7 +407,7 @@ struct iommu_domain *arm_smmu_sva_domain_alloc(struct device *dev, smmu_domain->domain.ops = &arm_smmu_sva_domain_ops; smmu_domain->smmu = smmu; - ret = xa_alloc(&arm_smmu_asid_xa, &asid, smmu_domain, + ret = xa_alloc(&smmu->asid_map, &asid, smmu_domain, XA_LIMIT(1, (1 << smmu->asid_bits) - 1), GFP_KERNEL); if (ret) goto err_free; diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index 322add56bbdfe7..e9265026fe555b 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -71,9 +71,6 @@ struct arm_smmu_option_prop { const char *prop; }; -DEFINE_XARRAY_ALLOC1(arm_smmu_asid_xa); -DEFINE_MUTEX(arm_smmu_asid_lock); - static struct arm_smmu_option_prop arm_smmu_options[] = { { ARM_SMMU_OPT_SKIP_PREFETCH, "hisilicon,broken-prefetch-cmd" }, { ARM_SMMU_OPT_PAGE0_REGS_ONLY, "cavium,cn9900-broken-page1-regspace"}, @@ -2221,9 +2218,9 @@ void arm_smmu_domain_free_id(struct arm_smmu_domain *smmu_domain) arm_smmu_tlb_inv_asid(smmu, smmu_domain->cd.asid); /* Prevent SVA from touching the CD while we're freeing it */ - mutex_lock(&arm_smmu_asid_lock); - xa_erase(&arm_smmu_asid_xa, smmu_domain->cd.asid); - mutex_unlock(&arm_smmu_asid_lock); + mutex_lock(&smmu->asid_lock); + xa_erase(&smmu->asid_map, smmu_domain->cd.asid); + mutex_unlock(&smmu->asid_lock); } else if (smmu_domain->stage == ARM_SMMU_DOMAIN_S2 && smmu_domain->s2_cfg.vmid) { struct arm_smmu_cmdq_ent cmd = { @@ -2253,11 +2250,11 @@ static int arm_smmu_domain_finalise_s1(struct arm_smmu_device *smmu, struct arm_smmu_ctx_desc *cd = &smmu_domain->cd; /* Prevent SVA from modifying the ASID until it is written to the CD */ - mutex_lock(&arm_smmu_asid_lock); - ret = xa_alloc(&arm_smmu_asid_xa, &asid, cd, + mutex_lock(&smmu->asid_lock); + ret = xa_alloc(&smmu->asid_map, &asid, cd, XA_LIMIT(1, (1 << smmu->asid_bits) - 1), GFP_KERNEL); cd->asid = (u16)asid; - mutex_unlock(&arm_smmu_asid_lock); + mutex_unlock(&smmu->asid_lock); return ret; } @@ -2518,7 +2515,7 @@ static int arm_smmu_attach_prepare(struct arm_smmu_master *master, * arm_smmu_master_domain contents otherwise it could randomly write one * or the other to the CD. */ - lockdep_assert_held(&arm_smmu_asid_lock); + lockdep_assert_held(&master->smmu->asid_lock); master_domain = kzalloc(sizeof(*master_domain), GFP_KERNEL); if (!master_domain) @@ -2563,7 +2560,7 @@ static void arm_smmu_attach_commit(struct arm_smmu_master *master, struct arm_smmu_domain *new_smmu_domain, ioasid_t ssid, struct attach_state *state) { - lockdep_assert_held(&arm_smmu_asid_lock); + lockdep_assert_held(&master->smmu->asid_lock); if (!state->want_ats) { WARN_ON(master->ats_enabled); @@ -2657,12 +2654,12 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) * This allows the STE and the smmu_domain->devices list to * be inconsistent during this routine. */ - mutex_lock(&arm_smmu_asid_lock); + mutex_lock(&smmu->asid_lock); ret = arm_smmu_attach_prepare(master, smmu_domain, IOMMU_NO_PASID, &state); if (ret) { - mutex_unlock(&arm_smmu_asid_lock); + mutex_unlock(&smmu->asid_lock); return ret; } @@ -2689,7 +2686,7 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) arm_smmu_attach_commit( master, to_smmu_domain_safe(iommu_get_domain_for_dev(dev)), smmu_domain, IOMMU_NO_PASID, &state); - mutex_unlock(&arm_smmu_asid_lock); + mutex_unlock(&smmu->asid_lock); return 0; } @@ -2713,7 +2710,7 @@ int arm_smmu_set_pasid(struct arm_smmu_master *master, if (!cdptr) return -ENOMEM; - mutex_lock(&arm_smmu_asid_lock); + mutex_lock(&master->smmu->asid_lock); ret = arm_smmu_attach_prepare(master, smmu_domain, id, &state); if (ret) goto out_unlock; @@ -2727,7 +2724,7 @@ int arm_smmu_set_pasid(struct arm_smmu_master *master, smmu_domain, id, &state); out_unlock: - mutex_unlock(&arm_smmu_asid_lock); + mutex_unlock(&master->smmu->asid_lock); return 0; } @@ -2743,10 +2740,10 @@ static void arm_smmu_remove_dev_pasid(struct device *dev, ioasid_t pasid) smmu_domain = to_smmu_domain(domain); - mutex_lock(&arm_smmu_asid_lock); + mutex_lock(&master->smmu->asid_lock); arm_smmu_attach_remove(master, smmu_domain, pasid); arm_smmu_clear_cd(master, pasid); - mutex_unlock(&arm_smmu_asid_lock); + mutex_unlock(&master->smmu->asid_lock); } static int arm_smmu_attach_dev_ste(struct device *dev, @@ -2761,7 +2758,7 @@ static int arm_smmu_attach_dev_ste(struct device *dev, * Do not allow any ASID to be changed while are working on the STE, * otherwise we could miss invalidations. */ - mutex_lock(&arm_smmu_asid_lock); + mutex_lock(&master->smmu->asid_lock); /* * The SMMU does not support enabling ATS with bypass/abort. When the @@ -2776,7 +2773,7 @@ static int arm_smmu_attach_dev_ste(struct device *dev, IOMMU_NO_PASID); arm_smmu_install_ste_for_dev(master, ste); - mutex_unlock(&arm_smmu_asid_lock); + mutex_unlock(&master->smmu->asid_lock); /* * This has to be done after removing the master from the @@ -3434,6 +3431,8 @@ static int arm_smmu_init_strtab(struct arm_smmu_device *smmu) smmu->strtab_cfg.strtab_base = reg; ida_init(&smmu->vmid_map); + xa_init_flags(&smmu->asid_map, XA_FLAGS_ALLOC1); + mutex_init(&smmu->asid_lock); return 0; } diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h index a24d37e0212eac..8e13fe136f1bbe 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h @@ -675,6 +675,8 @@ struct arm_smmu_device { #define ARM_SMMU_MAX_ASIDS (1 << 16) unsigned int asid_bits; + struct xarray asid_map; + struct mutex asid_lock; #define ARM_SMMU_MAX_VMIDS (1 << 16) unsigned int vmid_bits; @@ -768,9 +770,6 @@ to_smmu_domain_safe(struct iommu_domain *domain) return NULL; } -extern struct xarray arm_smmu_asid_xa; -extern struct mutex arm_smmu_asid_lock; - struct arm_smmu_domain *arm_smmu_domain_alloc(void); void arm_smmu_clear_cd(struct arm_smmu_master *master, int ssid); From patchwork Wed Oct 11 23:26:00 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418063 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 55D33CDB465 for ; Wed, 11 Oct 2023 23:27:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=YDa4ElWWjpoxOw/NS+nBKXLKlsxXcB0F6nUcO9jNDzw=; b=4nBHxEUAahSKqD P/Y7W5DgMGQgKQlX1wAd85OyPRo2C2IvhYqlX+uQ9sTtu+JVQ9ttNzeSeejrex0WtUEmWeCaOTJRs HYyauFA4MSrXHpgDs30s9Q1sdw+bUQBc8bN5VbDcfgR8RNPzlnpeY1OoMAAnwG1aS2TWXyunFY4DZ ZWIt51fo5VOunzfgvKiATQC4RK1pnr5HnqXCKA3wTor7hbY6G/s3lfJ5awLvJzmZ9rvsTXMtjkXPb MgHE8smKWMXOV9PhU5CYnFNXlwJ3TC2EEbkgPARY33NcN5c5CFrYwXngJuXKjhg+JKSDj8guXd6kw yfoZocAQGoQpg5eAfPAQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqibI-00Gvuo-0g; Wed, 11 Oct 2023 23:26:48 +0000 Received: from mail-dm6nam10on20625.outbound.protection.outlook.com ([2a01:111:f400:7e88::625] helo=NAM10-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqiaq-00GvP6-11 for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:23 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=nNMQFNjyIQkboQp8TBpKB++Ni615pSP0O/5f5GqxgY4gVMwWFMq9pDbSmSdmCcBrv6KB889oiRep0b7uwkeNc67pN+8aRH5g9G1G1hQTvyMDMAD0hOd9XA0ZJ9pqTl5dQ+6ytK3Z0JG99vVikQibjHP3ieoLavU1gtvb9Gc0EUWa44b8kc6cXFDt8TyQ2igHIFQN5XTU0tH0t9uLEBTx0l/dy18bbNaubezAqdRbHru0s7kgZPtwa2iaaGhReUSLU/p2oi1YjAY9+sBKxbo89lElUeTBmd02XOfcc8nKsQiv/CLJb6YkLxJIsTdxSZv1EUH6OnioZQQdbgD/ddMIog== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=62cWserfXHYLumE6D2wSCVZbLM6ihbsNSK/9veQNrpE=; b=Enq/McNJUbc97ayZ5SwXnpIxxo/fUGEta4/28Fal2r88Zz+969IzG0Ylvjb+ThRtMCzmfcvSmkcx9EKQoEOP0ffFzKVC8SjslIvdgQqEKZKRzINzjnVZBnCbRZC/Bub3a/XtBO0GVoGVRrbN/G1KiJcXll16YT6G7Z4uMTHSggZV6ihGHUxOg8DY0Hqdr+NfPLbt75Pf9YtATk0EOxPONDqbEXksb2MUxMmCXbljellEFaYnOX3sPqmYDV8F9t33bIliZg4d0Gy8ZArRgikCkSXT4bxBXP08SAfk+WQ95IZL820ihHGyh/TdSIOEKEFQ55x3UCPT6VS7/bmMOsh/SA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=62cWserfXHYLumE6D2wSCVZbLM6ihbsNSK/9veQNrpE=; b=rxbT4hYbTtGxPrfytoeqtdZRGWygyd8E0V9htRCDwdqAhzC1riqmpyECFiDGNiMmDlINN5zqI8mHH45GMLqd6mvfmVTEesQMdCOvPqEYRe6AIXo7SHwJN1RRbgDVPrfLbA58itZL2LOWhc4wnH084Cag7KRXRbfDDa62zT5OBlmh8MrkOUWYrwRqLEaAEd+ippeH3zAMAv0I4tb1sWBsIFtK1TOxnsQtF6uheoLgE9FF/UnusVVE2d8sbyWhFNbZjNTEc/DgtkhtQZ3fLhFT0GYyuPvRCakRqpHCa/lpoMauaU/CFrTopcKYCd3O6SXh4cOAhWA8qEbaUljYTuexJQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by CH0PR12MB8488.namprd12.prod.outlook.com (2603:10b6:610:18d::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.38; Wed, 11 Oct 2023 23:26:09 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:09 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 24/27] iommu/arm-smmu-v3: Bring back SVA BTM support Date: Wed, 11 Oct 2023 20:26:00 -0300 Message-ID: <24-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: BL1PR13CA0288.namprd13.prod.outlook.com (2603:10b6:208:2bc::23) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|CH0PR12MB8488:EE_ X-MS-Office365-Filtering-Correlation-Id: cc2b7095-bbf7-40ce-ca60-08dbcab17076 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 0INtNhfEc3UoWQptchjhIf6kHga3goVSOsa3ugodHdTc8qWRRQkv/qBNlREUT8zzMI38k/DHGs9j/063imUK7DZDVn8z7C7kIQMksy/VwmreJiIweXgOi9h/UuRRiPoa2iafKSmAdN8r21kWN618d52RSG5249yEctrfwEGIamrPZ5q7k6cM6xnKHxjzO2kCJUdedNlWVCkJOlfD2daGW0uQ/ZKf7sm2PoUCI13WobsUS1x+CeouWzfwbUqM9cY5nrNqPYSPfgva/fcxY/eAQBsIyyPBJMoGxoeEc6bPLBLAJtr+ds8HVMCpFiLsxRnQHiWgCJruhfK+V8s8h2CePabRBpylX5BCPBEKMw3jrkqVRPUuvELmtx8uVxSlrALycaCP19/cv1JiVAPmX1ZrzpPHJhkRkQpFbzWeJ5BSxb7W3U7BMS28CZgqJ52nZYCe96Cw28eKaD3v0HhkEIBGrAH1Z1BqiG3cTHg08sWhxxu1rSRb9bmTaXf9dk0I0AaEST8UBFzHNx8eKiAXs/OwVudas5/wZby2KB0rMAGqlhMp5aEjfnzV+jaxuIM0UXre X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(366004)(396003)(39860400002)(376002)(346002)(136003)(230922051799003)(1800799009)(451199024)(64100799003)(186009)(66476007)(66556008)(8936002)(66946007)(316002)(54906003)(110136005)(2906002)(5660300002)(41300700001)(8676002)(4326008)(6486002)(38100700002)(2616005)(6666004)(107886003)(36756003)(26005)(6512007)(83380400001)(478600001)(86362001)(6506007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: UioMNW+auD8qwTyrowFJfxdUgff65A39jZWqlMlHbknLJfylyZ3zsR6Gj6EGnDy+N+DRd+zWr7YGS/Oq1I4v4T08cDTcJgOHj48tKSiigDBdK8Fz8rP9QqKchagL6Y2Qk5qF+2NFn2cyv/bIP9azcIGI+U0HXQ8FKoSgvdcvagUrnGR7/mm0uTGmrYSPbzjU/jSXAaq6gb5RJSSL7nJ6JQjFaRIiQOFmyRU0hdD4Jbrq5QIEMyOWAEBs8DCN1af+nzmeilrm1swL0sm+mJL5JXcPb5BeW6duakKxyEsWn5eIoX0aFAN199gAM1EQ7QprLFVtSM5iMZavI6Qx6+kHRGj28dWpMOYqoRdjlg6YyvVYbSM+UZV7hUaOTeMt4fJIuyl0d/+8LrLTm6Y5pAZ/9SsyWlcS9iyBEuCKH+BjA6ostdq1JLHUton3K1NXhQ+qNBy51eUnjGxul/rNbrgJcQW8JgmVwqsuVEer33QFEARPRkOrTmx+bq4NZyIjAy7YXv/06GPGnRXpQzhZpUtfq8UxIRjti38xJg4QDYpGpbv5XqXmEEMuT/GAfo9qxnnEf8A/5BlE1n/ZsAmG237ZkNovC7Ti3+H/JtK3e4CqubuKpO44waXB6wjYxbkrRpCgxIvKesBdIGtwm8VThOqH/K/8ONERgbFfFmnQavdDK/WIIwwrhLkrhInL4fC/3/ttjZSivCnquxFQPtjneZJjbqPaoc3yqqoLlDJh4rR8KvMgDKJZ+Z1njknCP1//rRfVLAnZhmcsW0NaOGnvmrM4dJHk4e1JV1LvSCKNNoJyv/3iI2g6JzqHEl5sXcVRkxw24thLDgriKfx37TPmN8RGL08IAE2UhikuDnRgbV7ziDUtVa1mYPJ8lZ4Zkzf30g+UV5wu2KARiNBFSFyKsUJ4eIkK4M2AGr6Ozo7KQ0HUM6erO648JIKRXMHS2dY8q6jVHvdcwkkbqMHtZPyYzx1Y7m6bUvTuuDwn8VFt9l0PeQtKpR/+zBoHBCZWsDxi/NOVhleRqq23xUyA1avMk9ZipBWBJ7vwxByqQCoYE17C/cgjTcuDfgw/fjtz+jcTbPCh12uMjx8XAmOL9LmElRwpEeLS84iI2DNTkGJs0sJKd/tGp88b5OYASi3qj+JfyCn/zUUrOpoBX/KB+/3OOdMhTNMmcUyjkBEy5PJzSCA6T9quWONkdClV+n35PTfSTSgtY+Bezf0YbW19KkYPitJJrn61frt2KR4jQf2oTBSM2JEuTBq7zlRZrOecMmC0OU0FbItgZN/vdp3qiBKkvsYguX6O5MW1nJw8Mic+makj3RRmNqLy7LM7jwbhgQpqcs6xwaHdkjzI4Ato+FREou/nCc1mTg/9BeVfvlHWJQ5rsvHM5Au0x1V3zil54V+p2TQBhkPhKRTzPSdp4vtSFn4QonZn+LabE2DJvGHJ7iGmaGXVpVYGGFD3MWUgJKpgoaIvBgEvtdOuooEGyd7aHtbDzF5Vih4AgPtw1qHg1r5P6KkjUYUv0FqqiqUpXMP1HgD7o0wYU0AfbCh5oJyYIE8IxeYf7w6/4zKqRo63V70d6F5Aw7L3R+2xUpcO7hrjLqHe X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: cc2b7095-bbf7-40ce-ca60-08dbcab17076 X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:04.9422 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Tw2b1BXHocQsArKkhrVfGq7sQR7iHIgTFOLPmWet5NOcP9XlcpENDaUM3dnO5NNK X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR12MB8488 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162620_468568_DE02A644 X-CRM114-Status: GOOD ( 25.25 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org BTM support is a feature where the CPU TLB invalidation can be forwarded to the IOMMU and also invalidate the IOTLB. For this to work the CPU and IOMMU ASID must be the same. Retain the prior SVA design here of keeping the ASID allocator for the IOMMU private to SMMU and force SVA domains to set an ASID that matches the CPU ASID. This requires changing the ASID assigned to a S1 domain if it happens to be overlapping with the required CPU ASID. We hold on to the CPU ASID so long as the SVA iommu_domain exists, so SVA domain conflict is not possible. With the asid per-smmu we no longer have a problem that two per-smmu iommu_domain's would need to share a CPU ASID entry in the IOMMU's xarray. Use the same ASID move algorithm for the S1 domains as before with some streamlining around how the xarray is being used. Do not synchronize the ASID's if BTM mode is not supported. Just leave BTM features off everywhere. Audit all the places that touch cd->asid and think carefully about how the locking works with the change to the cd->asid by the move algorithm. Use xarray internal locking during xa_alloc() instead of double locking. Add a note that concurrent S1 invalidation doesn't fully work. Signed-off-by: Jason Gunthorpe --- .../iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c | 108 ++++++++++++++++-- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 15 +-- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 2 +- 3 files changed, 104 insertions(+), 21 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c index aa238d463cf808..2e6c3617cdbac5 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3-sva.c @@ -15,12 +15,33 @@ static DEFINE_MUTEX(sva_lock); -static void __maybe_unused -arm_smmu_update_s1_domain_cd_entry(struct arm_smmu_domain *smmu_domain) +static int arm_smmu_realloc_s1_domain_asid(struct arm_smmu_device *smmu, + struct arm_smmu_domain *smmu_domain) { struct arm_smmu_master_domain *master_domain; + u32 old_asid = smmu_domain->cd.asid; struct arm_smmu_cd target_cd; unsigned long flags; + int ret; + + lockdep_assert_held(&smmu->asid_lock); + + /* + * FIXME: The unmap and invalidation path doesn't take any locks but + * this is not fully safe. Since updating the CD tables is not atomic + * there is always a hole where invalidating only one ASID of two active + * ASIDs during unmap will cause the IOTLB to become stale. + * + * This approach is to hopefully shift the racing CPUs to the new ASID + * before we start programming the HW. This increases the chance that + * racing IOPTE changes will pick up an invalidation for the new ASID + * and we achieve eventual consistency. For the brief period where the + * old ASID is still in the CD entries it will become incoherent. + */ + ret = xa_alloc(&smmu->asid_map, &smmu_domain->cd.asid, smmu_domain, + XA_LIMIT(1, (1 << smmu->asid_bits) - 1), GFP_KERNEL); + if (ret) + return ret; spin_lock_irqsave(&smmu_domain->devices_lock, flags); list_for_each_entry(master_domain, &smmu_domain->devices, devices_elm) { @@ -36,6 +57,10 @@ arm_smmu_update_s1_domain_cd_entry(struct arm_smmu_domain *smmu_domain) &target_cd); } spin_unlock_irqrestore(&smmu_domain->devices_lock, flags); + + /* Clean the ASID we are about to assign to a new translation */ + arm_smmu_tlb_inv_asid(smmu, old_asid); + return 0; } static u64 page_size_to_cd(void) @@ -138,12 +163,12 @@ static void arm_smmu_mm_arch_invalidate_secondary_tlbs(struct mmu_notifier *mn, } if (smmu_domain->btm_invalidation) { + ioasid_t asid = READ_ONCE(smmu_domain->cd.asid); + if (!size) - arm_smmu_tlb_inv_asid(smmu_domain->smmu, - smmu_domain->cd.asid); + arm_smmu_tlb_inv_asid(smmu_domain->smmu, asid); else - arm_smmu_tlb_inv_range_asid(start, size, - smmu_domain->cd.asid, + arm_smmu_tlb_inv_range_asid(start, size, asid, PAGE_SIZE, false, smmu_domain); } @@ -172,6 +197,8 @@ static void arm_smmu_mm_release(struct mmu_notifier *mn, struct mm_struct *mm) cdptr = arm_smmu_get_cd_ptr(master, master_domain->ssid); if (WARN_ON(!cdptr)) continue; + + /* An SVA ASID never changes, no asid_lock required */ arm_smmu_make_sva_cd(&target, master, NULL, smmu_domain->cd.asid, smmu_domain->btm_invalidation); @@ -377,6 +404,8 @@ static void arm_smmu_sva_domain_free(struct iommu_domain *domain) * unnecessary invalidation. */ arm_smmu_domain_free_id(smmu_domain); + if (smmu_domain->btm_invalidation) + arm64_mm_context_put(domain->mm); /* * Actual free is defered to the SRCU callback @@ -390,13 +419,72 @@ static const struct iommu_domain_ops arm_smmu_sva_domain_ops = { .free = arm_smmu_sva_domain_free }; +static int arm_smmu_share_asid(struct arm_smmu_device *smmu, + struct arm_smmu_domain *smmu_domain, + struct mm_struct *mm) +{ + struct arm_smmu_domain *old_s1_domain; + int ret; + + if (!(smmu_domain->smmu->features & ARM_SMMU_FEAT_BTM)) + return xa_alloc(&smmu->asid_map, &smmu_domain->cd.asid, + smmu_domain, + XA_LIMIT(1, (1 << smmu->asid_bits) - 1), + GFP_KERNEL); + + /* At this point the caller ensures we have a mmget() */ + smmu_domain->cd.asid = arm64_mm_context_get(mm); + + mutex_lock(&smmu->asid_lock); + old_s1_domain = xa_store(&smmu->asid_map, smmu_domain->cd.asid, + smmu_domain, GFP_KERNEL); + if (xa_err(old_s1_domain)) { + ret = xa_err(old_s1_domain); + goto out_put_asid; + } + + /* + * In BTM mode the CPU ASID and the IOMMU ASID have to be the same. + * Unfortunately we run separate allocators for this and the IOMMU + * ASID can already have been assigned to a S1 domain. SVA domains + * always align to their CPU ASIDs. In this case we change + * the S1 domain's ASID, update the CD entry and flush the caches. + * + * This is a bit tricky, all the places writing to a S1 CD, reading the + * S1 ASID, or doing xa_erase must hold the asid_lock or xa_lock to + * avoid IOTLB incoherence. + */ + if (old_s1_domain) { + if (WARN_ON(old_s1_domain->domain.type == IOMMU_DOMAIN_SVA)) { + ret = -EINVAL; + goto out_restore_s1; + } + ret = arm_smmu_realloc_s1_domain_asid(smmu, old_s1_domain); + if (ret) + goto out_restore_s1; + } + + smmu_domain->btm_invalidation = true; + + ret = 0; + goto out_unlock; + +out_restore_s1: + xa_store(&smmu->asid_map, smmu_domain->cd.asid, old_s1_domain, + GFP_KERNEL); +out_put_asid: + arm64_mm_context_put(mm); +out_unlock: + mutex_unlock(&smmu->asid_lock); + return ret; +} + struct iommu_domain *arm_smmu_sva_domain_alloc(struct device *dev, struct mm_struct *mm) { struct arm_smmu_master *master = dev_iommu_priv_get(dev); struct arm_smmu_device *smmu = master->smmu; struct arm_smmu_domain *smmu_domain; - u32 asid; int ret; smmu_domain = arm_smmu_domain_alloc(); @@ -407,12 +495,10 @@ struct iommu_domain *arm_smmu_sva_domain_alloc(struct device *dev, smmu_domain->domain.ops = &arm_smmu_sva_domain_ops; smmu_domain->smmu = smmu; - ret = xa_alloc(&smmu->asid_map, &asid, smmu_domain, - XA_LIMIT(1, (1 << smmu->asid_bits) - 1), GFP_KERNEL); + ret = arm_smmu_share_asid(smmu, smmu_domain, mm); if (ret) goto err_free; - smmu_domain->cd.asid = asid; smmu_domain->mmu_notifier.ops = &arm_smmu_mmu_notifier_ops; ret = mmu_notifier_register(&smmu_domain->mmu_notifier, mm); if (ret) @@ -422,6 +508,8 @@ struct iommu_domain *arm_smmu_sva_domain_alloc(struct device *dev, err_asid: arm_smmu_domain_free_id(smmu_domain); + if (smmu_domain->btm_invalidation) + arm64_mm_context_put(mm); err_free: kfree(smmu_domain); return ERR_PTR(ret); diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index e9265026fe555b..e784bacc58e098 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -1185,6 +1185,8 @@ void arm_smmu_make_s1_cd(struct arm_smmu_cd *target, typeof(&pgtbl_cfg->arm_lpae_s1_cfg.tcr) tcr = &pgtbl_cfg->arm_lpae_s1_cfg.tcr; + lockdep_assert_held(&master->smmu->asid_lock); + memset(target, 0, sizeof(*target)); target->data[0] = cpu_to_le64( @@ -2002,7 +2004,7 @@ static void arm_smmu_tlb_inv_context(void *cookie) * careful, 007. */ if (smmu_domain->stage == ARM_SMMU_DOMAIN_S1) { - arm_smmu_tlb_inv_asid(smmu, smmu_domain->cd.asid); + arm_smmu_tlb_inv_asid(smmu, READ_ONCE(smmu_domain->cd.asid)); } else { cmd.opcode = CMDQ_OP_TLBI_S12_VMALL; cmd.tlbi.vmid = smmu_domain->s2_cfg.vmid; @@ -2245,17 +2247,10 @@ static void arm_smmu_domain_free(struct iommu_domain *domain) static int arm_smmu_domain_finalise_s1(struct arm_smmu_device *smmu, struct arm_smmu_domain *smmu_domain) { - int ret; - u32 asid; struct arm_smmu_ctx_desc *cd = &smmu_domain->cd; - /* Prevent SVA from modifying the ASID until it is written to the CD */ - mutex_lock(&smmu->asid_lock); - ret = xa_alloc(&smmu->asid_map, &asid, cd, - XA_LIMIT(1, (1 << smmu->asid_bits) - 1), GFP_KERNEL); - cd->asid = (u16)asid; - mutex_unlock(&smmu->asid_lock); - return ret; + return xa_alloc(&smmu->asid_map, &cd->asid, cd, + XA_LIMIT(1, (1 << smmu->asid_bits) - 1), GFP_KERNEL); } static int arm_smmu_domain_finalise_s2(struct arm_smmu_device *smmu, diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h index 8e13fe136f1bbe..28a03bb3d6d3de 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h @@ -586,7 +586,7 @@ struct arm_smmu_strtab_l1_desc { }; struct arm_smmu_ctx_desc { - u16 asid; + u32 asid; }; struct arm_smmu_l1_ctx_desc { From patchwork Wed Oct 11 23:26:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418069 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 847E0CDB47E for ; Wed, 11 Oct 2023 23:27:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=IQsm3RZX1U8ictn/VLC2l8cQWoLTNUDNDTz3xOFDkiY=; b=W9Wu5PQtsUS/Wy 7WCnY0nLuJzltuUg4Lgso+ldR++JQutwOem6wqbvy9leiQloha37C3CFut7Wh9KnLssugSMCbjOvu 0AfTxbfQRA1/caN3kMHOsaCdlvIrtqjYnmR7PXSchSWZ7D81LD0H24Re7S4CrOOYOVoXaoCTOEN5t Bb+SfK/r8t4jY9PE6K2IAeER9qWp2rDHMl/eexpr0htGwe2eKVdK2VpOWUcUkf0lW2FTtpPPDbCrg 3C5hnjYq5Z0dZBojpsaIqEo/cgd1JU3lf+QcWQZGLxghXzMV5haTO4G2wRIKk6OoTvK8QYXwo54Qr TnxffiB3WUtlloidZcig==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqibb-00Gw8o-1H; Wed, 11 Oct 2023 23:27:07 +0000 Received: from mail-dm6nam10on20625.outbound.protection.outlook.com ([2a01:111:f400:7e88::625] helo=NAM10-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqib0-00GvP6-0D for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:34 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=QSUTbj+h7Vqhj7C7XZyEpXUQi9WudwjpaZkOtMGVmc52UqVMPmH6156CwRReCLpO7KsOsRg/r6nVznYC5uJ/8l6K/R0VU6iaC++J4gxONBRZ8fFyuce9S++9gkRpDG6znjnLUbeCcybBxbM0FmAqtEnxzhOeK7sBB2GnkA3ffHGxDYPJNUN1HuK8wddeJj9WHenbyMbJRRkX3yQf4ywR2AUC5se4XnjKjAoxWix/djoZG09JJ7I34XUdbjRdupF315iK1sFwsAaWTwvlfSG0esYwjU0MoS91KjLK/wcu3Jiguyuz1Zju6Twz6H7lRLtdQLua/RWC1Kss0oT4YS5yLQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=D9Ba8EFgAz3T7f8Rk2GuSJtJYbDWq0zmhHgmG2jrXIw=; b=kChLH9bfofovpJ7i9fnO0BIk+7+Z1WIoJ8F8gXIH9lysF9N/HZhjNSbvyJR8Y23r/kaaqcd8l3R1/+2VAsZtCyugTgLDXLGVQXVZZDMac8s5dJzFeqd/yeVL5iqDuX/B7eL6kOKXq0p4XXnaaiZyNF/sRs3ov2zcrQVuGuj+dVR7nOZfB2Euw6895+DMpFFHlxfudekNj01ZEzOWNyw9snYTTXV+7KGNunTnkYWen97VXNfEom7hapZyEA6Wul+MNxjVA2zNNlBOop/aXV+fVd0qxtqc1sdEA/TXV1E8eukz1+NJpnAlV7oZXEDnhNh9+l4fH0B6gwmpHpZmdOMRJg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=D9Ba8EFgAz3T7f8Rk2GuSJtJYbDWq0zmhHgmG2jrXIw=; b=W2jvTBMtQSo7E5WBzZVtuEDvDwdpwUJAGqi9L3BskMXPWdqd+Sy6QzYh5JiXtxVnT81Rt8GTAnnMVsiAjGA4LmE/cypr3Iexi8i2XFUpr29f+9kxwKn1av+jUZjXer1617XZGRmxAEHZ0gOob3hG6uQIRwX7HYhU+LRoLrAjdZdSO/TXCXwJjaq3s9QojmIZRGpDMTl9tM0Q232mWpXbVBiwHxNM43/KKa++JJT4nBhnHQaIf+aA5Nhnp3DazqaspWQ3vcDw0yGNeOxNk/zSuWMox+UwNh/NozpVwVWzl59e8DFIAjWfWPiGDROritvWr4PZhUvVf/6HHxWN0/HMiA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by CH0PR12MB8488.namprd12.prod.outlook.com (2603:10b6:610:18d::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.38; Wed, 11 Oct 2023 23:26:11 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:11 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 25/27] iommu/arm-smmu-v3: Allow IDENTITY/BLOCKED to be set while PASID is used Date: Wed, 11 Oct 2023 20:26:01 -0300 Message-ID: <25-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: MN2PR03CA0026.namprd03.prod.outlook.com (2603:10b6:208:23a::31) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|CH0PR12MB8488:EE_ X-MS-Office365-Filtering-Correlation-Id: 73325c54-c4ec-4c21-9dd2-08dbcab170ad X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ehPoVRn/MnllGOsfKTMlZCQDssS1rh+r61UhSFr9vCFTEOQnbKHsv54p83t3jKE0GfTV/CXOVW1/XFVmNUNeKbKgCrDFPM7Gl9BqndO2JXoLlx6sE8pmuvk/DzFWV9eb4+YQAstUck/cq8wgRMotiVPPc8fbjvou1VtXvVkTpfyhFh8aD8OIfT/2HvTeBsAc1jO271ZGYZt39313hJNBzFvC9OWpz8LiCF+8yjm9+w7bYAsOcvKGou+I+y8i2WfTSbEYlZiB7zpanLfV7yJumcaj2ShgOw/8fz9GNufO06L6ubPAZBxA+RJMTDP7EynCdymyMabc5odt8NI9B81cKAa3blByFvYYmQ37ngJniRi8YzuKR7mwFBNdNR72UB1Z8bOEtvERVpWVF74TaMxU/z3/ZONIS9ZidIsUzdkcDkEZdaQO8cKfK7ro0XBaFczCQd1+95Ttj+gNHpzNqEfe+flpaq4F02+VZzK1OWuuxEjnse1eyqeqHl9WRtTAWEdhTrVEjUSVSoA+xqemXvYBGkPM4vCaIzx9YieKt4B2/Xi5RlQpKed+z3Pa1lL9JtshyC5h9UwWMAbRdvBNHcIEctxnTgjJSxZYroeuhMmJQno4SekLrUUnJAohsgcC6GpAdkNhbjqC5ZoY1bRh59VwiA== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(366004)(396003)(39860400002)(376002)(346002)(136003)(230922051799003)(1800799009)(451199024)(64100799003)(186009)(66476007)(66556008)(8936002)(66946007)(316002)(54906003)(110136005)(2906002)(5660300002)(41300700001)(8676002)(4326008)(6486002)(38100700002)(2616005)(6666004)(107886003)(15650500001)(36756003)(26005)(6512007)(83380400001)(478600001)(86362001)(6506007)(414714003)(473944003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: ylxL0b3JDFJ8Tz1TRaimxU08XabwIFO7jWXtG83TVNtX1HGsXgBePAQEkhN3xAfu2NqDkPXHKUcXNwBriv1Psl0x172g0QlT6H6zZ4y+kCs12IrGrPXLzj75H6+kC1hQ1sWLqVapyBJEKp4dJs/H7rgyB4jGQtCPHxpe9idmxx/ztwU8Mo71USvUkUdqB/iGUtb7nJVFqO/mRY9sm5HK/duUXflUNaRMoass5XLPcNKwFjBx/ZcU9IJrEJt/On8zK2ZNrKsurZlAogbhfHhc5dLAeouBmgPp1a9HRSpVHSPS2/jR/f8ganEuUxfPGqgBWO+Fr1OYPKIv21kWxGb1Jz2oV2hzaJHOELJqNt2ZAFPwN/HDmkncWGIDtQw/BDwUR6c7QhjV9ukbgX9F6EPY9JsNu38WNhS/f0SaAUFDgKKXF9yfhbjhLstPCMjQdu+DWiUTXX3BDdaqb0L4efYnqlxbMgnji7FuvN1N8wZY/Z5MYOQX2kINhxAGUWVWj8b+34nyT3uqD2Edv33v39c5ce5nNrovAH5FLG4Ay+ZWDWSB4JceLixZvg15NLzkDg3hiAuYLZdLkafkgC86VuPKclnWo6yM9Sia/ZeExGMYSRYSSV4tK4n9SDXRLdC8213vg7dwfHkMym2BJjpybPzn56GGGHjg0n0kixduKhaVzAu06IViYYcQ6qRgUQj2RfXKHDCB1B8ncOOcoFFecP6Uiabf3iUJuu0CYrSBEca7Gf14+9V/UtnQASS1gsml5l4tfExAUTWb4ffItBfm21Fh1z0k9P8UAPr97f3DhKKcXvV3tMKEOC9BUUxhdiPW/f7HPpFUzhAA3AWk1cpyAA/2s3bY2lwIWJ6fYXlonEILilUsF2S7M2J3XeaoIny1zNvPshfO2oUHUqGJffqJEdTDtWOlZhsXGALAvI3THX/UfdpO57dSLhlFJGvGlvRjSjKpPvQWoYUxkDYPVq7efEE55godPWzldgQVC1H0LQqf3+Zcb1lifcyE5mBXjx0zYenP1c0IWudHtTNM3+RAmuCHc46+fBuVNY7wAzpiUswmM4kcNWIpoqBv/Tz9MB5mek3D/5Fnt/ShUkjcN9mQMFPMG9C2xawyYUo8psmXnwnB7Tm8lY6aYS2ORYil29SyQ2+5cGGVeHMtSW/JO+X5z41iux4cBXioMHWJNUl8iHtHnD2e87IOOqVcExq1ZwdZLMLLTjxUC+5amMi+ccN9crn52eG/ltGS0ZbseFvqE/fiiLryt50UFr7BRwJztPRhiDo7XrBQuuqK6EBtVIKgIWqE7Y3TdISng44j0Elf7EeoLTNpXVDydgpCwQag1ZNn99B0TZBvUxmI9QnlUSPPc9dlj4i+22ImObuHFdmqW00pDoyzgQ0ozp6dpmn8Zt9o+1l9nSLzYYNZxPHfShgaRUb3bFODygg5IraRJ1VoyJAKSeAyvCopD9wJY7Ulb8cNacyZoqRRvKxmQqZ1Rx0mwf06vNoGdGxpWMYgsxs/eyS0IRKPNXOM4hvmWXUxFVskYqil1uvzJlBBfOgrWZhoGXWSat6nhIziBV6S8qnYixlAojwbYkG7aB2dHO+IPA71lpT8 X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 73325c54-c4ec-4c21-9dd2-08dbcab170ad X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:05.2493 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Wvtx+zKTiZl4/wcRv4MErFEVG1A9JR/mPcMeylDKqXUlGGWQkEg93sgtY2qi3J9X X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH0PR12MB8488 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162630_140695_BF4620BA X-CRM114-Status: GOOD ( 22.96 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org The HW supports this, use the S1DSS bits to configure the behavior of SSID=0 which is the RID's translation. If SSID's are currently being used in the CD table then just update the S1DSS bits in the STE, remove the master_domain and leave ATS alone. For iommufd the SMMUv3 HW has a small problem that once a CD table is installed there is no way to abort transactions (either for untagged with PASID or for PASID tagged) in a way that doesn't generate an event. This means VFIO userspace and VM can flood the driver with advisory events. For BLOCKED the F_STREAM_DISABLED (STRTAB_STE_1_S1DSS_TERMINATE) event is generated on untagged traffic and a substream CD table entry with V=0 (removed pasid) will generate C_BAD_CD. As we don't yet support PASID in iommufd this is a problem to resolve later. Signed-off-by: Jason Gunthorpe --- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 62 +++++++++++++-------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index e784bacc58e098..83d288fef51249 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -1460,7 +1460,7 @@ static void arm_smmu_make_bypass_ste(struct arm_smmu_ste *target) static void arm_smmu_make_cdtable_ste(struct arm_smmu_ste *target, struct arm_smmu_master *master, struct arm_smmu_ctx_desc_cfg *cd_table, - bool ats_enabled) + bool ats_enabled, unsigned int s1dss) { struct arm_smmu_device *smmu = master->smmu; @@ -1473,7 +1473,7 @@ static void arm_smmu_make_cdtable_ste(struct arm_smmu_ste *target, FIELD_PREP(STRTAB_STE_0_S1CDMAX, cd_table->s1cdmax)); target->data[1] = cpu_to_le64( - FIELD_PREP(STRTAB_STE_1_S1DSS, STRTAB_STE_1_S1DSS_SSID0) | + FIELD_PREP(STRTAB_STE_1_S1DSS, s1dss) | FIELD_PREP(STRTAB_STE_1_S1CIR, STRTAB_STE_1_S1C_CACHE_WBRA) | FIELD_PREP(STRTAB_STE_1_S1COR, STRTAB_STE_1_S1C_CACHE_WBRA) | FIELD_PREP(STRTAB_STE_1_S1CSH, ARM_SMMU_SH_ISH) | @@ -1486,7 +1486,11 @@ static void arm_smmu_make_cdtable_ste(struct arm_smmu_ste *target, FIELD_PREP(STRTAB_STE_1_STRW, (smmu->features & ARM_SMMU_FEAT_E2H) ? STRTAB_STE_1_STRW_EL2 : - STRTAB_STE_1_STRW_NSEL1)); + STRTAB_STE_1_STRW_NSEL1) | + FIELD_PREP(STRTAB_STE_1_SHCFG, + s1dss == STRTAB_STE_1_S1DSS_BYPASS ? + STRTAB_STE_1_SHCFG_INCOMING : + 0)); } static void arm_smmu_make_s2_domain_ste(struct arm_smmu_ste *target, @@ -2477,6 +2481,10 @@ static void arm_smmu_remove_master_domain(struct arm_smmu_master *master, struct arm_smmu_master_domain *master_domain; unsigned long flags; + /* NULL means the old domain is IDENTITY/BLOCKED which we don't track */ + if (!smmu_domain) + return; + spin_lock_irqsave(&smmu_domain->devices_lock, flags); master_domain = arm_smmu_find_master_domain(smmu_domain, master, ssid); if (master_domain) { @@ -2589,10 +2597,7 @@ static void arm_smmu_attach_remove(struct arm_smmu_master *master, struct arm_smmu_domain *smmu_domain, ioasid_t ssid) { - if (!smmu_domain) - return; - - if (ssid == IOMMU_NO_PASID && master->ats_enabled) { + if (master->ats_enabled) { pci_disable_ats(to_pci_dev(master->dev)); /* * Ensure ATS is disabled at the endpoint before we issue the @@ -2604,8 +2609,7 @@ static void arm_smmu_attach_remove(struct arm_smmu_master *master, arm_smmu_remove_master_domain(master, smmu_domain, ssid); - if (ssid == IOMMU_NO_PASID) - master->ats_enabled = false; + master->ats_enabled = false; } static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) @@ -2666,7 +2670,8 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) arm_smmu_write_cd_entry(master, IOMMU_NO_PASID, cdptr, &target_cd); arm_smmu_make_cdtable_ste(&target, master, &master->cd_table, - state.want_ats); + state.want_ats, + STRTAB_STE_1_S1DSS_SSID0); arm_smmu_install_ste_for_dev(master, &target); break; } @@ -2736,18 +2741,18 @@ static void arm_smmu_remove_dev_pasid(struct device *dev, ioasid_t pasid) smmu_domain = to_smmu_domain(domain); mutex_lock(&master->smmu->asid_lock); - arm_smmu_attach_remove(master, smmu_domain, pasid); + arm_smmu_remove_master_domain(master, smmu_domain, pasid); arm_smmu_clear_cd(master, pasid); mutex_unlock(&master->smmu->asid_lock); } -static int arm_smmu_attach_dev_ste(struct device *dev, - struct arm_smmu_ste *ste) +static void arm_smmu_attach_dev_ste(struct device *dev, + struct arm_smmu_ste *ste, + unsigned int s1dss) { struct arm_smmu_master *master = dev_iommu_priv_get(dev); - - if (arm_smmu_ssids_in_use(&master->cd_table)) - return -EBUSY; + struct arm_smmu_domain *old_domain = + to_smmu_domain_safe(iommu_get_domain_for_dev(master->dev)); /* * Do not allow any ASID to be changed while are working on the STE, @@ -2755,6 +2760,19 @@ static int arm_smmu_attach_dev_ste(struct device *dev, */ mutex_lock(&master->smmu->asid_lock); + /* + * If the CD table is still in use then we need to keep it installed and + * use the S1DSS to change the mode. + */ + if (arm_smmu_ssids_in_use(&master->cd_table)) { + arm_smmu_make_cdtable_ste(ste, master, &master->cd_table, + master->ats_enabled, s1dss); + arm_smmu_remove_master_domain(master, old_domain, + IOMMU_NO_PASID); + } else { + arm_smmu_attach_remove(master, old_domain, IOMMU_NO_PASID); + } + /* * The SMMU does not support enabling ATS with bypass/abort. When the * STE is in bypass (STE.Config[2:0] == 0b100), ATS Translation Requests @@ -2762,11 +2780,6 @@ static int arm_smmu_attach_dev_ste(struct device *dev, * the stream (STE.EATS == 0b00), causing F_BAD_ATS_TREQ and * F_TRANSL_FORBIDDEN events (IHI0070Ea 5.2 Stream Table Entry). */ - arm_smmu_attach_remove( - master, - to_smmu_domain_safe(iommu_get_domain_for_dev(master->dev)), - IOMMU_NO_PASID); - arm_smmu_install_ste_for_dev(master, ste); mutex_unlock(&master->smmu->asid_lock); @@ -2776,7 +2789,6 @@ static int arm_smmu_attach_dev_ste(struct device *dev, * descriptor from arm_smmu_share_asid(). */ arm_smmu_clear_cd(master, IOMMU_NO_PASID); - return 0; } static int arm_smmu_attach_dev_identity(struct iommu_domain *domain, @@ -2785,7 +2797,8 @@ static int arm_smmu_attach_dev_identity(struct iommu_domain *domain, struct arm_smmu_ste ste; arm_smmu_make_bypass_ste(&ste); - return arm_smmu_attach_dev_ste(dev, &ste); + arm_smmu_attach_dev_ste(dev, &ste, STRTAB_STE_1_S1DSS_BYPASS); + return 0; } static const struct iommu_domain_ops arm_smmu_identity_ops = { @@ -2803,7 +2816,8 @@ static int arm_smmu_attach_dev_blocked(struct iommu_domain *domain, struct arm_smmu_ste ste; arm_smmu_make_abort_ste(&ste); - return arm_smmu_attach_dev_ste(dev, &ste); + arm_smmu_attach_dev_ste(dev, &ste, STRTAB_STE_1_S1DSS_TERMINATE); + return 0; } static const struct iommu_domain_ops arm_smmu_blocked_ops = { From patchwork Wed Oct 11 23:26:02 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418073 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 2B6F8CDB46E for ; Wed, 11 Oct 2023 23:28:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=QmvSLgPgZNHwI58kEhVFRdg0S76V5rrOhsWIR1C86tQ=; b=48b5qp6IJf2Fjk wrerK5eSIDpq5eXZ9qPAu/157EOW1lU5AiOpEb7OyfOBW91hF5OUigmM62iTH2wH0BKlrB5+CeSlV XVLBTApECbAaN2TM52x5YoRpK2utPCj1Hr8UWObEsdxhIB6GoCZw+w+X5kUqxx6SP9g80HaD1GyOW I2+/Xl4eXGwqZLIVI2xKo3yE1pVO5CzKMri7DNTd24YrQu4hJA8OBipEQ8hmM27RoWjwunpn5xYJG JWzAZtfcRpPi2QyL9DXh5peDHwbzcSTPbNrYuIy00ttJfb25o8TNE+BpSOOqkaTFfnasqyelrlLHb 9SIw2sIbO8ypF6IWbIiw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqicC-00GwdN-1o; Wed, 11 Oct 2023 23:27:44 +0000 Received: from mail-dm6nam04on20620.outbound.protection.outlook.com ([2a01:111:f400:7e8b::620] helo=NAM04-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqib3-00GvSY-1W for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:38 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=NkL1fTlCvDOH6JGnNMetMUhi+enVtASE+2ImVqiY0gL/HgqeadZ8/HmDT7VbNm/iJpGm1xkKf8WBVSJ0YZzyMj3pPl6zE1jmhRewywBhIROnVlJ2WhwyGvqPysYwdmwmkjCyRPQORONGb8IXWACU5F+N31T2FdCfNYIExoA/22v4v9ge4PI8HrYcqqZ5B6TCByDTOeovQaFcAQ84SjmW/tqumVneHx01uV/XxIt3qELOEd8t5J+f215PZGkzRJtFv1tpJw4rXENDlSTiHRIC8F7aUNxDSsVY/KP84p01VDfKrEAZwebg74ro80lkc9eTE0ng/b6mwl0jEulGu21/Eg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=B9K478hMNK5IVtmpvvYY/RvphbbkNHSj0cPowTvj9dQ=; b=SEUAKN0NQuPwjHP3xaKbudMkFhRDmneLeS2fQG+ED/UZYXLjt/muBhiXpLyTRXRp3JgE7Yv4Dl+LqNGGXKkE0saQKHjw3JaqvxgY2w2Cj1jk9NJVCLUssbnLyP+gg9dF+d8HBh32nSygFVb5Y+U2CiSkM6SwI0NRUI7pMTMzq58P1xQE4vn5L19Eioa/YvlFAPzymVL+N+iCkgIT3jqby3b/k4CfZzJb9ebXpHobmAwxtxS7yFfThUpaYRl+A6LqgBdsNjb1i8c9Z51Ydukq6xWIjHt1viM0sseokXSNyGiC1iFEHaTQuLpLUiwxgLQ7ZdL/ivFywzoDoTikT0Xh9w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=B9K478hMNK5IVtmpvvYY/RvphbbkNHSj0cPowTvj9dQ=; b=W/XaXrkeeORn4OlcyhbelfKXWcI977aS/esVMrNgWVxDvG5JCtp+qd25hU7CcDQs6y8vksm3/UHBapAnmd0yJm0hZi6FW1M4DFnzjXMD/ubXAz0i7s5h74UEB92jx8GNYwPEsJKlhb/W0ax/XWKnz+IwqVBrTkg6gPGeo9HbyMsC+E6VIn7f1BWyDCP4L/nTVcriUpvU4i16GamxI+GaMNLV/5h/cLaWs8891gkwgsazmh6x5s4JV4RErpoh3PuUWSAOcEms39CHUnP5gRHWik8dtsBT9UMejRQNLHn80veouAHgdzdcWKBqtId+ZRDemPvnwvkSlfCFkiYvIvbmJg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by PH7PR12MB7380.namprd12.prod.outlook.com (2603:10b6:510:20f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6838.31; Wed, 11 Oct 2023 23:26:15 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:15 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 26/27] iommu/arm-smmu-v3: Allow a PASID to be set when RID is IDENTITY/BLOCKED Date: Wed, 11 Oct 2023 20:26:02 -0300 Message-ID: <26-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: MN2PR20CA0044.namprd20.prod.outlook.com (2603:10b6:208:235::13) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|PH7PR12MB7380:EE_ X-MS-Office365-Filtering-Correlation-Id: d6525e01-d0b2-4e23-e26e-08dbcab17118 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: yRGZTrTMK+8K8AEj/enCWSeJ6FMuvz8IAEcceKAaLU0SxJ5gA/ZLVbkLtqsyB9hvIRpj6nxeCFhKPYoMfuhSObADVZyuVFvsHQ1xhBIwJa0tUa13ocnQzhIiaIigp1UIxDYQhMoCr2QrMke4B9peRnYC/eOIersKoHfa1X5Llrz2+q6iLcY0yhJxQ0Yh+8X6p4CUeOEO++ZATNE8k8R2Uq97T/rEXHnjE8kOZxuzGzAach3Ztlwa10VQ9Kt8RufmoznwY4bAuyIuWQeoV9pMuKt9eLWwnjKnNWy1psQbmoSKQMGahgwKcT6y2zMu4QTr2fuiKyBCgweDP+n8L6zGRfdfBgnhW56A6TRsGQiMZ4EO4rD1m3tIkj2xn8MlujeRsMEKuo/Su2+NfBiJOrAI19VVFXDZ70VfpDkEI+eC+Rhcfo0wTjVYP6qW57p15VWtGsdPdm/00ZPXtIuNd6Nnf05EYWqB3/74IepLh4TM3q3uAaLDJ8fqwHQyILnnpjKJnN/HeTC0S5DXIB51vW6krpKss7ZHGGq/dIp8BNmYOkD8Qd00tvdkkRSVk0708zsY+PvGRnJg1gx2IBElTfY3yYHBIBaYRl07xI7dN2Q+RzmDaZveEEeCwM6RCNCGkehiwzZom0apYy0Fbv9u8Y4N6g== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(39860400002)(396003)(346002)(376002)(366004)(136003)(230922051799003)(451199024)(64100799003)(1800799009)(186009)(36756003)(6512007)(6506007)(8676002)(2616005)(83380400001)(26005)(107886003)(15650500001)(6486002)(6666004)(478600001)(38100700002)(4326008)(86362001)(41300700001)(66556008)(8936002)(316002)(2906002)(66476007)(110136005)(66946007)(54906003)(5660300002)(414714003)(473944003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: gidhfiap+Y9BmyxcZAIrhELti2GmKqFPDhnc2JuzPaeEzDRbaZGkyt50V/1aOyT2z7U4Uom0+CaIX/nlLbnwBuKa5vx0mwWLqAjouC6fWjSdpT8WYRzpaUEZg5wSbf8Igf8syybPnDNfUPNcQG9kl39yZaGWlb4tOlJE1fgpw4uX9ZpdQ7SovogqZeA2Z2ms9BFXxQII3LxtHOSNXWIU58j/hbbAgNWGRfNQg4FPRQKIgfiOa1Rbw5A77B+80llgDnZfa7LnVaAU6Z5i5kU5u8yluiva6l4Y9ExMXuGadCkUUHY7cVcSw8Tdz+AOaZS6/cRIlN5WLiyuiVAqoplVl1jHaeB58pp5X+Elj/BMaE+f32RSgzNeEWoslYpjKQy6dL3NMGnsHo687lh6EL/0NHXrbYaCk0EyhiEl0Glmv5p2jBagSS140WbAVNRX3qUIhx0qko26pfEL6yyVjTguvlXeHGEh9db+3Wi5CbXHLyv7D1ssib/k89jIn+i9+frfU5zH++TfUju5bqlVMCBul5hF0JzWotm7gzrfi2KPwBp+G6iYatQy8LHI3Ktc1k5w3PgiRRyEF4n+iX7kxOdhlW+P+Ap3fzICVQvJCGTiRs2T9OtCiC+95BLHqRfYmIiyo6RJfnju8sBcTTWvj4qp6WFi0jW7RZxBnxPjRtXs0tTVM9JlodDZG3dz0V7rgsc70Zh6t/tITQCLvUuygp8OAJs7GgjugpS4wHQJnkAMZ1f21r6Nm7i1Io1kx/bX7mTKOAcgGxstD6V8P9YoMWG6jM9ZxAcqbZFBrCHBvGbJgAbfK7Av1dI3uaPIIuGWIbsIkk816RHY5X9K8TgNv/CS4T54YYI33vxq4PIBa1nhA2Uiian9qIZWZIVbu9AL1Cpw3NxSxaMl42qozJnBQHntmpb8CGoqx9tLDyq3dEbFmLpzyK+KznV47tGFYqzbCvMUq10lEwLRWuZTFTXFDTEbIE4OrzIPyBlPXXSLfb6tu2PsYit8V/ZbLDb00+r+bAR/UdMUiw3nNYEvC2xBKLr6L2a+BVBkh/8zPumQQPIDuw/D00pRxjAA25zdETt0GSWm5Ltacb4Zt6Dl6ewH5NVbhNx3yxMPWHnrql35d5zs1Zat8LD/lBF3+ZPN0iEv0/yGVUI+k3kBWDmbBwy0gs4C6YUQIWDaIfMO+RdQVy+cRfFbDjf1P20Cg5A6wQM/Psxoind6qzyQGofZ27QtAAbvsFlJ4jiSEkNJywDsiNdOIxXhHDZg2mqdXN4J9bPGDuLzXJNh6waTskvnNIg1D4RJbskWuZ3CJHm+kxD/fnWRNyAfXexdlIlIr74Nmkjuy9Gm4gMgsdWPIGBNvJRPCCyWlcNJa8rum4lY3ThSk7phIEKDEMQKBNFswS9bW4n6tg7UGGEsmqgWgNgWQc9G5XFau3EEmCNEnkkA28SQUVlrvVdaPVM+Klxf6IsQbSfSweYVXqUHu3f3KMwaH1rPMANYVUNbcvDKwbu+NAgAgxJOgzy9TlV+R09BSR+UBpP18OqSjXdAYQ21JjQdTgzCETLdz/flNmjH9AoeKz605jNX3NS6SxRP7u7tnQwHe53D0h0s X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: d6525e01-d0b2-4e23-e26e-08dbcab17118 X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:05.9314 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: tRO+TVc6mTnSF2Ms9VK9bjfl62pTpe4fOIu3cK+YS26GpHROJHXFpgzgkm7L+GaT X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB7380 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162633_569355_C9AFD26C X-CRM114-Status: GOOD ( 21.74 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org If the STE doesn't point to the CD table we can upgrade it by reprogramming the STE with the appropriate S1DSS. We may also need to turn on ATS at the same time. Keep track if the installed STE is pointing at the cd_table and the ATS state to trigger this path. Signed-off-by: Jason Gunthorpe --- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 57 +++++++++++++++++++-- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 6 ++- 2 files changed, 56 insertions(+), 7 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index 83d288fef51249..8eef125018d082 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -2360,6 +2360,13 @@ static void arm_smmu_install_ste_for_dev(struct arm_smmu_master *master, int i, j; struct arm_smmu_device *smmu = master->smmu; + master->cd_table.in_ste = + FIELD_GET(STRTAB_STE_0_CFG, le64_to_cpu(target->data[0])) == + STRTAB_STE_0_CFG_S1_TRANS; + master->ste_ats_enabled = + FIELD_GET(STRTAB_STE_1_EATS, le64_to_cpu(target->data[1])) == + STRTAB_STE_1_EATS_TRANS; + for (i = 0; i < master->num_streams; ++i) { u32 sid = master->streams[i].id; struct arm_smmu_ste *step = @@ -2690,21 +2697,48 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) return 0; } +static void arm_smmu_update_ste(struct arm_smmu_master *master, + struct iommu_domain *sid_domain, + bool want_ats) +{ + unsigned int s1dss = STRTAB_STE_1_S1DSS_TERMINATE; + struct arm_smmu_ste ste; + + if (master->cd_table.in_ste && master->ste_ats_enabled == want_ats) + return; + + if (sid_domain->type == IOMMU_DOMAIN_IDENTITY) + s1dss = STRTAB_STE_1_S1DSS_BYPASS; + else + WARN_ON(sid_domain->type != IOMMU_DOMAIN_BLOCKED); + + /* + * Change the STE into a cdtable one with SID IDENTITY/BLOCKED behavior + * using s1dss if necessary. The cd_table is already installed then + * the S1DSS is correct and this will just update the EATS. Otherwise + * it installs the entire thing. This will be hitless. + */ + arm_smmu_make_cdtable_ste(&ste, master, &master->cd_table, want_ats, + s1dss); + arm_smmu_install_ste_for_dev(master, &ste); +} + int arm_smmu_set_pasid(struct arm_smmu_master *master, struct arm_smmu_domain *smmu_domain, ioasid_t id, const struct arm_smmu_cd *cd) { - struct arm_smmu_domain *old_smmu_domain = - to_smmu_domain_safe(iommu_get_domain_for_dev(master->dev)); + struct iommu_domain *sid_domain = iommu_get_domain_for_dev(master->dev); struct arm_smmu_cd *cdptr; struct attach_state state; int ret; - if (smmu_domain->smmu != master->smmu) + if (smmu_domain->smmu != master->smmu || id == IOMMU_NO_PASID) return -EINVAL; - if (!old_smmu_domain || !master->cd_table.used_sid) - return -ENODEV; + if (!master->cd_table.in_ste && + sid_domain->type != IOMMU_DOMAIN_IDENTITY && + sid_domain->type != IOMMU_DOMAIN_BLOCKED) + return -EINVAL; cdptr = arm_smmu_get_cd_ptr(master, id); if (!cdptr) @@ -2716,6 +2750,7 @@ int arm_smmu_set_pasid(struct arm_smmu_master *master, goto out_unlock; arm_smmu_write_cd_entry(master, id, cdptr, cd); + arm_smmu_update_ste(master, sid_domain, state.want_ats); arm_smmu_attach_commit( master, @@ -2733,6 +2768,7 @@ static void arm_smmu_remove_dev_pasid(struct device *dev, ioasid_t pasid) struct arm_smmu_master *master = dev_iommu_priv_get(dev); struct arm_smmu_domain *smmu_domain; struct iommu_domain *domain; + bool last_ssid = master->cd_table.used_ssids == 1; domain = iommu_get_domain_for_dev_pasid(dev, pasid, IOMMU_DOMAIN_SVA); if (WARN_ON(IS_ERR(domain)) || !domain) @@ -2744,6 +2780,17 @@ static void arm_smmu_remove_dev_pasid(struct device *dev, ioasid_t pasid) arm_smmu_remove_master_domain(master, smmu_domain, pasid); arm_smmu_clear_cd(master, pasid); mutex_unlock(&master->smmu->asid_lock); + + /* + * When the last user of the CD table goes away downgrade the STE back + * to a non-cd_table one. + */ + if (last_ssid && !master->cd_table.used_sid) { + struct iommu_domain *sid_domain = + iommu_get_domain_for_dev(master->dev); + + sid_domain->ops->attach_dev(sid_domain, master->dev); + } } static void arm_smmu_attach_dev_ste(struct device *dev, diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h index 28a03bb3d6d3de..5cb3b602b6baf2 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h @@ -600,7 +600,8 @@ struct arm_smmu_ctx_desc_cfg { struct arm_smmu_l1_ctx_desc *l1_desc; unsigned int num_l1_ents; unsigned int used_ssids; - bool used_sid; + u8 used_sid; + u8 in_ste; u8 s1fmt; /* log2 of the maximum number of CDs supported by this table */ u8 s1cdmax; @@ -708,7 +709,8 @@ struct arm_smmu_master { /* Locked by the iommu core using the group mutex */ struct arm_smmu_ctx_desc_cfg cd_table; unsigned int num_streams; - bool ats_enabled; + bool ats_enabled : 1; + bool ste_ats_enabled : 1; bool stall_enabled; bool sva_enabled; bool iopf_enabled; From patchwork Wed Oct 11 23:26:03 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 13418070 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 0098ACDB465 for ; Wed, 11 Oct 2023 23:27:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=fgkzJVa89sm7ImdReyQVyyHNr5MLT3AiOp0jR0Trdlo=; b=tbzzAsY/xBpZC/ lbFdMlAKv9YUOYyQ/uYtHJAMzca7zs40koADM26wsKFZUUbNMgSpQt7rVth30Zeq/oIPhFwv2hIKR /dKvN4HYDnbM1wo3U3Nfd3gldprq5MBAt11nDTwkB96b1L8KgOF6Jn2mlcWhCSab/lZIClyneybmk IO1Rk1iLF01KTkQGhnudVC2pVjnBXV5gR3aMCVFdAdV4LHKOjm4X29oKwq1e/RSvwZo3qrxRKYwoo 0v+S6NlZeuWaCarglSDqdwlggTeKcHfLsMX6g1iA3XfzO6VPc66QrDFpT7W5dUT4/9vsngVR0O/gY Vx2Eh/mS74tuUTfhNmdw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qqibV-00Gw3t-0t; Wed, 11 Oct 2023 23:27:01 +0000 Received: from mail-dm6nam04on20620.outbound.protection.outlook.com ([2a01:111:f400:7e8b::620] helo=NAM04-DM6-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qqiaz-00GvSY-1X for linux-arm-kernel@lists.infradead.org; Wed, 11 Oct 2023 23:26:33 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=hvRavoyKbixAedMrv3oVb4OFmizgPtezO3IdJX4Kdhv6n57E89g+r9iGOqVtbDZ9Ataj05JKAbCCfYFm3UB84bfz/XBZ2WgBMAPMuOgGWlYl+lj9cSO7U/xytFnhmMMm/gb+ecMsICoLBDkusYGDmzHzISGi9LBJI1hGDwrleao4WHaojcIn07T5xcPoj9qsRrBjGb/AvKOtlzvRLTYICKWLHPAT959qr9rGCy0Wq9qcdsZXwGwOiUsOJATh7jWVCZ/2EmLddvyrysCqcHtjpFIYEoytoFzIDFyzB9iOskam+duuIuWl7jDPjXvnubyDTry1qVNiQdrVG9UKIHaepw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=+U01yDV1v0DoFTSuNI2hRHNv0TDMvrohaeDJAbWVkwM=; b=Yg19XNYwRVDxYXYBGQGVNP+icujRrY/VkigM54//Yrrw36dZiRvlAhb4tJ0ivdl9UHgMPvRNIT5rUzLcgenK2jgGOwbQYkrXhSTYogtAxTzoEfWmuNgIBYSSMLR8hnWM06C5SodNk6kiCOR3jYssDRh1GCqVp/EMr7NYK/jnQdOkwbqM1l+EUGPyxPIuQuFLmYHfmpxGFZOlUZUjhT91LqfsHDIf4sB7Ic74eIYrAzvRW1Ki/f8SVui/T68BCtRrvc2s9mesURB2KeN/aYRnlcAjwipastwUA1MLZWLRrFNT8G8xJz6wZk51siSjgd7O+gOThfv9Ivj9+RAHfJ140w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=+U01yDV1v0DoFTSuNI2hRHNv0TDMvrohaeDJAbWVkwM=; b=i9OoIAGAv9eyET2MZwoJ4RrFLD4QoXhDg9NvAIuh28xpU1kLHoWSN9b5T8hkQCeFK0OlL0NO6MIfqnTRJMoJFBjW4gEc5jcg0c9HT0UzOZGmNOt7keghVzNOKihSYSPMu4j9ZecKO5+eRwE5xZqrC3jhtPN5XqKIbl1+BxW49j9TgEb5Cu83xO/yXagD9GPLu5RgtB+1jo1PkSOFAiPbyOybMqfVGoeZd+YmsgUWdR0kj1oE1QB3fOrOx/gsdIUkXM84qTJ+OcGgGJVg93E/e6MX2YRVnGYoHszfULL3x6Wyub29JILEuzjADJfelqBn4whZ6RNyHHwKWRU+erbzMQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) by PH7PR12MB7380.namprd12.prod.outlook.com (2603:10b6:510:20f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6838.31; Wed, 11 Oct 2023 23:26:14 +0000 Received: from LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2]) by LV2PR12MB5869.namprd12.prod.outlook.com ([fe80::3f66:c2b6:59eb:78c2%6]) with mapi id 15.20.6863.032; Wed, 11 Oct 2023 23:26:14 +0000 From: Jason Gunthorpe To: iommu@lists.linux.dev, Joerg Roedel , linux-arm-kernel@lists.infradead.org, Robin Murphy , Will Deacon Cc: Jean-Philippe Brucker , Michael Shavit , Nicolin Chen Subject: [PATCH 27/27] iommu/arm-smmu-v3: Allow setting a S1 domain to a PASID Date: Wed, 11 Oct 2023 20:26:03 -0300 Message-ID: <27-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> In-Reply-To: <0-v1-afbb86647bbd+5-smmuv3_newapi_p2_jgg@nvidia.com> References: X-ClientProxiedBy: BL1PR13CA0009.namprd13.prod.outlook.com (2603:10b6:208:256::14) To LV2PR12MB5869.namprd12.prod.outlook.com (2603:10b6:408:176::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV2PR12MB5869:EE_|PH7PR12MB7380:EE_ X-MS-Office365-Filtering-Correlation-Id: 2c7724bd-745a-43f8-9506-08dbcab1710a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: b3G2BYsPjFRHEd67eQN9vuyDb1L1XRj8dLxAUIyc582SlGh8CuUsvHd4kQ4fV0a2l9kMLNhYesQJgaVWfsjd0L9rSw7V0CxBu6GiNi+nVusp9fxq3QwWbibyzO9TlIf6eENeteGniflTTPQUuO1HJTKJquWCdViJUsfEtpCJ26vUmjXsHs2EYInhOFlF5ILce8x7M918aJ8qe8WJ+Wgi/dkyRU4HS3/dpBFksYrcW7JHF0FPVk8yRqQ+F9AEtPDvZ7QIPzpgjT04O7ZOqb1hEkJyx53e085CxW1a6r5Fmt9LMtNsUemNgd7PoAyXajodOwE1L/SKz6PXohg9+3GXp4SmZ4E2PJi/NGpv+14fHVCDgaKqJ+HDOHAr/t3IcGKDyI5ElaDk4vTdhrENFmgADZl/BXu3L4bcjYApqgZxVZ0oLB0Ia+w9jj7lCQy2RX+pClsei4ZPPWlS7yrB3vOscKzeQK6dQXymsFXkcEbcPIvwrxRtCGgvuZvtRTjaMLzuNiIsJBE7spuOB/oZIVdZacYqZM1645QhG6g6Ne/1qen5jJkIUo9bp3WhS/aordxQ X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LV2PR12MB5869.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(39860400002)(396003)(346002)(376002)(366004)(136003)(230922051799003)(451199024)(64100799003)(1800799009)(186009)(36756003)(6512007)(6506007)(8676002)(2616005)(83380400001)(26005)(107886003)(6486002)(6666004)(478600001)(38100700002)(4326008)(86362001)(41300700001)(66556008)(8936002)(316002)(2906002)(66476007)(110136005)(66946007)(54906003)(5660300002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: DkNHyKm9X7lfcmx8/REPEha8PHH80lNkcTBAZOilJEOBnS2eg20bWxmj3knduuobC72CTD2KZq29OP2YUX43AkkANLRbZv4oKZCnwY+nyg+bstUWqHmUuqGPh7TRjinxDf8LXwqVDvBFb5akG4bLeG1g+5zvCCNMKgdfHSEAdHaJj1L7eOR190isMdDiWJ4uO8ltBHKcNXaAjk5mUbg9nYl8wXJtdmSUNT/93fQsKMCtqe902/dS/99I2QtkX2elMHioeGagL9XpIjXmM+DOnE9RAsyvSn87p612aDh/cHFRY5X96fHFL28MQERQpDuRXJ3kWK9Z7+cg6osNV1CTX6Gw+oFoQ/KyaRUCllWZy9o68RAvgRBNJqk2WgxVAKZXb90jYiVUTjUfy9yVlpL9rLp5UEuaaM12tIcWxJeyKw4lODToDcSKZ4soEMwY/Ijcyk0qQ/KxKTMMZotG/SdF40qISLfUmsFZ736GFmVmSUsKJjNFWjGp7p3tsuoFd3DH5hV0biE9kmZS38rEa3F2QxwK5l1BTnxoswJMEnUtuYO2hjBEf2B2321irz9J5936yP1L7rR++ivmkDrnvFZBpCCqzpnynYS5L2kAf6HXkxgBWWs2+CzVGcA1lZV7G7tILEe3h3GD1Bm4EVt/jPB+PI/r/i0E5HhQlmU97vMAAdtF7ba+r/qISs6nix2cZD+7bFu/6QPPC+fU0Exn3yb5LytY98VzwF1Lb0LIokcQp/r6uIYclVjSd9SvUljjJmVmA9l6AKz6DIvav/eClQTgCkQNiFAzLiQSTAdXenrNgqC+mQUvf8MqdC7uLCpuZg2r+X9Z4TESGtW4R+ExI4AqErDpk1xD9UY0WOz4unl94sE/v3waY5uybrdZLI3fZDSqeVnjBzHO/3VRyjK5y3AUdD4M1co4NDXeXlZCPzSahuCydprPMKHlHprE4a1RygBQgoJk5IH13Li/5VhKkCaihUy0CLPW2NecECGuBDumHOhLOkuCyMv8ogEn466lsVSnmdBGMVBIIRZC6TVPfX5FycdOT7q93Nxr02b1i6JRi9S5zxpICj05gTMu1M6PUUnUZUf5D+51obgHaYRnRy2akTLOLhhhM+B0LVR66qSVwwvwnKcubsYRRnRAVF6ZWJ0YRzjSywHEQ5Lw09sJP2jw6J8PdTdqiLybBnAZioHdLS21Geju9GSVoigOHGCWsUna7N6qKpoVAO3mbRtbtquoZXNdesQCZImW3W1OLLj0rprq1S0Ji+cqcsRMw06czn5fGMCIi0dYqMc38hIVAjcpGGGkZful3SHUR5ELvcrm2ln+NXpqOp1wMIpNGWaBZGDXa0UmZ6wbjcAIIdkTozeEB676i90x0mwP0atxeUKqncqHg+6WF/RFhPFiZptJZGb3ZLEovTZOOlxsxguSFcKh+jpyd1PRGpH5lCj0hgJqC1+MpG4a3iqJG1KJpuch8BB1j4vDmv9nF6d4K6oRin1jbeegEgQbfB0t6CmdQw8h1Ft4+SG7FUQqM/R3iBLU1P51Q9BrSoiorhXeAQBQmLoHBSa1cmUAoKk+vEevOEo9tIyP7vUJyLm8U0Ga5aZ4+t4M X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2c7724bd-745a-43f8-9506-08dbcab1710a X-MS-Exchange-CrossTenant-AuthSource: LV2PR12MB5869.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Oct 2023 23:26:05.8731 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: NWtdafpv4MtBWx84D2zTYwesyL1bE1Oj979EUttUwHuvxJJB5POXLxhyu8sAhbGf X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB7380 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231011_162629_570609_1BC44E1D X-CRM114-Status: GOOD ( 17.69 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org The SVA cleanup made the SSID logic entirely general so all we need to do is call it with the correct cd table entry for a S1 domain. This is slightly tricky because of the ASID and how the locking works, the simple fix is to just update the ASID once we get the right locks. Signed-off-by: Jason Gunthorpe --- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 45 +++++++++++++++++++-- drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h | 2 +- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c index 8eef125018d082..d5ba85034c1386 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c @@ -1185,8 +1185,6 @@ void arm_smmu_make_s1_cd(struct arm_smmu_cd *target, typeof(&pgtbl_cfg->arm_lpae_s1_cfg.tcr) tcr = &pgtbl_cfg->arm_lpae_s1_cfg.tcr; - lockdep_assert_held(&master->smmu->asid_lock); - memset(target, 0, sizeof(*target)); target->data[0] = cpu_to_le64( @@ -2697,6 +2695,36 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) return 0; } +static int arm_smmu_s1_set_dev_pasid(struct iommu_domain *domain, + struct device *dev, ioasid_t id) +{ + struct arm_smmu_domain *smmu_domain = to_smmu_domain(domain); + struct arm_smmu_master *master = dev_iommu_priv_get(dev); + struct arm_smmu_device *smmu = master->smmu; + struct arm_smmu_cd target_cd; + int ret = 0; + + mutex_lock(&smmu_domain->init_mutex); + if (!smmu_domain->smmu) + ret = arm_smmu_domain_finalise(smmu_domain, smmu); + else if (smmu_domain->smmu != smmu) + ret = -EINVAL; + mutex_unlock(&smmu_domain->init_mutex); + if (ret) + return ret; + + if (smmu_domain->stage != ARM_SMMU_DOMAIN_S1) + return -EINVAL; + + /* + * We can read cd.asid outside the lock because arm_smmu_set_pasid() + * will fix it + */ + arm_smmu_make_s1_cd(&target_cd, master, smmu_domain); + return arm_smmu_set_pasid(master, to_smmu_domain(domain), id, + &target_cd); +} + static void arm_smmu_update_ste(struct arm_smmu_master *master, struct iommu_domain *sid_domain, bool want_ats) @@ -2725,7 +2753,7 @@ static void arm_smmu_update_ste(struct arm_smmu_master *master, int arm_smmu_set_pasid(struct arm_smmu_master *master, struct arm_smmu_domain *smmu_domain, ioasid_t id, - const struct arm_smmu_cd *cd) + struct arm_smmu_cd *cd) { struct iommu_domain *sid_domain = iommu_get_domain_for_dev(master->dev); struct arm_smmu_cd *cdptr; @@ -2749,6 +2777,14 @@ int arm_smmu_set_pasid(struct arm_smmu_master *master, if (ret) goto out_unlock; + /* + * We don't want to obtain to the asid_lock too early, so fix up the + * caller set ASID under the lock in case it changed. + */ + cd->data[0] &= ~cpu_to_le64(CTXDESC_CD_0_ASID); + cd->data[0] |= cpu_to_le64( + FIELD_PREP(CTXDESC_CD_0_ASID, smmu_domain->cd.asid)); + arm_smmu_write_cd_entry(master, id, cdptr, cd); arm_smmu_update_ste(master, sid_domain, state.want_ats); @@ -2770,7 +2806,7 @@ static void arm_smmu_remove_dev_pasid(struct device *dev, ioasid_t pasid) struct iommu_domain *domain; bool last_ssid = master->cd_table.used_ssids == 1; - domain = iommu_get_domain_for_dev_pasid(dev, pasid, IOMMU_DOMAIN_SVA); + domain = iommu_get_domain_for_dev_pasid(dev, pasid, 0); if (WARN_ON(IS_ERR(domain)) || !domain) return; @@ -3272,6 +3308,7 @@ static struct iommu_ops arm_smmu_ops = { .owner = THIS_MODULE, .default_domain_ops = &(const struct iommu_domain_ops) { .attach_dev = arm_smmu_attach_dev, + .set_dev_pasid = arm_smmu_s1_set_dev_pasid, .map_pages = arm_smmu_map_pages, .unmap_pages = arm_smmu_unmap_pages, .flush_iotlb_all = arm_smmu_flush_iotlb_all, diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h index 5cb3b602b6baf2..74f6f9e28c6e84 100644 --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.h @@ -786,7 +786,7 @@ void arm_smmu_write_cd_entry(struct arm_smmu_master *master, int ssid, int arm_smmu_set_pasid(struct arm_smmu_master *master, struct arm_smmu_domain *smmu_domain, ioasid_t id, - const struct arm_smmu_cd *cd); + struct arm_smmu_cd *cd); void arm_smmu_remove_pasid(struct arm_smmu_master *master, struct arm_smmu_domain *smmu_domain, ioasid_t id);