Hi Huan, > Subject: [PATCH v5 5/7] udmabuf: introduce udmabuf init and deinit helper > > After udmabuf is allocated, its resources need to be initialized, > including various array structures. The current array structure has > already been greatly expanded. > > Also, before udmabuf needs to be kfree, the occupied resources need to > be released. > > This part is repetitive and maybe overlooked. > > This patch give a helper function when init and deinit, by this, > deduce duplicate code. *reduce If possible, please try to improve the wording and grammatical correctness in the commit messages of other patches as well. > > Signed-off-by: Huan Yang <link@xxxxxxxx> > --- > drivers/dma-buf/udmabuf.c | 52 +++++++++++++++++++++++---------------- > 1 file changed, 31 insertions(+), 21 deletions(-) > > diff --git a/drivers/dma-buf/udmabuf.c b/drivers/dma-buf/udmabuf.c > index ca2b21c5c57f..254d9ec3d9f3 100644 > --- a/drivers/dma-buf/udmabuf.c > +++ b/drivers/dma-buf/udmabuf.c > @@ -226,6 +226,28 @@ static int add_to_unpin_list(struct list_head > *unpin_list, > return 0; > } > > +static __always_inline int init_udmabuf(struct udmabuf *ubuf, pgoff_t > pgcnt) > +{ > + INIT_LIST_HEAD(&ubuf->unpin_list); > + > + ubuf->folios = kvmalloc_array(pgcnt, sizeof(*ubuf->folios), > GFP_KERNEL); > + if (!ubuf->folios) > + return -ENOMEM; > + > + ubuf->offsets = kvcalloc(pgcnt, sizeof(*ubuf->offsets), GFP_KERNEL); > + if (!ubuf->offsets) > + return -ENOMEM; > + > + return 0; > +} > + > +static __always_inline void deinit_udmabuf(struct udmabuf *ubuf) > +{ > + unpin_all_folios(&ubuf->unpin_list); > + kvfree(ubuf->offsets); > + kvfree(ubuf->folios); > +} > + > static void release_udmabuf(struct dma_buf *buf) > { > struct udmabuf *ubuf = buf->priv; > @@ -234,9 +256,7 @@ static void release_udmabuf(struct dma_buf *buf) > if (ubuf->sg) > put_sg_table(dev, ubuf->sg, DMA_BIDIRECTIONAL); > > - unpin_all_folios(&ubuf->unpin_list); > - kvfree(ubuf->offsets); > - kvfree(ubuf->folios); > + deinit_udmabuf(ubuf); > kfree(ubuf); > } > > @@ -396,33 +416,24 @@ static long udmabuf_create(struct miscdevice > *device, > if (!ubuf) > return -ENOMEM; > > - INIT_LIST_HEAD(&ubuf->unpin_list); > pglimit = (size_limit_mb * 1024 * 1024) >> PAGE_SHIFT; > for (i = 0; i < head->count; i++) { > if (!PAGE_ALIGNED(list[i].offset)) > - goto err; > + goto err_noinit; > if (!PAGE_ALIGNED(list[i].size)) > - goto err; > + goto err_noinit; > > pgcnt += list[i].size >> PAGE_SHIFT; > if (pgcnt > pglimit) > - goto err; > + goto err_noinit; > } > > if (!pgcnt) > - goto err; > + goto err_noinit; > > - ubuf->folios = kvmalloc_array(pgcnt, sizeof(*ubuf->folios), > GFP_KERNEL); > - if (!ubuf->folios) { > - ret = -ENOMEM; > + ret = init_udmabuf(ubuf, pgcnt); > + if (ret) > goto err; > - } > - > - ubuf->offsets = kvcalloc(pgcnt, sizeof(*ubuf->offsets), GFP_KERNEL); > - if (!ubuf->offsets) { > - ret = -ENOMEM; > - goto err; > - } > > for (i = 0; i < head->count; i++) { > struct file *memfd = fget(list[i].memfd); > @@ -446,9 +457,8 @@ static long udmabuf_create(struct miscdevice > *device, > return ret; > > err: > - unpin_all_folios(&ubuf->unpin_list); > - kvfree(ubuf->offsets); > - kvfree(ubuf->folios); > + deinit_udmabuf(ubuf); > +err_noinit: I don't really see the need for this new label, but I guess it makes things a bit clear. Acked-by: Vivek Kasireddy <vivek.kasireddy@xxxxxxxxx> > kfree(ubuf); > return ret; > } > -- > 2.45.2