[v4 04/10] bus/dpaa: optimize bman acquire/release

Stephen Hemminger stephen at networkplumber.org
Sun Jun 29 18:35:47 CEST 2025


On Wed, 11 Jun 2025 12:40:33 +0530
vanshika.shukla at nxp.com wrote:

> -#define BMAN_BUF_MASK 0x0000fffffffffffful
> +RTE_EXPORT_INTERNAL_SYMBOL(bman_release_fast)
> +int
> +bman_release_fast(struct bman_pool *pool, const uint64_t *bufs,
> +	uint8_t num)
> +{
> +	struct bman_portal *p;
> +	struct bm_rcr_entry *r;
> +	uint8_t i, avail;
> +	uint64_t bpid = pool->params.bpid;
> +	struct bm_hw_buf_desc bm_bufs[FSL_BM_BURST_MAX];
> +
> +#ifdef RTE_LIBRTE_DPAA_HWDEBUG
> +	if (!num || (num > FSL_BM_BURST_MAX))
> +		return -EINVAL;
> +	if (pool->params.flags & BMAN_POOL_FLAG_NO_RELEASE)
> +		return -EINVAL;
> +#endif
> +
> +	p = get_affine_portal();
> +	avail = bm_rcr_get_avail(&p->p);
> +	if (avail < 2)
> +		update_rcr_ci(p, avail);
> +	r = bm_rcr_start(&p->p);
> +	if (unlikely(!r))
> +		return -EBUSY;
> +
> +	/*
> +	 * we can copy all but the first entry, as this can trigger badness
> +	 * with the valid-bit
> +	 */
> +	bm_bufs[0].bpid = bpid;
> +	bm_bufs[0].hi_addr = cpu_to_be16(HI16_OF_U48(bufs[0]));
> +	bm_bufs[0].lo_addr = cpu_to_be32(LO32_OF_U48(bufs[0]));
> +	for (i = 1; i < num; i++) {
> +		bm_bufs[i].hi_addr = cpu_to_be16(HI16_OF_U48(bufs[i]));
> +		bm_bufs[i].lo_addr = cpu_to_be32(LO32_OF_U48(bufs[i]));
> +	}
> +
> +	rte_memcpy(r->bufs, bm_bufs, sizeof(struct bm_buffer) * num);

Use memcpy instead. There are more compiler and security checks around
memcpy().

> +
> +	bm_rcr_pvb_commit(&p->p, BM_RCR_VERB_CMD_BPID_SINGLE |
> +		(num & BM_RCR_VERB_BUFCOUNT_MASK));
> +
> +	return 0;
> +}


More information about the dev mailing list