On 4/12/2024 8:38 AM, Julien Panis wrote: > This patch introduces a member and the related accessors which can be > used to store descriptor specific additional information. This member > can store, for instance, an ID to differentiate a skb TX buffer type > from a xdpf TX buffer type. > > Signed-off-by: Julien Panis <jpanis@xxxxxxxxxxxx> > --- > drivers/net/ethernet/ti/k3-cppi-desc-pool.c | 34 ++++++++++++++++++++++++----- > drivers/net/ethernet/ti/k3-cppi-desc-pool.h | 4 ++++ > 2 files changed, 33 insertions(+), 5 deletions(-) > > diff --git a/drivers/net/ethernet/ti/k3-cppi-desc-pool.c b/drivers/net/ethernet/ti/k3-cppi-desc-pool.c > index 414bcac9dcc6..739bae8e11ee 100644 > --- a/drivers/net/ethernet/ti/k3-cppi-desc-pool.c > +++ b/drivers/net/ethernet/ti/k3-cppi-desc-pool.c > @@ -22,6 +22,7 @@ struct k3_cppi_desc_pool { > size_t mem_size; > size_t num_desc; > struct gen_pool *gen_pool; > + void **desc_infos; > }; > > void k3_cppi_desc_pool_destroy(struct k3_cppi_desc_pool *pool) > @@ -37,7 +38,11 @@ void k3_cppi_desc_pool_destroy(struct k3_cppi_desc_pool *pool) > dma_free_coherent(pool->dev, pool->mem_size, pool->cpumem, > pool->dma_addr); > > + kfree(pool->desc_infos); > + > gen_pool_destroy(pool->gen_pool); /* frees pool->name */ > + > + kfree(pool); > } > EXPORT_SYMBOL_GPL(k3_cppi_desc_pool_destroy); > > @@ -50,7 +55,7 @@ k3_cppi_desc_pool_create_name(struct device *dev, size_t size, > const char *pool_name = NULL; > int ret = -ENOMEM; > > - pool = devm_kzalloc(dev, sizeof(*pool), GFP_KERNEL); > + pool = kzalloc(sizeof(*pool), GFP_KERNEL); You could refactor pool to use the new __free cleanup annotations along with return_no_free() to automatically handle cleanup of the pool when the function exits on an error state. It's pretty recent, and i don't think its strictly necessary to do here just thought I'd point it out. Reviewed-by: Jacob Keller <jacob.e.keller@xxxxxxxxx> > if (!pool) > return ERR_PTR(ret); > > @@ -62,18 +67,21 @@ k3_cppi_desc_pool_create_name(struct device *dev, size_t size, > pool_name = kstrdup_const(name ? name : dev_name(pool->dev), > GFP_KERNEL); > if (!pool_name) > - return ERR_PTR(-ENOMEM); > + goto gen_pool_create_fail; > > pool->gen_pool = gen_pool_create(ilog2(pool->desc_size), -1); > if (!pool->gen_pool) { > - ret = -ENOMEM; > - dev_err(pool->dev, "pool create failed %d\n", ret); > kfree_const(pool_name); > goto gen_pool_create_fail; > } > > pool->gen_pool->name = pool_name; > > + pool->desc_infos = kcalloc(pool->num_desc, > + sizeof(*pool->desc_infos), GFP_KERNEL); > + if (!pool->desc_infos) > + goto gen_pool_desc_infos_alloc_fail; > + > pool->cpumem = dma_alloc_coherent(pool->dev, pool->mem_size, > &pool->dma_addr, GFP_KERNEL); > > @@ -94,9 +102,11 @@ k3_cppi_desc_pool_create_name(struct device *dev, size_t size, > dma_free_coherent(pool->dev, pool->mem_size, pool->cpumem, > pool->dma_addr); > dma_alloc_fail: > + kfree(pool->desc_infos); > +gen_pool_desc_infos_alloc_fail: > gen_pool_destroy(pool->gen_pool); /* frees pool->name */ > gen_pool_create_fail: > - devm_kfree(pool->dev, pool); > + kfree(pool); > return ERR_PTR(ret); > } > EXPORT_SYMBOL_GPL(k3_cppi_desc_pool_create_name); > @@ -144,5 +154,19 @@ void *k3_cppi_desc_pool_cpuaddr(const struct k3_cppi_desc_pool *pool) > } > EXPORT_SYMBOL_GPL(k3_cppi_desc_pool_cpuaddr); > > +void k3_cppi_desc_pool_desc_info_set(struct k3_cppi_desc_pool *pool, > + int desc_idx, void *info) > +{ > + pool->desc_infos[desc_idx] = info; > +} > +EXPORT_SYMBOL_GPL(k3_cppi_desc_pool_desc_info_set); > + > +void *k3_cppi_desc_pool_desc_info(const struct k3_cppi_desc_pool *pool, > + int desc_idx) > +{ > + return pool->desc_infos[desc_idx]; > +} > +EXPORT_SYMBOL_GPL(k3_cppi_desc_pool_desc_info); > + > MODULE_LICENSE("GPL"); > MODULE_DESCRIPTION("TI K3 CPPI5 descriptors pool API"); > diff --git a/drivers/net/ethernet/ti/k3-cppi-desc-pool.h b/drivers/net/ethernet/ti/k3-cppi-desc-pool.h > index 3c6aed0bed71..851d352b338b 100644 > --- a/drivers/net/ethernet/ti/k3-cppi-desc-pool.h > +++ b/drivers/net/ethernet/ti/k3-cppi-desc-pool.h > @@ -28,5 +28,9 @@ void k3_cppi_desc_pool_free(struct k3_cppi_desc_pool *pool, void *addr); > size_t k3_cppi_desc_pool_avail(struct k3_cppi_desc_pool *pool); > size_t k3_cppi_desc_pool_desc_size(const struct k3_cppi_desc_pool *pool); > void *k3_cppi_desc_pool_cpuaddr(const struct k3_cppi_desc_pool *pool); > +void k3_cppi_desc_pool_desc_info_set(struct k3_cppi_desc_pool *pool, > + int desc_idx, void *info); > +void *k3_cppi_desc_pool_desc_info(const struct k3_cppi_desc_pool *pool, > + int desc_idx); > > #endif /* K3_CPPI_DESC_POOL_H_ */ >