mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
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
Reviewed by: hselasky
Differential Revision: https://reviews.freebsd.org/D30520
(cherry picked from commit 2afeed13b5)
This commit is contained in:
parent
05cb0d21ed
commit
af13c69522
2 changed files with 30 additions and 0 deletions
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue