From patchwork Thu Sep 12 11:15:48 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 13801941 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9E9C0EEB593 for ; Thu, 12 Sep 2024 11:17:21 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 32F4D6B00B0; Thu, 12 Sep 2024 07:17:21 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 2DFB66B00B2; Thu, 12 Sep 2024 07:17:21 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 132516B00B3; Thu, 12 Sep 2024 07:17:21 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id E03C96B00B0 for ; Thu, 12 Sep 2024 07:17:20 -0400 (EDT) Received: from smtpin20.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 9BD3E121835 for ; Thu, 12 Sep 2024 11:17:20 +0000 (UTC) X-FDA: 82555835040.20.11E398D Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by imf30.hostedemail.com (Postfix) with ESMTP id F2D2180002 for ; Thu, 12 Sep 2024 11:17:18 +0000 (UTC) Authentication-Results: imf30.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=QFWaxyYp; dmarc=pass (policy=quarantine) header.from=kernel.org; spf=pass (imf30.hostedemail.com: domain of leon@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=leon@kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1726139810; a=rsa-sha256; cv=none; b=WBG0AG9aFUITLNz4qFFzqmsO6sJK0kkDbisjTQ7X+T1kYGoe4suFI0mC3a/B5gfX0X/se4 D5E0pQceybgDTOyR0Wbn1aor4IHQen12fS94k5vNgr71lcTcGJ0UaRFonSWTEaQUoZC8mQ S1h8QgjBAdPByeA/eb9fO4Ly4V7cwlg= ARC-Authentication-Results: i=1; imf30.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=QFWaxyYp; dmarc=pass (policy=quarantine) header.from=kernel.org; spf=pass (imf30.hostedemail.com: domain of leon@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=leon@kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1726139810; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=Mr0G1m8SROsZ7tCbvxfUWydjf4YRJTndQwy2lASZe5A=; b=kjzj30IdLVpsx3UGNHxBm835k5WIFTLtkg2x5/wf1tTmS77XnOlSo2WGGL4K7tjr00HxqQ cbF8uRYeP5593VP/vUE/HRguJTK2E8MRZ/JRa0NPej9ZrJoUjMvvrvEU1lsnaHEenTz6bI Yz0C/ZrrXpDpAiqd6eD/8iIeZByr468= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id 788325C5AAC; Thu, 12 Sep 2024 11:17:14 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id F0BF2C4CEC3; Thu, 12 Sep 2024 11:17:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726139837; bh=wkFj1cXNmX5ZlhYlYscU+J0rWGL2pg30iH0xC9v8VVY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QFWaxyYpYfe2FFX+K0p+Goy6dyaOFgOpyojuT6rJgqucu1wtXJ7Ko6B4Z9/VXe95S 2I3S4vrw+Ff5zb5nynL5Vh4Yw/g8+uv0ZNC87b03g7DhVrmV3YivYg7uBbwVNe/GZG +MBvLijRXvMiwL3ZM84io5kv0P8Wbcp45n4DIbM7CtyDWAAQlTWkB20jUCGxLF406f CPRu/FtyIHE0iWOhGGjqbS+ZeLgoViJvPDk3twLQyYGb5FUYjNquCd5o/JMVAX1ObX p/Oa3w5s2HlnKu34VY+AD80OkZOKYp43R+53dQV6GuLtLI/rUJqwRY2wXjSwusplbM Yvypy/0K4VPSA== From: Leon Romanovsky To: Jens Axboe , Jason Gunthorpe , Robin Murphy , Joerg Roedel , Will Deacon , Keith Busch , Christoph Hellwig , "Zeng, Oak" , Chaitanya Kulkarni Cc: Leon Romanovsky , Sagi Grimberg , Bjorn Helgaas , Logan Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Alex Williamson , Marek Szyprowski , =?utf-8?b?SsOpcsO0bWUgR2xpc3Nl?= , Andrew Morton , linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rdma@vger.kernel.org, iommu@lists.linux.dev, linux-nvme@lists.infradead.org, linux-pci@vger.kernel.org, kvm@vger.kernel.org, linux-mm@kvack.org Subject: [RFC v2 13/21] RDMA/umem: Prevent UMEM ODP creation with SWIOTLB Date: Thu, 12 Sep 2024 14:15:48 +0300 Message-ID: X-Mailer: git-send-email 2.46.0 In-Reply-To: References: MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Queue-Id: F2D2180002 X-Rspamd-Server: rspam01 X-Stat-Signature: prtczjcysurfoypsn3fet9sxjqdy5zdo X-HE-Tag: 1726139838-830832 X-HE-Meta: U2FsdGVkX1/19hTeDdDzAbaisj41jFaYk9PoCcew1wGP0rB723m4p07v+54vC0cdaoF+DGvshAOOSn3yes/J1IcVseHWb8NsMZ8+ecUS73TRqt+C2JyT399ns9rcBxjcZuCgLL0eSdLyd3uYPVsZNcyQvmkY5LzOJivIODtqQXIXMdaxfMevhoyTLn46A/bVMP/XloN1Sro80dFklsl3orRrG+xwxzHKbxbmjfWzJOcdGG7leqFwfybx5J5J+wOS1rteLsLgLARaK0HgX2IKBuRvlq1jrcSGkK032WHBkuxHu3G4OdxJ6iDqZtnWP/7/B6PQY1nnzWgSgfbkerkkZv8or4If84e+vCF+0iOLY7x7Xb3twCX1TCBMcy6aOyE0lFAcBv6lFWzLx/lLeDL2FTNJNsl3fNLe5WKZvSOr8Am3+h/WYgyUKFzRne0dT5YZU72WGMGaS3q+wGKjB9XutxfCaNrPzBae5WN374Xqk8A7pWHwW2fSis0CABrHuXrwIk3ZDVOX8J/rWPtTEjeIcRYStPSvpib0rF03/2c31RqcYNXdMqW1pUdb6ZCj5jHIna75zG+BL34NKoGb7jxhmPeZ5MO6O+wcb4RqBXfnNz2VTAD199bUhCRf2O+99CBvzkGeKBZfDoTr7gW4Rl0KW9Z2PQ2RNljmlsTVGaAEUVKoKNzS/yZ1sJr/IWze0geEkrZTPNJjmRPSFZzC3oPhNwwr54fLE4l5c64pDAmi46Xydurlrp6jaknO/hUb6ng3TxLVaLfWXKjRs8QaolWvOZk428Nidx+FDxlasDfOropz42oMzAqJfVgAXI4+jI5jHbXSOw1wLGQa9JfibfdzwHLzVaBZ+gKmQehmSo+CtvsET3yi3q6LED2KgZ45GU6NPnyHk58Eed4LpXkPbTa0oKlIa24Ec8ue4arr8p9qKEwPn/ZGG+0JCXEJvsM98YlpcWHxVhAqR/ZqQX2V3rZ nwASWSa+ 7pfG57SqLjF4wo45xJzuO07qTgY9xmVrchr2Tjdv3aqpkm2PCgIODdBYXZsaZ4O8ONLP9bY/kDfgwQXhtGmwSBMRdx9yAus5WdenzDBmE3yMtbQi27vaylbl+8JnF05cHHcuHXMwqPaXIAR952Fd/HPV+N3vaZz5zdQiRngQndq05MBCDSTGMwmx9BQB89k7DoXGBE25J/KZeaDRq+L3aRtsAiFx0NuVaTC7Sm9oSBydLFTc= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: From: Leon Romanovsky RDMA UMEM never supported DMA addresses returned from SWIOTLB, as these addresses should be programmed to the hardware which is not aware that it is bounce buffers and not real ones. Instead of silently leave broken system for the users who didn't know it, let's be explicit and return an error to them. Signed-off-by: Leon Romanovsky --- drivers/infiniband/core/umem_odp.c | 78 +++++++++++++++--------------- drivers/iommu/dma-iommu.c | 1 + 2 files changed, 40 insertions(+), 39 deletions(-) diff --git a/drivers/infiniband/core/umem_odp.c b/drivers/infiniband/core/umem_odp.c index 7bfa1e54454c..58fc3d4bfb73 100644 --- a/drivers/infiniband/core/umem_odp.c +++ b/drivers/infiniband/core/umem_odp.c @@ -42,7 +42,7 @@ #include #include #include - +#include #include #include "uverbs.h" @@ -51,49 +51,49 @@ static inline int ib_init_umem_odp(struct ib_umem_odp *umem_odp, const struct mmu_interval_notifier_ops *ops) { struct ib_device *dev = umem_odp->umem.ibdev; + size_t page_size = 1UL << umem_odp->page_shift; + unsigned long start, end; + size_t ndmas, npfns; int ret; umem_odp->umem.is_odp = 1; mutex_init(&umem_odp->umem_mutex); + if (umem_odp->is_implicit_odp) + return 0; + + if (!iommu_can_use_iova(dev->dma_device, NULL, page_size, + DMA_BIDIRECTIONAL)) + return -EOPNOTSUPP; + + start = ALIGN_DOWN(umem_odp->umem.address, page_size); + if (check_add_overflow(umem_odp->umem.address, + (unsigned long)umem_odp->umem.length, &end)) + return -EOVERFLOW; + end = ALIGN(end, page_size); + if (unlikely(end < page_size)) + return -EOVERFLOW; + + ndmas = (end - start) >> umem_odp->page_shift; + if (!ndmas) + return -EINVAL; + + npfns = (end - start) >> PAGE_SHIFT; + umem_odp->pfn_list = + kvcalloc(npfns, sizeof(*umem_odp->pfn_list), GFP_KERNEL); + if (!umem_odp->pfn_list) + return -ENOMEM; + + dma_init_iova_state(&umem_odp->state, dev->dma_device, + DMA_BIDIRECTIONAL); + ret = dma_alloc_iova(&umem_odp->state, end - start); + if (ret) + goto out_pfn_list; - if (!umem_odp->is_implicit_odp) { - size_t page_size = 1UL << umem_odp->page_shift; - unsigned long start; - unsigned long end; - size_t ndmas, npfns; - - start = ALIGN_DOWN(umem_odp->umem.address, page_size); - if (check_add_overflow(umem_odp->umem.address, - (unsigned long)umem_odp->umem.length, - &end)) - return -EOVERFLOW; - end = ALIGN(end, page_size); - if (unlikely(end < page_size)) - return -EOVERFLOW; - - ndmas = (end - start) >> umem_odp->page_shift; - if (!ndmas) - return -EINVAL; - - npfns = (end - start) >> PAGE_SHIFT; - umem_odp->pfn_list = kvcalloc( - npfns, sizeof(*umem_odp->pfn_list), GFP_KERNEL); - if (!umem_odp->pfn_list) - return -ENOMEM; - - - dma_init_iova_state(&umem_odp->state, dev->dma_device, - DMA_BIDIRECTIONAL); - ret = dma_alloc_iova(&umem_odp->state, end - start); - if (ret) - goto out_pfn_list; - - ret = mmu_interval_notifier_insert(&umem_odp->notifier, - umem_odp->umem.owning_mm, - start, end - start, ops); - if (ret) - goto out_free_iova; - } + ret = mmu_interval_notifier_insert(&umem_odp->notifier, + umem_odp->umem.owning_mm, start, + end - start, ops); + if (ret) + goto out_free_iova; return 0; diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c index 3e2e382bb502..af3428ae150d 100644 --- a/drivers/iommu/dma-iommu.c +++ b/drivers/iommu/dma-iommu.c @@ -1849,6 +1849,7 @@ bool iommu_can_use_iova(struct device *dev, struct page *page, size_t size, return true; } +EXPORT_SYMBOL_GPL(iommu_can_use_iova); void iommu_setup_dma_ops(struct device *dev) {