Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 18 Jun 2021 21:49:04 GMT
From:      "Bjoern A. Zeeb" <bz@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 2afeed13b586 - main - LinuxKPI: add dmam_pool_create() support
Message-ID:  <202106182149.15ILn404069169@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by bz:

URL: https://cgit.FreeBSD.org/src/commit/?id=2afeed13b58653578c6ce5154afa6fb59f6b47f0

commit 2afeed13b58653578c6ce5154afa6fb59f6b47f0
Author:     Bjoern A. Zeeb <bz@FreeBSD.org>
AuthorDate: 2021-05-28 11:11:28 +0000
Commit:     Bjoern A. Zeeb <bz@FreeBSD.org>
CommitDate: 2021-06-18 21:20:09 +0000

    LinuxKPI: add dmam_pool_create() support
    
    dmam_pool_create() is a "managed" version of dma_pool_create() which
    will cleanup everything left when the device goes away using the
    devres framework.  For that add an internal cleanup function to be
    called from devres release.
    This is used by at least one wireless driver.
    
    Sponsored by:   The FreeBSD Foundation
    MFC after:      10 days
    Reviewed by:    hselasky
    Differential Revision: https://reviews.freebsd.org/D30520
---
 sys/compat/linuxkpi/common/include/linux/dmapool.h | 20 ++++++++++++++++++++
 sys/compat/linuxkpi/common/src/linux_pci.c         | 10 ++++++++++
 2 files changed, 30 insertions(+)

diff --git a/sys/compat/linuxkpi/common/include/linux/dmapool.h b/sys/compat/linuxkpi/common/include/linux/dmapool.h
index 980d5d74884f..60353ede6a82 100644
--- a/sys/compat/linuxkpi/common/include/linux/dmapool.h
+++ b/sys/compat/linuxkpi/common/include/linux/dmapool.h
@@ -41,6 +41,7 @@ struct dma_pool;
 struct dma_pool *linux_dma_pool_create(char *name, struct device *dev,
     size_t size, size_t align, size_t boundary);
 void linux_dma_pool_destroy(struct dma_pool *pool);
+void lkpi_dmam_pool_destroy(struct device *, void *);
 void *linux_dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags,
     dma_addr_t *handle);
 void linux_dma_pool_free(struct dma_pool *pool, void *vaddr,
@@ -54,6 +55,25 @@ dma_pool_create(char *name, struct device *dev, size_t size,
 	return (linux_dma_pool_create(name, dev, size, align, boundary));
 }
 
+static inline struct dma_pool *
+dmam_pool_create(/* const */ char *name, struct device *dev, size_t size,
+    size_t align, size_t boundary)
+{
+	struct dma_pool **pp;
+
+	pp = devres_alloc(lkpi_dmam_pool_destroy, sizeof(*pp), GFP_KERNEL);
+	if (pp == NULL)
+		return (NULL);
+	*pp = linux_dma_pool_create(name, dev, size, align, boundary);
+	if (*pp == NULL) {
+		devres_free(pp);
+		return (NULL);
+	}
+
+	devres_add(dev, pp);
+	return (*pp);
+}
+
 static inline void
 dma_pool_destroy(struct dma_pool *pool)
 {
diff --git a/sys/compat/linuxkpi/common/src/linux_pci.c b/sys/compat/linuxkpi/common/src/linux_pci.c
index 075df3c2adf7..7aa159600faa 100644
--- a/sys/compat/linuxkpi/common/src/linux_pci.c
+++ b/sys/compat/linuxkpi/common/src/linux_pci.c
@@ -997,6 +997,16 @@ linux_dma_pool_destroy(struct dma_pool *pool)
 	kfree(pool);
 }
 
+void
+lkpi_dmam_pool_destroy(struct device *dev, void *p)
+{
+	struct dma_pool *pool;
+
+	pool = *(struct dma_pool **)p;
+	LINUX_DMA_PCTRIE_RECLAIM(&pool->pool_ptree);
+	linux_dma_pool_destroy(pool);
+}
+
 void *
 linux_dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags,
     dma_addr_t *handle)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202106182149.15ILn404069169>