Message ID | 20240223-am65-cpsw-xdp-basic-v4-2-2e45e5dec048@baylibre.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | Add minimal XDP support to TI AM65 CPSW Ethernet driver | expand |
On 2024-03-25 at 21:30:36, Julien Panis (jpanis@baylibre.com) 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 | 24 ++++++++++++++++++++++++ > drivers/net/ethernet/ti/k3-cppi-desc-pool.h | 2 ++ > 2 files changed, 26 insertions(+) > > diff --git a/drivers/net/ethernet/ti/k3-cppi-desc-pool.c b/drivers/net/ethernet/ti/k3-cppi-desc-pool.c > index fe8203c05731..d0c68d722ef2 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) > @@ -72,6 +73,15 @@ k3_cppi_desc_pool_create_name(struct device *dev, size_t size, > goto gen_pool_create_fail; > } > > + pool->desc_infos = devm_kcalloc(dev, pool->num_desc, > + sizeof(*pool->desc_infos), GFP_KERNEL); This should be freed as well, right ? .set_channels() in ethtool ops cleans pools; but not this. This wont result in memory leak ? s/devm_kcalloc/kcalloc if my comment is correct. > + if (!pool->desc_infos) { > + ret = -ENOMEM; > + dev_err(pool->dev, "pool descriptor infos alloc failed %d\n", ret); > + kfree_const(pool_name); > + goto gen_pool_desc_infos_alloc_fail; > + } > + > pool->gen_pool->name = pool_name; > > pool->cpumem = dma_alloc_coherent(pool->dev, pool->mem_size, > @@ -94,6 +104,8 @@ 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: > + devm_kfree(pool->dev, 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); > @@ -144,5 +156,17 @@ void *k3_cppi_desc_pool_cpuaddr(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(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 149d5579a5e2..0076596307e7 100644 > --- a/drivers/net/ethernet/ti/k3-cppi-desc-pool.h > +++ b/drivers/net/ethernet/ti/k3-cppi-desc-pool.h > @@ -28,5 +28,7 @@ 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(struct k3_cppi_desc_pool *pool); > void *k3_cppi_desc_pool_cpuaddr(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(struct k3_cppi_desc_pool *pool, int desc_idx); > > #endif /* K3_CPPI_DESC_POOL_H_ */ > > -- > 2.37.3 >
diff --git a/drivers/net/ethernet/ti/k3-cppi-desc-pool.c b/drivers/net/ethernet/ti/k3-cppi-desc-pool.c index fe8203c05731..d0c68d722ef2 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) @@ -72,6 +73,15 @@ k3_cppi_desc_pool_create_name(struct device *dev, size_t size, goto gen_pool_create_fail; } + pool->desc_infos = devm_kcalloc(dev, pool->num_desc, + sizeof(*pool->desc_infos), GFP_KERNEL); + if (!pool->desc_infos) { + ret = -ENOMEM; + dev_err(pool->dev, "pool descriptor infos alloc failed %d\n", ret); + kfree_const(pool_name); + goto gen_pool_desc_infos_alloc_fail; + } + pool->gen_pool->name = pool_name; pool->cpumem = dma_alloc_coherent(pool->dev, pool->mem_size, @@ -94,6 +104,8 @@ 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: + devm_kfree(pool->dev, 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); @@ -144,5 +156,17 @@ void *k3_cppi_desc_pool_cpuaddr(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(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 149d5579a5e2..0076596307e7 100644 --- a/drivers/net/ethernet/ti/k3-cppi-desc-pool.h +++ b/drivers/net/ethernet/ti/k3-cppi-desc-pool.h @@ -28,5 +28,7 @@ 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(struct k3_cppi_desc_pool *pool); void *k3_cppi_desc_pool_cpuaddr(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(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 | 24 ++++++++++++++++++++++++ drivers/net/ethernet/ti/k3-cppi-desc-pool.h | 2 ++ 2 files changed, 26 insertions(+)