From owner-dev-commits-src-main@freebsd.org Fri Jun 18 21:49:05 2021 Return-Path: Delivered-To: dev-commits-src-main@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 183B064D897; Fri, 18 Jun 2021 21:49:05 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4G6CHN75SBz3MvW; Fri, 18 Jun 2021 21:49:04 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id DB32F239F; Fri, 18 Jun 2021 21:49:04 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 15ILn48G069171; Fri, 18 Jun 2021 21:49:04 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 15ILn404069169; Fri, 18 Jun 2021 21:49:04 GMT (envelope-from git) Date: Fri, 18 Jun 2021 21:49:04 GMT Message-Id: <202106182149.15ILn404069169@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: "Bjoern A. Zeeb" Subject: git: 2afeed13b586 - main - LinuxKPI: add dmam_pool_create() support MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: bz X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 2afeed13b58653578c6ce5154afa6fb59f6b47f0 Auto-Submitted: auto-generated X-BeenThere: dev-commits-src-main@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Commit messages for the main branch of the src repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 18 Jun 2021 21:49:05 -0000 The branch main has been updated by bz: URL: https://cgit.FreeBSD.org/src/commit/?id=2afeed13b58653578c6ce5154afa6fb59f6b47f0 commit 2afeed13b58653578c6ce5154afa6fb59f6b47f0 Author: Bjoern A. Zeeb AuthorDate: 2021-05-28 11:11:28 +0000 Commit: Bjoern A. Zeeb 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)