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

Submitted by Hemant Agrawal on March 20, 2017, 11:59 a.m.

Details

Message ID 1490011158-10484-1-git-send-email-hemant.agrawal@nxp.com
State New
Headers show

Commit Message

Hemant Agrawal March 20, 2017, 11:59 a.m.
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>
---
branch-2.6 and master are different, so different patches are submitted.

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

Comments

Jianbo Liu March 21, 2017, 4:08 a.m.
The 03/20/2017 17:29, 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>
> ---
> branch-2.6 and master are different, so different patches are submitted.
>
>  lib/netdev-dpdk.c | 19 +++++++++----------
>  1 file changed, 9 insertions(+), 10 deletions(-)
>
> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
> index ddc651b..5d0d762 100644
> --- a/lib/netdev-dpdk.c
> +++ b/lib/netdev-dpdk.c
> @@ -466,7 +466,6 @@ ovs_rte_pktmbuf_init(struct rte_mempool *mp,
>  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 +477,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 +492,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);

I think you should remove rte_pktmbuf_init() in ovs_rte_pktmbuf_init() as it is already called in rte_pktmbuf_pool_create().

>              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

--
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 March 21, 2017, 8:48 p.m.
On 03/21/2017 04:08 AM, Jianbo Liu wrote:
> The 03/20/2017 17:29, 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>
>> ---
>> branch-2.6 and master are different, so different patches are submitted.
>>
>>  lib/netdev-dpdk.c | 19 +++++++++----------
>>  1 file changed, 9 insertions(+), 10 deletions(-)
>>
>> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
>> index ddc651b..5d0d762 100644
>> --- a/lib/netdev-dpdk.c
>> +++ b/lib/netdev-dpdk.c
>> @@ -466,7 +466,6 @@ ovs_rte_pktmbuf_init(struct rte_mempool *mp,
>>  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 +477,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 +492,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);
> 
> I think you should remove rte_pktmbuf_init() in ovs_rte_pktmbuf_init() as it is already called in rte_pktmbuf_pool_create().
> 

I agree with that optimization. Otherwise, LGTM for master branch.

>>              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
> 
> --
> 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.
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>

Patch hide | download patch | download mbox

diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index ddc651b..5d0d762 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -466,7 +466,6 @@  ovs_rte_pktmbuf_init(struct rte_mempool *mp,
 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 +477,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 +492,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);