diff mbox

[ovs-dev,v2] netdev-dpdk: leverage the mempool offload support

Message ID 1490258133-1008-1-git-send-email-hemant.agrawal@nxp.com
State Superseded
Delegated to: Darrell Ball
Headers show

Commit Message

Hemant Agrawal March 23, 2017, 8:35 a.m. UTC
DPDK 16.07 introduced the support for mempool offload support.
rte_pktmbuf_pool_create is the recommended method for creating pktmbuf
pools. Buffer pools created with rte_mempool_create may not get offloaded
to the underlying offloaded mempools.

This patch, changes the rte_mempool_create to use helper wrapper
"rte_pktmbuf_pool_create" provided by dpdk, so that it can leverage
offloaded mempools.

Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
---
v2:
* removing rte_pktmbuf_init as per review comment

 lib/netdev-dpdk.c | 21 +++++++++------------
 1 file changed, 9 insertions(+), 12 deletions(-)

Comments

Stokes, Ian March 23, 2017, 11:50 a.m. UTC | #1
> DPDK 16.07 introduced the support for mempool offload support.
> rte_pktmbuf_pool_create is the recommended method for creating pktmbuf
> pools. Buffer pools created with rte_mempool_create may not get offloaded
> to the underlying offloaded mempools.
> 
> This patch, changes the rte_mempool_create to use helper wrapper
> "rte_pktmbuf_pool_create" provided by dpdk, so that it can leverage
> offloaded mempools.
> 
> Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
> ---
> v2:
> * removing rte_pktmbuf_init as per review comment
> 
>  lib/netdev-dpdk.c | 21 +++++++++------------
>  1 file changed, 9 insertions(+), 12 deletions(-)
> 
> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index ddc651b..80bb1ff
> 100644
> --- a/lib/netdev-dpdk.c
> +++ b/lib/netdev-dpdk.c
> @@ -458,15 +458,12 @@ ovs_rte_pktmbuf_init(struct rte_mempool *mp,  {
>      struct rte_mbuf *pkt = _p;
> 
> -    rte_pktmbuf_init(mp, opaque_arg, _p, i);
> -
Hi Hemant, 

I haven't had a chance to test this yet but at a glance this will cause a warning when compiling, mp parameter is no longer used in the function, need to add OVS_UNUSED above for mp.

Ian
 
>      dp_packet_init_dpdk((struct dp_packet *) pkt, pkt->buf_len);  }
> 
>  static struct dpdk_mp *
>  dpdk_mp_create(int socket_id, int mtu)
>  {
> -    struct rte_pktmbuf_pool_private mbp_priv;
>      struct dpdk_mp *dmp;
>      unsigned mp_size;
>      char *mp_name;
> @@ -478,9 +475,6 @@ dpdk_mp_create(int socket_id, int mtu)
>      dmp->socket_id = socket_id;
>      dmp->mtu = mtu;
>      dmp->refcount = 1;
> -    mbp_priv.mbuf_data_room_size = MBUF_SIZE(mtu) - sizeof(struct
> dp_packet);
> -    mbp_priv.mbuf_priv_size = sizeof(struct dp_packet)
> -                              - sizeof(struct rte_mbuf);
>      /* XXX: this is a really rough method of provisioning memory.
>       * It's impossible to determine what the exact memory requirements
> are
>       * when the number of ports and rxqs that utilize a particular
> mempool can @@ -496,18 +490,21 @@ dpdk_mp_create(int socket_id, int mtu)
>          mp_name = xasprintf("ovs_mp_%d_%d_%u", dmp->mtu, dmp->socket_id,
>                              mp_size);
> 
> -        dmp->mp = rte_mempool_create(mp_name, mp_size, MBUF_SIZE(mtu),
> -                                     MP_CACHE_SZ,
> -                                     sizeof(struct
> rte_pktmbuf_pool_private),
> -                                     rte_pktmbuf_pool_init, &mbp_priv,
> -                                     ovs_rte_pktmbuf_init, NULL,
> -                                     socket_id, 0);
> +        dmp->mp = rte_pktmbuf_pool_create(mp_name, mp_size,
> +                                          MP_CACHE_SZ,
> +                                          sizeof (struct dp_packet)
> +                                                 - sizeof (struct
> rte_mbuf),
> +                                          MBUF_SIZE(mtu)
> +                                                 - sizeof(struct
> dp_packet),
> +                                          socket_id);
>          if (dmp->mp) {
>              VLOG_DBG("Allocated \"%s\" mempool with %u mbufs",
>                       mp_name, mp_size);
>          }
>          free(mp_name);
>          if (dmp->mp) {
> +            /* pktmbuf only prepare the rte_mbuf, prepare the ovs bufs */
> +            rte_mempool_obj_iter(dmp->mp, ovs_rte_pktmbuf_init, NULL);
>              return dmp;
>          }
>      } while (rte_errno == ENOMEM && (mp_size /= 2) >= MIN_NB_MBUF);
> --
> 1.9.1
> 
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
diff mbox

Patch

diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index ddc651b..80bb1ff 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -458,15 +458,12 @@  ovs_rte_pktmbuf_init(struct rte_mempool *mp,
 {
     struct rte_mbuf *pkt = _p;
 
-    rte_pktmbuf_init(mp, opaque_arg, _p, i);
-
     dp_packet_init_dpdk((struct dp_packet *) pkt, pkt->buf_len);
 }
 
 static struct dpdk_mp *
 dpdk_mp_create(int socket_id, int mtu)
 {
-    struct rte_pktmbuf_pool_private mbp_priv;
     struct dpdk_mp *dmp;
     unsigned mp_size;
     char *mp_name;
@@ -478,9 +475,6 @@  dpdk_mp_create(int socket_id, int mtu)
     dmp->socket_id = socket_id;
     dmp->mtu = mtu;
     dmp->refcount = 1;
-    mbp_priv.mbuf_data_room_size = MBUF_SIZE(mtu) - sizeof(struct dp_packet);
-    mbp_priv.mbuf_priv_size = sizeof(struct dp_packet)
-                              - sizeof(struct rte_mbuf);
     /* XXX: this is a really rough method of provisioning memory.
      * It's impossible to determine what the exact memory requirements are
      * when the number of ports and rxqs that utilize a particular mempool can
@@ -496,18 +490,21 @@  dpdk_mp_create(int socket_id, int mtu)
         mp_name = xasprintf("ovs_mp_%d_%d_%u", dmp->mtu, dmp->socket_id,
                             mp_size);
 
-        dmp->mp = rte_mempool_create(mp_name, mp_size, MBUF_SIZE(mtu),
-                                     MP_CACHE_SZ,
-                                     sizeof(struct rte_pktmbuf_pool_private),
-                                     rte_pktmbuf_pool_init, &mbp_priv,
-                                     ovs_rte_pktmbuf_init, NULL,
-                                     socket_id, 0);
+        dmp->mp = rte_pktmbuf_pool_create(mp_name, mp_size,
+                                          MP_CACHE_SZ,
+                                          sizeof (struct dp_packet)
+                                                 - sizeof (struct rte_mbuf),
+                                          MBUF_SIZE(mtu)
+                                                 - sizeof(struct dp_packet),
+                                          socket_id);
         if (dmp->mp) {
             VLOG_DBG("Allocated \"%s\" mempool with %u mbufs",
                      mp_name, mp_size);
         }
         free(mp_name);
         if (dmp->mp) {
+            /* pktmbuf only prepare the rte_mbuf, prepare the ovs bufs */
+            rte_mempool_obj_iter(dmp->mp, ovs_rte_pktmbuf_init, NULL);
             return dmp;
         }
     } while (rte_errno == ENOMEM && (mp_size /= 2) >= MIN_NB_MBUF);