From: Jun Yang <[email protected]>
The scatter-gather mbuf pool used to build multi-segment Tx frames was
a global owned by the dpaa2 net PMD (dpaa2_tx_sg_pool), created lazily
on first probe and reference-counted with dpaa2_valid_dev. This tied a
bus-wide resource to the net driver and duplicated primary/secondary
lookup logic.
Create the SG pool once on the fslmc bus instead:
- Allocate "dpaa2_sg_pool" in rte_fslmc_probe() and free it in
rte_fslmc_close(), storing the handle in fslmc_bus_info.mem_pool.
- Expose the pool sizing via DPAA2_TX_SG_POOL_SIZE,
DPAA2_TX_SG_POOL_CACHE_SIZE and DPAA2_TX_SG_POOL_ELEM_SIZE in the
bus driver header.
Update the net PMD to consume it:
- dpaa2_dev_init() takes the pool from the device's bus_info and
stores it in priv->tx_sg_pool; dpaa2_dev_close() clears the
reference.
- Remove dpaa2_tx_sg_pool_init(), the dpaa2_tx_sg_pool /
dpaa2_valid_dev globals, and the now-unused DPAA2_MAX_SGS,
DPAA2_POOL_SIZE, DPAA2_POOL_CACHE_SIZE and struct sw_buf_free
definitions.
- Bound the SG receive walk by the pool element size instead of
DPAA2_MAX_SGS.
Signed-off-by: Jun Yang <[email protected]>
---
drivers/bus/fslmc/bus_fslmc_driver.h | 4 +++
drivers/bus/fslmc/fslmc_bus.c | 9 ++++++
drivers/net/dpaa2/dpaa2_ethdev.c | 44 ++--------------------------
drivers/net/dpaa2/dpaa2_ethdev.h | 20 ++-----------
drivers/net/dpaa2/dpaa2_rxtx.c | 9 +++---
5 files changed, 22 insertions(+), 64 deletions(-)
diff --git a/drivers/bus/fslmc/bus_fslmc_driver.h
b/drivers/bus/fslmc/bus_fslmc_driver.h
index 3ba865e632..4d56da45b3 100644
--- a/drivers/bus/fslmc/bus_fslmc_driver.h
+++ b/drivers/bus/fslmc/bus_fslmc_driver.h
@@ -89,6 +89,10 @@ enum rte_dpaa2_dev_type {
DPAA2_DEVTYPE_MAX,
};
+#define DPAA2_TX_SG_POOL_SIZE 2048
+#define DPAA2_TX_SG_POOL_CACHE_SIZE 256
+#define DPAA2_TX_SG_POOL_ELEM_SIZE 2048
+
struct rte_fslmc_bus_info {
void *mem_pool;
int sp_protocol;
diff --git a/drivers/bus/fslmc/fslmc_bus.c b/drivers/bus/fslmc/fslmc_bus.c
index a418f9a420..d20103ee36 100644
--- a/drivers/bus/fslmc/fslmc_bus.c
+++ b/drivers/bus/fslmc/fslmc_bus.c
@@ -690,6 +690,10 @@ rte_fslmc_probe(struct rte_bus *bus)
return ret;
}
+ fslmc_bus_info.mem_pool = rte_pktmbuf_pool_create("dpaa2_sg_pool",
+ DPAA2_TX_SG_POOL_SIZE, DPAA2_TX_SG_POOL_CACHE_SIZE, 0,
+ DPAA2_TX_SG_POOL_ELEM_SIZE, rte_socket_id());
+
return rte_bus_generic_probe(bus);
}
@@ -750,6 +754,11 @@ rte_fslmc_close(struct rte_bus *bus __rte_unused)
{
int ret = 0;
+ if (fslmc_bus_info.mem_pool) {
+ rte_mempool_free(fslmc_bus_info.mem_pool);
+ fslmc_bus_info.mem_pool = NULL;
+ }
+
ret = fslmc_bus_close_group();
if (ret)
DPAA2_BUS_INFO("Unable to close devices %d", ret);
diff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c
index 88a0f9bdbb..995e0db1f2 100644
--- a/drivers/net/dpaa2/dpaa2_ethdev.c
+++ b/drivers/net/dpaa2/dpaa2_ethdev.c
@@ -203,9 +203,6 @@ dpaa2_dist_size_is_supported(uint16_t n)
return false;
}
-int dpaa2_valid_dev;
-struct rte_mempool *dpaa2_tx_sg_pool;
-
struct dpaa2_xstats_seq {
struct dpni_statistics_page_0 pg0;
struct dpni_statistics_page_1 pg1;
@@ -2402,6 +2399,7 @@ dpaa2_dev_close(struct rte_eth_dev *dev)
/* Free the allocated memory for ethernet private data and dpni*/
priv->hw = NULL;
+ priv->tx_sg_pool = NULL;
dev->process_private = NULL;
rte_free(dpni);
@@ -4195,6 +4193,7 @@ dpaa2_dev_init(struct rte_eth_dev *eth_dev)
eth_dev->data->name, dpaa2_dev->ep_name);
priv->speed_capa = dpaa2_dev_get_speed_capability(eth_dev);
+ priv->tx_sg_pool = dpaa2_dev->bus_info->mem_pool;
return 0;
init_err:
@@ -4244,35 +4243,6 @@ rte_pmd_dpaa2_ep_name(uint32_t eth_id)
return priv->ep_name;
}
-static int dpaa2_tx_sg_pool_init(void)
-{
- char name[RTE_MEMZONE_NAMESIZE];
-
- if (dpaa2_tx_sg_pool)
- return 0;
-
- sprintf(name, "dpaa2_mbuf_tx_sg_pool");
- if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
- dpaa2_tx_sg_pool = rte_pktmbuf_pool_create(name,
- DPAA2_POOL_SIZE,
- DPAA2_POOL_CACHE_SIZE, 0,
- DPAA2_MAX_SGS * sizeof(struct qbman_sge),
- rte_socket_id());
- if (!dpaa2_tx_sg_pool) {
- DPAA2_PMD_ERR("SG pool creation failed");
- return -ENOMEM;
- }
- } else {
- dpaa2_tx_sg_pool = rte_mempool_lookup(name);
- if (!dpaa2_tx_sg_pool) {
- DPAA2_PMD_ERR("SG pool lookup failed");
- return -ENOMEM;
- }
- }
-
- return 0;
-}
-
static int
rte_dpaa2_probe(struct rte_dpaa2_driver *dpaa2_drv,
struct rte_dpaa2_device *dpaa2_dev)
@@ -4326,11 +4296,7 @@ rte_dpaa2_probe(struct rte_dpaa2_driver *dpaa2_drv,
/* Invoke PMD device initialization function */
diag = dpaa2_dev_init(eth_dev);
if (!diag) {
- diag = dpaa2_tx_sg_pool_init();
- if (diag)
- return diag;
rte_eth_dev_probing_finish(eth_dev);
- dpaa2_valid_dev++;
return 0;
}
@@ -4353,12 +4319,6 @@ rte_dpaa2_remove(struct rte_dpaa2_device *dpaa2_dev)
ret = rte_eth_dev_release_port(eth_dev);
}
- dpaa2_valid_dev--;
- if (!dpaa2_valid_dev) {
- rte_mempool_free(dpaa2_tx_sg_pool);
- dpaa2_tx_sg_pool = NULL;
- }
-
return ret;
}
diff --git a/drivers/net/dpaa2/dpaa2_ethdev.h b/drivers/net/dpaa2/dpaa2_ethdev.h
index e4dc7b7e4f..91414114ac 100644
--- a/drivers/net/dpaa2/dpaa2_ethdev.h
+++ b/drivers/net/dpaa2/dpaa2_ethdev.h
@@ -223,24 +223,6 @@
#define DPAA2_MAC_STATS_INDEX_DMA_SIZE (DPAA2_MAC_NUM_STATS * sizeof(uint32_t))
#define DPAA2_MAC_STATS_VALUE_DMA_SIZE (DPAA2_MAC_NUM_STATS * sizeof(uint64_t))
-/* Global pool used by driver for SG list TX */
-extern struct rte_mempool *dpaa2_tx_sg_pool;
-/* Maximum SG segments */
-#define DPAA2_MAX_SGS 128
-/* SG pool size */
-#define DPAA2_POOL_SIZE 2048
-/* SG pool cache size */
-#define DPAA2_POOL_CACHE_SIZE 256
-/* structure to free external and indirect
- * buffers.
- */
-struct sw_buf_free {
- /* To which packet this segment belongs */
- uint16_t pkt_id;
- /* The actual segment */
- struct rte_mbuf *seg;
-};
-
/* Externally defined */
extern const struct rte_flow_ops dpaa2_flow_ops;
@@ -478,6 +460,8 @@ struct dpaa2_dev_priv {
*/
union dpni_statistics
pg_xstats[DPNI_MAX_STATISTICS_PAGE_ID][DPNI_STAT_MAX_PARAM];
+ struct rte_mempool *tx_sg_pool;
+
LIST_HEAD(, dpaa2_dev_flow) flows;
LIST_HEAD(, dpaa2_dev_meter_profile) profiles;
LIST_HEAD(, dpaa2_dev_meter_policy) policies;
diff --git a/drivers/net/dpaa2/dpaa2_rxtx.c b/drivers/net/dpaa2/dpaa2_rxtx.c
index a44b991d1b..6d12e6818d 100644
--- a/drivers/net/dpaa2/dpaa2_rxtx.c
+++ b/drivers/net/dpaa2/dpaa2_rxtx.c
@@ -456,7 +456,7 @@ dpaa2_eth_sg_fd_to_mbuf(struct dpaa2_dev_priv *priv, const
struct qbman_fd *fd)
(void **)&first_seg, 1, 1);
#endif
cur_seg = first_seg;
- while (!DPAA2_SG_IS_FINAL(sge) && i < DPAA2_MAX_SGS) {
+ while (!DPAA2_SG_IS_FINAL(sge)) {
sge = &sgt[i++];
sg_addr = DPAA2_IOVA_TO_VADDR(DPAA2_GET_FLE_ADDR(sge));
next_seg = DPAA2_INLINE_MBUF_FROM_BUF(sg_addr,
@@ -746,6 +746,7 @@ dpaa2_dev_tx_mbuf_to_sg_fd(struct rte_mempool *hw_mp,
uint16_t nb_segs = mbuf->nb_segs;
uint32_t sg_size = nb_segs * sizeof(struct qbman_sge);
struct rte_mempool *mp;
+ struct dpaa2_dev_priv *priv = txq->eth_data->dev_private;
if (conf == DPAA2_TX_DYNAMIC_CONF) {
while (cur_seg) {
@@ -789,8 +790,8 @@ dpaa2_dev_tx_mbuf_to_sg_fd(struct rte_mempool *hw_mp,
DPAA2_SET_FD_OFFSET(fd, offset);
} else {
sg_mbuf = NULL;
- if (dpaa2_tx_sg_pool)
- sg_mbuf = rte_pktmbuf_alloc(dpaa2_tx_sg_pool);
+ if (priv->tx_sg_pool)
+ sg_mbuf = rte_pktmbuf_alloc(priv->tx_sg_pool);
if (!sg_mbuf) {
DPAA2_PMD_DP_DEBUG("No memory to allocate S/G table");
return -ENOMEM;
@@ -803,7 +804,7 @@ dpaa2_dev_tx_mbuf_to_sg_fd(struct rte_mempool *hw_mp,
DPAA2_SET_ONLY_FD_BPID(fd, MAX_BPID);
DPAA2_SET_FD_IVP(fd);
} else {
- DPAA2_SET_ONLY_FD_BPID(fd,
mempool_to_bpid(dpaa2_tx_sg_pool));
+ DPAA2_SET_ONLY_FD_BPID(fd,
mempool_to_bpid(priv->tx_sg_pool));
}
DPAA2_SET_FD_OFFSET(fd, sg_mbuf->data_off);
offset = sg_mbuf->data_off;
--
2.43.0