void bman_test_high(void) { struct bman_pool_params pparams = { .flags = BMAN_POOL_FLAG_DEPLETION | BMAN_POOL_FLAG_DYNAMIC_BPID, .cb = depletion_cb, .cb_ctx = POOL_OPAQUE, }; int i, loops = LOOPS; bufs_init(); pr_info("BMAN: --- starting high-level test ---\n"); pool = bman_new_pool(&pparams); BUG_ON(!pool); /*******************/ /* Release buffers */ /*******************/ do_loop: i = 0; while (i < NUM_BUFS) { u32 flags = BMAN_RELEASE_FLAG_WAIT; int num = 8; if ((i + num) > NUM_BUFS) num = NUM_BUFS - i; if ((i + num) == NUM_BUFS) flags |= BMAN_RELEASE_FLAG_WAIT_SYNC; if (bman_release(pool, bufs_in + i, num, flags)) panic("bman_release() failed\n"); i += num; } /*******************/ /* Acquire buffers */ /*******************/ while (i > 0) { int tmp, num = 8; if (num > i) num = i; tmp = bman_acquire(pool, bufs_out + i - num, num, 0); BUG_ON(tmp != num); i -= num; } i = bman_acquire(pool, NULL, 1, 0); BUG_ON(i > 0); bufs_confirm(); if (--loops) goto do_loop; /************/ /* Clean up */ /************/ bman_free_pool(pool); pr_info("BMAN: --- finished high-level test ---\n"); }
static void dpaa_mbuf_free_pool(struct rte_mempool *mp) { struct dpaa_bp_info *bp_info = DPAA_MEMPOOL_TO_POOL_INFO(mp); MEMPOOL_INIT_FUNC_TRACE(); if (bp_info) { bman_free_pool(bp_info->bp); DPAA_MEMPOOL_INFO("BMAN pool freed for bpid =%d", bp_info->bpid); rte_free(mp->pool_data); mp->pool_data = NULL; } }
void fsl_buffer_pool_init(int global, struct packet_pool_cfg *pool_cfg) { struct bman_pool_params params = { .bpid = 0, .flags = BMAN_ACQUIRE_FLAG_STOCKPILE, .cb = 0, .cb_ctx = 0 }; struct packet_pool_cfg *bp = pool_cfg; for (; bp->bpid != -1; bp++) { if (helper_pool[bp->bpid] == NULL) { params.bpid = bp->bpid; helper_pool[bp->bpid] = bman_new_pool(¶ms); if (helper_pool[bp->bpid] == NULL) { TRACE("error: bman_new_pool(%d) failed\n", bp->bpid); continue; } } } if (global) fsl_buffer_pool_fill(pool_cfg); } void fsl_buffer_pool_clean(void) { int j; struct bman_pool *p; for (j = 0; j < HLP_BPOOL_MAX; j++) { p = helper_pool[j]; if (p) { bman_flush_stockpile(p, 0); bman_free_pool(p); } } }
static int dpaa_mbuf_create_pool(struct rte_mempool *mp) { struct bman_pool *bp; struct bm_buffer bufs[8]; struct dpaa_bp_info *bp_info; uint8_t bpid; int num_bufs = 0, ret = 0; struct bman_pool_params params = { .flags = BMAN_POOL_FLAG_DYNAMIC_BPID }; MEMPOOL_INIT_FUNC_TRACE(); bp = bman_new_pool(¶ms); if (!bp) { DPAA_MEMPOOL_ERR("bman_new_pool() failed"); return -ENODEV; } bpid = bman_get_params(bp)->bpid; /* Drain the pool of anything already in it. */ do { /* Acquire is all-or-nothing, so we drain in 8s, * then in 1s for the remainder. */ if (ret != 1) ret = bman_acquire(bp, bufs, 8, 0); if (ret < 8) ret = bman_acquire(bp, bufs, 1, 0); if (ret > 0) num_bufs += ret; } while (ret > 0); if (num_bufs) DPAA_MEMPOOL_WARN("drained %u bufs from BPID %d", num_bufs, bpid); rte_dpaa_bpid_info[bpid].mp = mp; rte_dpaa_bpid_info[bpid].bpid = bpid; rte_dpaa_bpid_info[bpid].size = mp->elt_size; rte_dpaa_bpid_info[bpid].bp = bp; rte_dpaa_bpid_info[bpid].meta_data_size = sizeof(struct rte_mbuf) + rte_pktmbuf_priv_size(mp); rte_dpaa_bpid_info[bpid].dpaa_ops_index = mp->ops_index; rte_dpaa_bpid_info[bpid].ptov_off = 0; rte_dpaa_bpid_info[bpid].flags = 0; bp_info = rte_malloc(NULL, sizeof(struct dpaa_bp_info), RTE_CACHE_LINE_SIZE); if (!bp_info) { DPAA_MEMPOOL_WARN("Memory allocation failed for bp_info"); bman_free_pool(bp); return -ENOMEM; } rte_memcpy(bp_info, (void *)&rte_dpaa_bpid_info[bpid], sizeof(struct dpaa_bp_info)); mp->pool_data = (void *)bp_info; DPAA_MEMPOOL_INFO("BMAN pool created for bpid =%d", bpid); return 0; }