Message ID | 20240223-am65-cpsw-xdp-basic-v9-2-2c194217e325@baylibre.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 84d767a3c0b5e6b7d13bcaa64405c0613138161f |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | Add minimal XDP support to TI AM65 CPSW Ethernet driver | expand |
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@baylibre.com> > --- > 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@intel.com> > 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_ */ >
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); 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_ */
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@baylibre.com> --- 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(-)