[PATCH v3] udmabuf: use kmem_cache to alloc udmabuf folio
Huan Yang
link at vivo.com
Thu Aug 1 01:39:30 UTC 2024
在 2024/8/1 1:11, Christophe JAILLET 写道:
> [Some people who received this message don't often get email from
> christophe.jaillet at wanadoo.fr. Learn why this is important at
> https://aka.ms/LearnAboutSenderIdentification ]
>
> Le 31/07/2024 à 09:37, Huan Yang a écrit :
>> The current udmabuf_folio contains a list_head and the corresponding
>> folio pointer, with a size of 24 bytes. udmabuf_folio uses kmalloc to
>> allocate memory.
>>
>> However, kmalloc is a public pool, starting from 8,16,32 bytes.
>> Additionally, if the size is not aligned with the kmalloc size, it will
>> be rounded up to the corresponding size.
>> This means that each udmabuf_folio allocation will get 32 bytes, and
>> waste 8 bytes.
>>
>> Considering that each udmabuf creates a folio corresponding to a
>> udmabuf_folio, the wasted memory can be significant in the case of
>> memory fragmentation.
>>
>> Furthermore, if udmabuf is frequently used, the allocation and
>> deallocation of udmabuf_folio will also be frequent.
>>
>> Therefore, this patch adds a kmem_cache dedicated to the allocation and
>> deallocation of udmabuf_folio.This is expected to improve the
>> performance of allocation and deallocation within the expected range,
>> while also avoiding memory waste.
>>
>> Signed-off-by: Huan Yang <link at vivo.com>
>> ---
>> v3 -> v2: fix error description.
>> v2 -> v1: fix double unregister, remove unlikely.
>> drivers/dma-buf/udmabuf.c | 19 +++++++++++++++----
>> 1 file changed, 15 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/dma-buf/udmabuf.c b/drivers/dma-buf/udmabuf.c
>> index 047c3cd2ceff..c112c58ef09a 100644
>> --- a/drivers/dma-buf/udmabuf.c
>> +++ b/drivers/dma-buf/udmabuf.c
>> @@ -24,6 +24,8 @@ static int size_limit_mb = 64;
>> module_param(size_limit_mb, int, 0644);
>> MODULE_PARM_DESC(size_limit_mb, "Max size of a dmabuf, in
>> megabytes. Default is 64.");
>>
>> +static struct kmem_cache *udmabuf_folio_cachep;
>> +
>> struct udmabuf {
>> pgoff_t pagecount;
>> struct folio **folios;
>> @@ -169,7 +171,7 @@ static void unpin_all_folios(struct list_head
>> *unpin_list)
>> unpin_folio(ubuf_folio->folio);
>>
>> list_del(&ubuf_folio->list);
>> - kfree(ubuf_folio);
>> + kmem_cache_free(udmabuf_folio_cachep, ubuf_folio);
>> }
>> }
>>
>> @@ -178,7 +180,7 @@ static int add_to_unpin_list(struct list_head
>> *unpin_list,
>> {
>> struct udmabuf_folio *ubuf_folio;
>>
>> - ubuf_folio = kzalloc(sizeof(*ubuf_folio), GFP_KERNEL);
>> + ubuf_folio = kmem_cache_alloc(udmabuf_folio_cachep, GFP_KERNEL);
>> if (!ubuf_folio)
>> return -ENOMEM;
>>
>> @@ -491,11 +493,20 @@ static int __init udmabuf_dev_init(void)
>> DMA_BIT_MASK(64));
>> if (ret < 0) {
>> pr_err("Could not setup DMA mask for udmabuf device\n");
>> - misc_deregister(&udmabuf_misc);
>> - return ret;
>> + goto err;
>> + }
>> +
>> + udmabuf_folio_cachep = KMEM_CACHE(udmabuf_folio, 0);
>> + if (!udmabuf_folio_cachep) {
>> + ret = -ENOMEM;
>> + goto err;
>> }
>>
>> return 0;
>> +
>> +err:
>> + misc_deregister(&udmabuf_misc);
>> + return ret;
>> }
>>
>> static void __exit udmabuf_dev_exit(void)
>
> Hi,
>
> should a kmem_cache_destroy() be also added in udmabuf_dev_exit()?
Yes, thanks for point this.
>
> CJ
>
>>
>> base-commit: cd19ac2f903276b820f5d0d89de0c896c27036ed
>
More information about the dri-devel
mailing list