| From: Keith Busch <kbusch@kernel.org> |
| Subject: dmapool: simplify freeing |
| Date: Thu, 26 Jan 2023 13:51:22 -0800 |
| |
| 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. |
| |
| Link: https://lkml.kernel.org/r/20230126215125.4069751-10-kbusch@meta.com |
| Fixes: 2d55c16c0c54 ("dmapool: create/destroy cleanup") |
| Signed-off-by: Keith Busch <kbusch@kernel.org> |
| Reviewed-by: Christoph Hellwig <hch@lst.de> |
| Cc: Matthew Wilcox <willy@infradead.org> |
| Cc: Tony Battersby <tonyb@cybernetics.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| mm/dmapool.c | 22 ++++++---------------- |
| 1 file changed, 6 insertions(+), 16 deletions(-) |
| |
| --- a/mm/dmapool.c~dmapool-simplify-freeing |
| +++ a/mm/dmapool.c |
| @@ -312,16 +312,6 @@ static inline bool is_page_busy(struct d |
| return page->in_use != 0; |
| } |
| |
| -static void pool_free_page(struct dma_pool *pool, struct dma_page *page) |
| -{ |
| - dma_addr_t dma = page->dma; |
| - |
| - pool_init_page(pool, page); |
| - 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 |
| @@ -349,14 +339,14 @@ void dma_pool_destroy(struct dma_pool *p |
| 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); |
| _ |