1. The MTU configuration changes, but the size of aligned mempool
   of new MTU doesn't change.
   What we have to do is to update the netdev's MTU and max_packet_len.

2. The MTU configuration changes, and the size of aligned mempool
   of new MTU changes too.
   The mempool needed by the new MTU has already been allocated,
   and the mempool used for the old MTU is referenced by other
   netdev meantime.
   What we have to do is to reduce the reference count of old mempool,
   increase the reference count of new mempool, update the netdev's
   mempool, MTU and max_packet_len.

Signed-off-by: Binbin Xu <xu.binb...@zte.com.cn>
---
 lib/netdev-dpdk.c | 31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 6d334db..86dd5df 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -1723,6 +1723,8 @@ netdev_dpdk_get_mtu(const struct netdev *netdev, int 
*mtup)
 static int
 netdev_dpdk_set_mtu(struct netdev *netdev, int mtu)
 {
+    struct dpdk_mp *dmp = NULL;
+    struct dpdk_mp *dmp_node = NULL;
     struct netdev_dpdk *dev = netdev_dpdk_cast(netdev);
 
     if (MTU_TO_FRAME_LEN(mtu) > NETDEV_DPDK_MAX_PKT_LEN
@@ -1731,12 +1733,39 @@ netdev_dpdk_set_mtu(struct netdev *netdev, int mtu)
         return EINVAL;
     }
 
+    ovs_mutex_lock(&dpdk_mutex);
     ovs_mutex_lock(&dev->mutex);
     if (dev->requested_mtu != mtu) {
+        VLOG_INFO("%s: cur MTU %d, req MTU %d, " 
+            "cur buf len %d, req buf len %d\n",
+            dev->up.name, dev->mtu, mtu, 
+            dpdk_buf_size(dev->mtu), dpdk_buf_size(mtu));
+
         dev->requested_mtu = mtu;
-        netdev_request_reconfigure(netdev);
+        
+        LIST_FOR_EACH (dmp_node, list_node, &dpdk_mp_list) {
+            if (dmp_node->mtu == FRAME_LEN_TO_MTU(dpdk_buf_size(mtu))) {
+                dmp = dmp_node;
+                break;
+            }
+        }
+
+        if ((dpdk_buf_size(dev->mtu) != dpdk_buf_size(mtu)
+            && 1 == dev->dpdk_mp->refcount)
+            || dmp == NULL) {
+            netdev_request_reconfigure(netdev);
+        } else {
+            if (dpdk_buf_size(dev->mtu) != dpdk_buf_size(mtu)) {
+                dev->dpdk_mp->refcount--;
+                dmp->refcount++;
+                dev->dpdk_mp = dmp;
+            }
+            dev->mtu = mtu;
+            dev->max_packet_len = MTU_TO_FRAME_LEN(dev->mtu);
+        }
     }
     ovs_mutex_unlock(&dev->mutex);
+    ovs_mutex_unlock(&dpdk_mutex);
 
     return 0;
 }
-- 
2.9.3

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to