2022-12-05 16:03:05

by Keith Busch

[permalink] [raw]
Subject: [PATCH 00/11] dmapool enhancements

From: Keith Busch <[email protected]>



Keith Busch (7):
dmapool: add alloc/free performance test
dmapool: move debug code to own functions
dmapool: rearrange page alloc failure handling
dmapool: consolidate page initialization
dmapool: simplify freeing
dmapool: don't memset on free twice
dmapool: link blocks across pages

Tony Battersby (4):
dmapool: remove checks for dev == NULL
dmapool: use sysfs_emit() instead of scnprintf()
dmapool: cleanup integer types
dmapool: speedup DMAPOOL_DEBUG with init_on_alloc

mm/Kconfig | 9 ++
mm/Makefile | 1 +
mm/dmapool.c | 354 ++++++++++++++++++++++------------------------
mm/dmapool_test.c | 138 ++++++++++++++++++
4 files changed, 315 insertions(+), 187 deletions(-)
create mode 100644 mm/dmapool_test.c

--
2.30.2


2022-12-05 16:10:33

by Keith Busch

[permalink] [raw]
Subject: [PATCH 09/11] dmapool: simplify freeing

From: Keith Busch <[email protected]>

The actions for busy and not busy are mostly the same, so combine these
and remove the unnecessary function. Also, the pool is about to be freed
so there's no need to poison the page data since we only check for
poison on alloc, which can't be done on a freed pool.

Signed-off-by: Keith Busch <[email protected]>
---
mm/dmapool.c | 29 ++++++-----------------------
1 file changed, 6 insertions(+), 23 deletions(-)

diff --git a/mm/dmapool.c b/mm/dmapool.c
index 33d20ceff18c5..44622f2bf4641 100644
--- a/mm/dmapool.c
+++ b/mm/dmapool.c
@@ -241,18 +241,6 @@ static inline bool is_page_busy(struct dma_page *page)
return page->in_use != 0;
}

-static void pool_free_page(struct dma_pool *pool, struct dma_page *page)
-{
- dma_addr_t dma = page->dma;
-
-#ifdef DMAPOOL_DEBUG
- memset(page->vaddr, POOL_POISON_FREED, pool->allocation);
-#endif
- dma_free_coherent(pool->dev, pool->allocation, page->vaddr, dma);
- list_del(&page->page_list);
- kfree(page);
-}
-
/**
* dma_pool_destroy - destroys a pool of dma memory blocks.
* @pool: dma pool that will be destroyed
@@ -280,14 +268,14 @@ void dma_pool_destroy(struct dma_pool *pool)
mutex_unlock(&pools_reg_lock);

list_for_each_entry_safe(page, tmp, &pool->page_list, page_list) {
- if (is_page_busy(page)) {
+ if (!is_page_busy(page))
+ dma_free_coherent(pool->dev, pool->allocation,
+ page->vaddr, page->dma);
+ else
dev_err(pool->dev, "%s %s, %p busy\n", __func__,
pool->name, page->vaddr);
- /* leak the still-in-use consistent memory */
- list_del(&page->page_list);
- kfree(page);
- } else
- pool_free_page(pool, page);
+ list_del(&page->page_list);
+ kfree(page);
}

kfree(pool);
@@ -445,11 +433,6 @@ void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t dma)
page->in_use--;
*(int *)vaddr = page->offset;
page->offset = offset;
- /*
- * Resist a temptation to do
- * if (!is_page_busy(page)) pool_free_page(pool, page);
- * Better have a few empty pages hang around.
- */
spin_unlock_irqrestore(&pool->lock, flags);
}
EXPORT_SYMBOL(dma_pool_free);
--
2.30.2

2022-12-05 16:27:47

by Keith Busch

[permalink] [raw]
Subject: [PATCH 08/11] dmapool: consolidate page initialization

From: Keith Busch <[email protected]>

Various fields of the dma pool are set in different places. Move it all
to one function.

Signed-off-by: Keith Busch <[email protected]>
---
mm/dmapool.c | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/mm/dmapool.c b/mm/dmapool.c
index f77e2af4941de..33d20ceff18c5 100644
--- a/mm/dmapool.c
+++ b/mm/dmapool.c
@@ -202,6 +202,8 @@ static void pool_initialise_page(struct dma_pool *pool, struct dma_page *page)
unsigned int offset = 0;
unsigned int next_boundary = pool->boundary;

+ page->in_use = 0;
+ page->offset = 0;
do {
unsigned int next = offset + pool->size;
if (unlikely((next + pool->size) >= next_boundary)) {
@@ -211,6 +213,8 @@ static void pool_initialise_page(struct dma_pool *pool, struct dma_page *page)
*(int *)(page->vaddr + offset) = next;
offset = next;
} while (offset < pool->allocation);
+
+ list_add(&page->page_list, &pool->page_list);
}

static struct dma_page *pool_alloc_page(struct dma_pool *pool, gfp_t mem_flags)
@@ -229,10 +233,6 @@ static struct dma_page *pool_alloc_page(struct dma_pool *pool, gfp_t mem_flags)
#ifdef DMAPOOL_DEBUG
memset(page->vaddr, POOL_POISON_FREED, pool->allocation);
#endif
- pool_initialise_page(pool, page);
- page->in_use = 0;
- page->offset = 0;
-
return page;
}

@@ -354,8 +354,7 @@ void *dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags,
return NULL;

spin_lock_irqsave(&pool->lock, flags);
-
- list_add(&page->page_list, &pool->page_list);
+ pool_initialise_page(pool, page);
ready:
page->in_use++;
offset = page->offset;
--
2.30.2