From: Logan Gunthorpe <logang@deltatee.com>
To: linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org,
linux-block@vger.kernel.org, linux-pci@vger.kernel.org,
linux-mm@kvack.org, iommu@lists.linux-foundation.org
Cc: "Stephen Bates" <sbates@raithlin.com>,
"Christoph Hellwig" <hch@lst.de>,
"Dan Williams" <dan.j.williams@intel.com>,
"Jason Gunthorpe" <jgg@ziepe.ca>,
"Christian König" <christian.koenig@amd.com>,
"John Hubbard" <jhubbard@nvidia.com>,
"Don Dutile" <ddutile@redhat.com>,
"Matthew Wilcox" <willy@infradead.org>,
"Daniel Vetter" <daniel.vetter@ffwll.ch>,
"Jakowski Andrzej" <andrzej.jakowski@intel.com>,
"Minturn Dave B" <dave.b.minturn@intel.com>,
"Jason Ekstrand" <jason@jlekstrand.net>,
"Dave Hansen" <dave.hansen@linux.intel.com>,
"Xiong Jianxin" <jianxin.xiong@intel.com>,
"Bjorn Helgaas" <helgaas@kernel.org>,
"Ira Weiny" <ira.weiny@intel.com>,
"Robin Murphy" <robin.murphy@arm.com>,
"Martin Oliveira" <martin.oliveira@eideticom.com>,
"Chaitanya Kulkarni" <ckulkarnilinux@gmail.com>,
"Logan Gunthorpe" <logang@deltatee.com>
Subject: [PATCH v4 21/23] mm: use custom page_free for P2PDMA pages
Date: Wed, 17 Nov 2021 14:54:08 -0700 [thread overview]
Message-ID: <20211117215410.3695-22-logang@deltatee.com> (raw)
In-Reply-To: <20211117215410.3695-1-logang@deltatee.com>
When P2PDMA pages are passed to userspace, they will need to be
reference counted properly and returned to their genalloc after their
reference count returns to 1. This is accomplished with the existing
DEV_PAGEMAP_OPS and the .page_free() operation.
Change CONFIG_P2PDMA to select CONFIG_DEV_PAGEMAP_OPS and add
MEMORY_DEVICE_PCI_P2PDMA to page_is_devmap_managed(),
devmap_managed_enable_[put|get]() and free_devmap_managed_page().
Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
---
drivers/pci/Kconfig | 1 +
drivers/pci/p2pdma.c | 13 +++++++++++++
include/linux/mm.h | 1 +
mm/memremap.c | 12 +++++++++---
4 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig
index 95f29601a4df..da53799cddab 100644
--- a/drivers/pci/Kconfig
+++ b/drivers/pci/Kconfig
@@ -170,6 +170,7 @@ config PCI_P2PDMA
#
select NEED_SG_DMA_BUS_ADDR_FLAG
select GENERIC_ALLOCATOR
+ select DEV_PAGEMAP_OPS
help
Enableѕ drivers to do PCI peer-to-peer transactions to and from
BARs that are exposed in other devices that are the part of
diff --git a/drivers/pci/p2pdma.c b/drivers/pci/p2pdma.c
index 563e9be9599e..16992b0f0c36 100644
--- a/drivers/pci/p2pdma.c
+++ b/drivers/pci/p2pdma.c
@@ -101,6 +101,18 @@ static const struct attribute_group p2pmem_group = {
.name = "p2pmem",
};
+static void p2pdma_page_free(struct page *page)
+{
+ struct pci_p2pdma_pagemap *pgmap = to_p2p_pgmap(page->pgmap);
+
+ gen_pool_free(pgmap->provider->p2pdma->pool,
+ (uintptr_t)page_to_virt(page), PAGE_SIZE);
+}
+
+static const struct dev_pagemap_ops p2pdma_pgmap_ops = {
+ .page_free = p2pdma_page_free,
+};
+
static void pci_p2pdma_release(void *data)
{
struct pci_dev *pdev = data;
@@ -198,6 +210,7 @@ int pci_p2pdma_add_resource(struct pci_dev *pdev, int bar, size_t size,
pgmap->range.end = pgmap->range.start + size - 1;
pgmap->nr_range = 1;
pgmap->type = MEMORY_DEVICE_PCI_P2PDMA;
+ pgmap->ops = &p2pdma_pgmap_ops;
p2p_pgmap->provider = pdev;
p2p_pgmap->bus_offset = pci_bus_address(pdev, bar) -
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 3367d936b256..f26ea7e1fc74 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -1168,6 +1168,7 @@ static inline bool page_is_devmap_managed(struct page *page)
switch (page->pgmap->type) {
case MEMORY_DEVICE_PRIVATE:
case MEMORY_DEVICE_FS_DAX:
+ case MEMORY_DEVICE_PCI_P2PDMA:
return true;
default:
break;
diff --git a/mm/memremap.c b/mm/memremap.c
index 5a66a71ab591..ec3143ffdeee 100644
--- a/mm/memremap.c
+++ b/mm/memremap.c
@@ -44,14 +44,16 @@ EXPORT_SYMBOL(devmap_managed_key);
static void devmap_managed_enable_put(struct dev_pagemap *pgmap)
{
if (pgmap->type == MEMORY_DEVICE_PRIVATE ||
- pgmap->type == MEMORY_DEVICE_FS_DAX)
+ pgmap->type == MEMORY_DEVICE_FS_DAX ||
+ pgmap->type == MEMORY_DEVICE_PCI_P2PDMA)
static_branch_dec(&devmap_managed_key);
}
static void devmap_managed_enable_get(struct dev_pagemap *pgmap)
{
if (pgmap->type == MEMORY_DEVICE_PRIVATE ||
- pgmap->type == MEMORY_DEVICE_FS_DAX)
+ pgmap->type == MEMORY_DEVICE_FS_DAX ||
+ pgmap->type == MEMORY_DEVICE_PCI_P2PDMA)
static_branch_inc(&devmap_managed_key);
}
#else
@@ -355,6 +357,10 @@ void *memremap_pages(struct dev_pagemap *pgmap, int nid)
case MEMORY_DEVICE_GENERIC:
break;
case MEMORY_DEVICE_PCI_P2PDMA:
+ if (!pgmap->ops->page_free) {
+ WARN(1, "Missing page_free method\n");
+ return ERR_PTR(-EINVAL);
+ }
params.pgprot = pgprot_noncached(params.pgprot);
break;
default:
@@ -498,7 +504,7 @@ EXPORT_SYMBOL_GPL(get_dev_pagemap);
void free_devmap_managed_page(struct page *page)
{
/* notify page idle for dax */
- if (!is_device_private_page(page)) {
+ if (!is_device_private_page(page) && !is_pci_p2pdma_page(page)) {
wake_up_var(&page->_refcount);
return;
}
--
2.30.2
next prev parent reply other threads:[~2021-11-17 22:02 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-17 21:53 [PATCH v4 00/23] Userspace P2PDMA with O_DIRECT NVMe devices Logan Gunthorpe
2021-11-17 21:53 ` [PATCH v4 01/23] lib/scatterlist: cleanup macros into static inline functions Logan Gunthorpe
2021-12-13 21:51 ` Chaitanya Kulkarni
2021-12-21 9:00 ` Christoph Hellwig
2021-12-21 17:23 ` Logan Gunthorpe
2021-12-22 8:22 ` Christoph Hellwig
2021-11-17 21:53 ` [PATCH v4 02/23] lib/scatterlist: add flag for indicating P2PDMA segments in an SGL Logan Gunthorpe
2021-12-13 21:55 ` Chaitanya Kulkarni
2021-12-21 9:02 ` Christoph Hellwig
2021-11-17 21:53 ` [PATCH v4 03/23] PCI/P2PDMA: Attempt to set map_type if it has not been set Logan Gunthorpe
2021-12-13 22:00 ` Chaitanya Kulkarni
2021-11-17 21:53 ` [PATCH v4 04/23] PCI/P2PDMA: Expose pci_p2pdma_map_type() Logan Gunthorpe
2021-12-13 22:05 ` Chaitanya Kulkarni
2021-11-17 21:53 ` [PATCH v4 05/23] PCI/P2PDMA: Introduce helpers for dma_map_sg implementations Logan Gunthorpe
2021-11-17 21:53 ` [PATCH v4 06/23] dma-mapping: allow EREMOTEIO return code for P2PDMA transfers Logan Gunthorpe
2021-11-17 21:53 ` [PATCH v4 07/23] dma-direct: support PCI P2PDMA pages in dma-direct map_sg Logan Gunthorpe
2021-11-17 21:53 ` [PATCH v4 08/23] dma-mapping: add flags to dma_map_ops to indicate PCI P2PDMA support Logan Gunthorpe
2021-11-17 21:53 ` [PATCH v4 09/23] iommu/dma: support PCI P2PDMA pages in dma-iommu map_sg Logan Gunthorpe
2021-11-17 21:53 ` [PATCH v4 10/23] nvme-pci: check DMA ops when indicating support for PCI P2PDMA Logan Gunthorpe
2021-12-13 22:10 ` Chaitanya Kulkarni
2021-11-17 21:53 ` [PATCH v4 11/23] nvme-pci: convert to using dma_map_sgtable() Logan Gunthorpe
2021-12-13 22:21 ` Chaitanya Kulkarni
2021-12-13 22:28 ` Logan Gunthorpe
2021-11-17 21:53 ` [PATCH v4 12/23] RDMA/core: introduce ib_dma_pci_p2p_dma_supported() Logan Gunthorpe
2021-11-17 21:54 ` [PATCH v4 13/23] RDMA/rw: drop pci_p2pdma_[un]map_sg() Logan Gunthorpe
2021-11-17 21:54 ` [PATCH v4 14/23] PCI/P2PDMA: Remove pci_p2pdma_[un]map_sg() Logan Gunthorpe
2021-11-17 21:54 ` [PATCH v4 15/23] mm: introduce FOLL_PCI_P2PDMA to gate getting PCI P2PDMA pages Logan Gunthorpe
2021-11-17 21:54 ` [PATCH v4 16/23] iov_iter: introduce iov_iter_get_pages_[alloc_]flags() Logan Gunthorpe
2021-12-21 9:04 ` Christoph Hellwig
2021-11-17 21:54 ` [PATCH v4 17/23] block: add check when merging zone device pages Logan Gunthorpe
2021-12-21 9:05 ` Christoph Hellwig
2021-11-17 21:54 ` [PATCH v4 18/23] lib/scatterlist: " Logan Gunthorpe
2021-11-17 21:54 ` [PATCH v4 19/23] block: set FOLL_PCI_P2PDMA in __bio_iov_iter_get_pages() Logan Gunthorpe
2021-11-17 21:54 ` [PATCH v4 20/23] block: set FOLL_PCI_P2PDMA in bio_map_user_iov() Logan Gunthorpe
2021-11-17 21:54 ` Logan Gunthorpe [this message]
2021-12-21 9:06 ` [PATCH v4 21/23] mm: use custom page_free for P2PDMA pages Christoph Hellwig
2021-12-21 17:27 ` Logan Gunthorpe
2021-11-17 21:54 ` [PATCH v4 22/23] PCI/P2PDMA: Introduce pci_mmap_p2pmem() Logan Gunthorpe
2021-11-17 21:54 ` [PATCH v4 23/23] nvme-pci: allow mmaping the CMB in userspace Logan Gunthorpe
2021-12-21 9:07 ` Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20211117215410.3695-22-logang@deltatee.com \
--to=logang@deltatee.com \
--cc=andrzej.jakowski@intel.com \
--cc=christian.koenig@amd.com \
--cc=ckulkarnilinux@gmail.com \
--cc=dan.j.williams@intel.com \
--cc=daniel.vetter@ffwll.ch \
--cc=dave.b.minturn@intel.com \
--cc=dave.hansen@linux.intel.com \
--cc=ddutile@redhat.com \
--cc=hch@lst.de \
--cc=helgaas@kernel.org \
--cc=iommu@lists.linux-foundation.org \
--cc=ira.weiny@intel.com \
--cc=jason@jlekstrand.net \
--cc=jgg@ziepe.ca \
--cc=jhubbard@nvidia.com \
--cc=jianxin.xiong@intel.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-nvme@lists.infradead.org \
--cc=linux-pci@vger.kernel.org \
--cc=martin.oliveira@eideticom.com \
--cc=robin.murphy@arm.com \
--cc=sbates@raithlin.com \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox