From patchwork Tue Jul 2 09:09:31 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 13719166 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 5559FC3064D for ; Tue, 2 Jul 2024 09:10:09 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CCDC46B0096; Tue, 2 Jul 2024 05:10:08 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id C829E6B0098; Tue, 2 Jul 2024 05:10:08 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id AF0236B0099; Tue, 2 Jul 2024 05:10:08 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 8F3BE6B0096 for ; Tue, 2 Jul 2024 05:10:08 -0400 (EDT) Received: from smtpin20.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 4D569141F93 for ; Tue, 2 Jul 2024 09:10:08 +0000 (UTC) X-FDA: 82294240896.20.6F86913 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by imf26.hostedemail.com (Postfix) with ESMTP id 7E82714001E for ; Tue, 2 Jul 2024 09:10:05 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=WdB+vVAS; spf=pass (imf26.hostedemail.com: domain of leon@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=leon@kernel.org; dmarc=pass (policy=none) header.from=kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1719911388; 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=O4AbwGmGnj47IV1Y8hzENMzunZyP4axPgZfTlB+LSU4=; b=iKkpo2XJPUsErQ79LNJGUfdi3Z8S+MR+gJ5JTxadtBatEeNF3woTqZ4wkHIoplNo3GTPck 6ExbcOAhTAYMNKvXcn8+brGYbpAllh5ZaOEDRNFrL/BFCo667RapJcafcR7e5LvRoKBGiU TOSMtmosMYZWYbS1FFvAc+ed3h/WI3w= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=WdB+vVAS; spf=pass (imf26.hostedemail.com: domain of leon@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=leon@kernel.org; dmarc=pass (policy=none) header.from=kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1719911388; a=rsa-sha256; cv=none; b=2nBFhnD8+oXk9bN5a+VXgBVmp2b+2dRsxMGASckAr31dOgzzCUBXCZihilP9YMWlwP3EjA hW+5VB7R6rrs2D/qmCsB/w+TkdSG9pSCDo5/it9Vtm2Jsw18zOHfvYhdoURatQe7s6vawm XlIIb5l6d5dAkNjEgRvFujAR8RcH+9Y= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id B00FE61A0C; Tue, 2 Jul 2024 09:10:04 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 97D44C116B1; Tue, 2 Jul 2024 09:10:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1719911404; bh=PsDcRtwRrZy3xcTFmq5V+v2aFvC1FX6fMcSIsPNIgJ4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WdB+vVAS8uHPdPme4myJO22f4FbGRcG1dHDJHwEW7t+ki8CzsXtGbIJKrwNZzL+oN HZhggaNWlUq2LDjYroZErlO93jF4y+zjRYe2QMVqmzz1MDxk1Rl8xeJex/5Q1jOGA8 kNM7rlYFNxKQypQjyLEv1W8ppPwmxff79s/KS7zpU97+5kGBVsrGR36Z/Ui8WyxfjN +2WhW3GmeKGr7A5xpE0coC6WO/48R8aI2ccSdCQQ38AntHiLnCHjCF0ItXO1X8/fim N1g17gLjq4qvdcY6NksGgFPtVrvn0kKJnJryFF33jW+ntCtDHOmI6RkHi12DWkTu0B MTNXNHg+0HJIQ== 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 PATCH v1 01/18] dma-mapping: query DMA memory type Date: Tue, 2 Jul 2024 12:09:31 +0300 Message-ID: X-Mailer: git-send-email 2.45.2 In-Reply-To: References: MIME-Version: 1.0 X-Stat-Signature: 9s8tzwgf5m618cmxzzky5ruah6861isd X-Rspam-User: X-Rspamd-Queue-Id: 7E82714001E X-Rspamd-Server: rspam02 X-HE-Tag: 1719911405-122911 X-HE-Meta: U2FsdGVkX1+lQamM9zKDNcgmGQL2wlVMm/pQGUOU6EE01zGvfXArkjIiIJCV/REihIqKzJUMTgwcgqvX0ZodAyBg8dXTeIOE1Qd1lFG7ZRccZ7g63soZ0qRY5xNt8yvLEusqhcTRKX1z0EMaMA4r/vfQDRf/QKfutcBzvUFEAIfmel78lcyt/kEnaWMzGDgAJlCykepoXMPfA4ICG+u68h5D8wMiAWJ1xQBhIPd6u/eY7zZx5g7NW8Y3xN2O8VMMDBfx/O1F6socjghyxCH8eWX5g7xXGNxGzt1myp6UlYI54roTjcWkmeySyCglL1LksVqIhP6oOK9kWjk/qp/qDX2VhtIehhyrM6YPHX7L2eG6d7JQeRk9JFwCKeFBEd8bTjlqYOf8CGZg2qHoqizuCvccqFfc4zBFEqXP8wpn+Uo+6D/9OJNy7DgYctebyyA5pNexhX4BHW+DjeG92xkolAxaOF6InyQrVUVpw46gfTNWlLgCh4KkHLldYMU4IUkyGLpGnQsTKA4rXQ6jhwYtWgBpKTvLSVUFrRnJMNmqSq6ZiLOiM+ynaqBqqApvO+QjD6t2M9VKaGgycafFdqOjQklTyJl6TwOWxZgTqHV0c4l8Po55ymsV0y43eFtpZzWj3cGFZaOd4vI1h/k4Y1BwuPuCMUUr11iEoH6NRz94YR59GYzOtNoU5nX1nniXOof80hKlc1ON/3dPpuDBEYjkMNGDTvQ06wXQICRyJBBlCKtmhx5fVaRBNjijUsvSHzph6Krm9gqVuFM86PgAU8qEqFUZ2iHjHldmB9b1gQ/GMl7DO4LqFdNRHIk2vN/X3eQ5HHuqYC9EERQkQ3sLq/+E84UVTIw8Ia8MLYCMYtaFU8REj/rkX6ZN+uMmE3zJVJJZBflVhmTPMjmPhloZVh6sya2ENtwGTZHI2AvKeYzIEd7iuBqBGYJPancrmj67s9a7n2bqJ7trO9rQlW+hRE7 hBQ98PEQ aYwC5XmVG5Ryy1Grhd9oN5yQeqLDNvuO/x329lokmSe5DW8F6u2Ojk3UdMMUU4KUNjCirJN8dfuFY8UpieseqgfEh1tyB9PONCLc/u0GHexuO2BIEz8lTxRiZCdmyslobYeG9yJYR1Fnvq8O7emdRTsfw7/g3/uPUJbqTcmg/NYTAQlZ40MyE6xZ4bvcbN7V1r8we2SrqR22ldJU= 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 Provide an option to query and set DMA memory type so callers who supply range of pages can perform it only once as the whole range is supposed to have same memory type. Signed-off-by: Leon Romanovsky --- include/linux/dma-mapping.h | 20 ++++++++++++++++++++ kernel/dma/mapping.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h index f693aafe221f..49b99c6e7ec5 100644 --- a/include/linux/dma-mapping.h +++ b/include/linux/dma-mapping.h @@ -76,6 +76,20 @@ #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1)) +enum dma_memory_types { + /* Normal memory without any extra properties like P2P, e.t.c */ + DMA_MEMORY_TYPE_NORMAL, + /* Memory which is p2p capable */ + DMA_MEMORY_TYPE_P2P, + /* Encrypted memory (TDX) */ + DMA_MEMORY_TYPE_ENCRYPTED, +}; + +struct dma_memory_type { + enum dma_memory_types type; + struct dev_pagemap *p2p_pgmap; +}; + #ifdef CONFIG_DMA_API_DEBUG void debug_dma_mapping_error(struct device *dev, dma_addr_t dma_addr); void debug_dma_map_single(struct device *dev, const void *addr, @@ -149,6 +163,8 @@ void *dma_vmap_noncontiguous(struct device *dev, size_t size, void dma_vunmap_noncontiguous(struct device *dev, void *vaddr); int dma_mmap_noncontiguous(struct device *dev, struct vm_area_struct *vma, size_t size, struct sg_table *sgt); + +void dma_get_memory_type(struct page *page, struct dma_memory_type *type); #else /* CONFIG_HAS_DMA */ static inline dma_addr_t dma_map_page_attrs(struct device *dev, struct page *page, size_t offset, size_t size, @@ -279,6 +295,10 @@ static inline int dma_mmap_noncontiguous(struct device *dev, { return -EINVAL; } +static inline void dma_get_memory_type(struct page *page, + struct dma_memory_type *type) +{ +} #endif /* CONFIG_HAS_DMA */ #if defined(CONFIG_HAS_DMA) && defined(CONFIG_DMA_NEED_SYNC) diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index 81de84318ccc..877e43b39c06 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -6,6 +6,7 @@ * Copyright (c) 2006 Tejun Heo */ #include /* for max_pfn */ +#include #include #include #include @@ -14,6 +15,7 @@ #include #include #include +#include #include "debug.h" #include "direct.h" @@ -894,3 +896,31 @@ unsigned long dma_get_merge_boundary(struct device *dev) return ops->get_merge_boundary(dev); } EXPORT_SYMBOL_GPL(dma_get_merge_boundary); + +/** + * dma_get_memory_type - get the DMA memory type of the page supplied + * @page: page to check + * @type: memory type of that page + * + * Return the DMA memory type for the struct page. Pages with the same + * memory type can be combined into the same IOVA mapping. Users of the + * dma_iova family of functions must seperate the memory they want to map + * into same-memory type ranges. + */ +void dma_get_memory_type(struct page *page, struct dma_memory_type *type) +{ + /* TODO: Rewrite this check to rely on specific struct page flags */ + if (cc_platform_has(CC_ATTR_MEM_ENCRYPT)) { + type->type = DMA_MEMORY_TYPE_ENCRYPTED; + return; + } + + if (is_pci_p2pdma_page(page)) { + type->type = DMA_MEMORY_TYPE_P2P; + type->p2p_pgmap = page->pgmap; + return; + } + + type->type = DMA_MEMORY_TYPE_NORMAL; +} +EXPORT_SYMBOL_GPL(dma_get_memory_type);