diff mbox

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

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

Commit Message

Hemant Agrawal March 24, 2017, 7:27 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>
---
v3:
 * adding OVS_UNUSED for mp parameter

v2:
 * removing rte_pktmbuf_init as per review comment

 lib/netdev-dpdk.c | 23 ++++++++++-------------
 1 file changed, 10 insertions(+), 13 deletions(-)

Comments

Jianbo Liu March 24, 2017, 9:39 a.m. UTC | #1
The 03/24/2017 12:57, Hemant Agrawal wrote:
> 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>
> ---
> v3:
>  * adding OVS_UNUSED for mp parameter
>
> v2:
>  * removing rte_pktmbuf_init as per review comment
>
>  lib/netdev-dpdk.c | 23 ++++++++++-------------
>  1 file changed, 10 insertions(+), 13 deletions(-)
>

Acked-by: Jianbo Liu <jianbo.liu@linaro.org>

IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.
Kevin Traynor April 10, 2017, 12:07 p.m. UTC | #2
On 03/24/2017 07:27 AM, Hemant Agrawal wrote:
> 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>
> ---
> v3:
>  * adding OVS_UNUSED for mp parameter
> 
> v2:
>  * removing rte_pktmbuf_init as per review comment

Acked-by: Kevin Traynor <ktraynor@redhat.com>
Darrell Ball April 11, 2017, 5:29 a.m. UTC | #3
One minor comment

On 3/24/17, 12:27 AM, "Hemant Agrawal" <hemant.agrawal@nxp.com> wrote:

    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>
    ---
    v3:
     * adding OVS_UNUSED for mp parameter
    
    v2:
     * removing rte_pktmbuf_init as per review comment
    
     lib/netdev-dpdk.c | 23 ++++++++++-------------
     1 file changed, 10 insertions(+), 13 deletions(-)
    
    diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
    index ddc651b..39021cf 100644
    --- a/lib/netdev-dpdk.c
    +++ b/lib/netdev-dpdk.c
    @@ -451,22 +451,19 @@ free_dpdk_buf(struct dp_packet *p)
     }
     
     static void
    -ovs_rte_pktmbuf_init(struct rte_mempool *mp,
    +ovs_rte_pktmbuf_init(struct rte_mempool *mp OVS_UNUSED,
                          void *opaque_arg OVS_UNUSED,
                          void *_p,
                          unsigned i OVS_UNUSED)
     {
         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_pktmbuf_pool_create has done some initialization of the rte_mbuf
  * part of each dp_packet, while ovs_rte_pktmbuf_init initializes some OVS
  * specific fields of dp_packet. */

I also gave the patch a spin, just to check for any regressions.


    +            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
diff mbox

Patch

diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index ddc651b..39021cf 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -451,22 +451,19 @@  free_dpdk_buf(struct dp_packet *p)
 }
 
 static void
-ovs_rte_pktmbuf_init(struct rte_mempool *mp,
+ovs_rte_pktmbuf_init(struct rte_mempool *mp OVS_UNUSED,
                      void *opaque_arg OVS_UNUSED,
                      void *_p,
                      unsigned i OVS_UNUSED)
 {
     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);