Introduce struct dpdk_mp_config to pass mempool parameters (name, mtu,
socket_id, queue sizes) to dpdk_mp_create() and dpdk_mp_get() instead
of passing the full netdev_dpdk object.

This decouples mempool creation from the netdev_dpdk internals and
will allow splitting the parts that are common between ethernet and
vhost ports and the parts that are not.

Signed-off-by: David Marchand <[email protected]>
---
 lib/netdev-dpdk.c | 78 ++++++++++++++++++++++++++++++++---------------
 1 file changed, 54 insertions(+), 24 deletions(-)

diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 4c34372389..1e0dd9a492 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -740,12 +740,22 @@ dpdk_mp_sweep(void) OVS_REQUIRES(dpdk_mp_mutex)
     }
 }
 
+struct dpdk_mp_config {
+    char *name;
+    int mtu;
+    int socket_id;
+    int n_rxq;
+    int rxq_size;
+    int n_txq;
+    int txq_size;
+};
+
 /* Calculating the required number of mbufs differs depending on the
  * mempool model being used. Check if per port memory is in use before
  * calculating.
  */
 static uint32_t
-dpdk_calculate_mbufs(struct netdev_dpdk *dev, int mtu)
+dpdk_calculate_mbufs(struct dpdk_mp_config *cfg, int mtu)
 {
     uint32_t n_mbufs;
 
@@ -770,9 +780,9 @@ dpdk_calculate_mbufs(struct netdev_dpdk *dev, int mtu)
          * + <packets in the pmd threads>
          * + <additional memory for corner cases>
          */
-        n_mbufs = dev->requested_n_rxq * dev->requested_rxq_size
-                  + dev->requested_n_txq * dev->requested_txq_size
-                  + MIN(RTE_MAX_LCORE, dev->requested_n_rxq) * NETDEV_MAX_BURST
+        n_mbufs = cfg->n_rxq * cfg->rxq_size
+                  + cfg->n_txq * cfg->txq_size
+                  + MIN(RTE_MAX_LCORE, cfg->n_rxq) * NETDEV_MAX_BURST
                   + MIN_NB_MBUF;
     }
 
@@ -780,11 +790,11 @@ dpdk_calculate_mbufs(struct netdev_dpdk *dev, int mtu)
 }
 
 static struct dpdk_mp *
-dpdk_mp_create(struct netdev_dpdk *dev, int mtu)
+dpdk_mp_create(struct dpdk_mp_config *cfg, int mtu)
 {
     char mp_name[RTE_MEMPOOL_NAMESIZE];
-    const char *netdev_name = netdev_get_name(&dev->up);
-    int socket_id = dev->requested_socket_id;
+    const char *netdev_name = cfg->name;
+    int socket_id = cfg->socket_id;
     uint32_t n_mbufs = 0;
     uint32_t mbuf_size = 0;
     uint32_t aligned_mbuf_size = 0;
@@ -805,7 +815,7 @@ dpdk_mp_create(struct netdev_dpdk *dev, int mtu)
     /* Get the size of each mbuf, based on the MTU */
     mbuf_size = MTU_TO_FRAME_LEN(mtu);
 
-    n_mbufs = dpdk_calculate_mbufs(dev, mtu);
+    n_mbufs = dpdk_calculate_mbufs(cfg, mtu);
 
     do {
         /* Full DPDK memory pool name must be unique and cannot be
@@ -830,7 +840,7 @@ dpdk_mp_create(struct netdev_dpdk *dev, int mtu)
                   "on socket %d for %d Rx and %d Tx queues, "
                   "cache line size of %u",
                   netdev_name, n_mbufs, mbuf_size, socket_id,
-                  dev->requested_n_rxq, dev->requested_n_txq,
+                  cfg->n_rxq, cfg->n_txq,
                   RTE_CACHE_LINE_SIZE);
 
         /* The size of the mbuf's private area (i.e. area that holds OvS'
@@ -891,8 +901,9 @@ dpdk_mp_create(struct netdev_dpdk *dev, int mtu)
 }
 
 static struct dpdk_mp *
-dpdk_mp_get(struct netdev_dpdk *dev, int mtu)
+dpdk_mp_get(struct dpdk_mp_config *cfg)
 {
+    int mtu = FRAME_LEN_TO_MTU(dpdk_buf_size(cfg->mtu));
     struct dpdk_mp *dmp = NULL, *next;
     bool reuse = false;
 
@@ -902,10 +913,10 @@ dpdk_mp_get(struct netdev_dpdk *dev, int mtu)
     if (!per_port_memory) {
         /* If user has provided defined mempools, check if one is suitable
          * and get new buffer size.*/
-        mtu = dpdk_get_user_adjusted_mtu(mtu, dev->requested_mtu,
-                                         dev->requested_socket_id);
+        mtu = dpdk_get_user_adjusted_mtu(mtu, cfg->mtu,
+                                         cfg->socket_id);
         LIST_FOR_EACH (dmp, list_node, &dpdk_mp_list) {
-            if (dmp->socket_id == dev->requested_socket_id
+            if (dmp->socket_id == cfg->socket_id
                 && dmp->mtu == mtu) {
                 VLOG_DBG("Reusing mempool \"%s\"", dmp->mp->name);
                 dmp->refcount++;
@@ -918,7 +929,7 @@ dpdk_mp_get(struct netdev_dpdk *dev, int mtu)
     dpdk_mp_sweep();
 
     if (!reuse) {
-        dmp = dpdk_mp_create(dev, mtu);
+        dmp = dpdk_mp_create(cfg, mtu);
         if (dmp) {
             /* Shared memory will hit the reuse case above so will not
              * request a mempool that already exists but we need to check
@@ -967,26 +978,26 @@ dpdk_mp_put(struct dpdk_mp *dmp)
  * requested_mtu. On success, a new configuration will be applied.
  * On error, device will be left unchanged. */
 static int
-netdev_dpdk_mempool_configure(struct netdev_dpdk *dev)
+netdev_dpdk_mempool_configure(struct netdev_dpdk *dev,
+                              struct dpdk_mp_config *cfg)
     OVS_REQUIRES(dev->mutex)
 {
-    uint32_t buf_size = dpdk_buf_size(dev->requested_mtu);
     struct dpdk_mp *dmp;
     int ret = 0;
 
     /* With shared memory we do not need to configure a mempool if the MTU
      * and socket ID have not changed, the previous configuration is still
      * valid so return 0 */
-    if (!per_port_memory && dev->mtu == dev->requested_mtu
-        && dev->socket_id == dev->requested_socket_id) {
+    if (!per_port_memory && dev->mtu == cfg->mtu
+        && dev->socket_id == cfg->socket_id) {
         return ret;
     }
 
-    dmp = dpdk_mp_get(dev, FRAME_LEN_TO_MTU(buf_size));
+    dmp = dpdk_mp_get(cfg);
     if (!dmp) {
         VLOG_ERR("Failed to create memory pool for netdev "
                  "%s, with MTU %d on socket %d: %s\n",
-                 dev->up.name, dev->requested_mtu, dev->requested_socket_id,
+                 dev->up.name, cfg->mtu, cfg->socket_id,
                  rte_strerror(rte_errno));
         ret = rte_errno;
     } else {
@@ -1004,8 +1015,8 @@ netdev_dpdk_mempool_configure(struct netdev_dpdk *dev)
             dpdk_mp_put(dev->dpdk_mp);
         }
         dev->dpdk_mp = dmp;
-        dev->mtu = dev->requested_mtu;
-        dev->socket_id = dev->requested_socket_id;
+        dev->mtu = cfg->mtu;
+        dev->socket_id = cfg->socket_id;
         dev->max_packet_len = MTU_TO_FRAME_LEN(dev->mtu);
     }
 
@@ -6323,6 +6334,7 @@ static int
 netdev_dpdk_eth_reconfigure(struct netdev *netdev)
 {
     struct netdev_dpdk *dev = netdev_dpdk_cast(netdev);
+    struct dpdk_mp_config mp_cfg;
     bool pending_reset;
     bool try_rx_steer;
     int err = 0;
@@ -6370,7 +6382,16 @@ retry:
 
     dev->started = false;
 
-    err = netdev_dpdk_mempool_configure(dev);
+    mp_cfg = (struct dpdk_mp_config){
+        .name = dev->up.name,
+        .mtu = dev->requested_mtu,
+        .socket_id = dev->requested_socket_id,
+        .n_rxq = dev->requested_n_rxq,
+        .rxq_size = dev->requested_rxq_size,
+        .n_txq = dev->requested_n_txq,
+        .txq_size = dev->requested_txq_size,
+    };
+    err = netdev_dpdk_mempool_configure(dev, &mp_cfg);
     if (err && err != EEXIST) {
         goto out;
     }
@@ -6464,9 +6485,18 @@ dpdk_vhost_reconfigure_helper(struct netdev_dpdk *dev)
     netdev_dpdk_remap_txqs(dev);
 
     if (netdev_dpdk_get_vid(dev) >= 0) {
+        struct dpdk_mp_config mp_cfg = {
+            .name = dev->up.name,
+            .mtu = dev->requested_mtu,
+            .socket_id = dev->requested_socket_id,
+            .n_rxq = dev->requested_n_rxq,
+            .rxq_size = dev->requested_rxq_size,
+            .n_txq = dev->requested_n_txq,
+            .txq_size = dev->requested_txq_size,
+        };
         int err;
 
-        err = netdev_dpdk_mempool_configure(dev);
+        err = netdev_dpdk_mempool_configure(dev, &mp_cfg);
         if (!err) {
             /* A new mempool was created or re-used. */
             netdev_change_seq_changed(&dev->up);
-- 
2.54.0

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to