Hi Antonio,
Last week I run into this mempool issue during the development of a new
feature. I have made a bugfix, but then we saw yours too, so I tested if it
solves my problem. It did, but I realized another problem with it. The mempool
name generation is partly based on the MTU size, which is handled in 1024 bytes
long ranges. For example MTU 1000 and 1500 are in the same range, 2000 and 2500
are in a different range. So I tested this patch and got the following.
# ovs-vsctl list interface dpdk0 |grep mtu
mtu : 2500
mtu_request : 2500
# ovs-vsctl set interface dpdk0 mtu_request=2000
# ovs-vsctl list interface dpdk0 |grep mtu
mtu : 2500
mtu_request : 2000
# ovs-vsctl set interface dpdk0 mtu_request=1500
# ovs-vsctl list interface dpdk0 |grep mtu
mtu : 1500
mtu_request : 1500
# ovs-vsctl set interface dpdk0 mtu_request=1000
# ovs-vsctl list interface dpdk0 |grep mtu
mtu : 1500
mtu_request : 1000
# ovs-vsctl set interface dpdk0 mtu_request=2000
# ovs-vsctl list interface dpdk0 |grep mtu
mtu : 2000
mtu_request : 2000
# ovs-vsctl set interface dpdk0 mtu_request=1000
# ovs-vsctl list interface dpdk0 |grep mtu
mtu : 1000
mtu_request : 1000
# ovs-vsctl set interface dpdk0 mtu_request=1500
# ovs-vsctl list interface dpdk0 |grep mtu
mtu : 1000
mtu_request : 1500
# service openvswitch-switch restart
# ovs-vsctl list interface dpdk0 |grep mtu
mtu : 1500
mtu_request : 1500
This was my setup:
Bridge br-prv
Port bond-prv
Interface "dpdk0"
type: dpdk
options: {dpdk-devargs="0000:05:00.0", n_rxq_desc="1024",
n_txq_desc="1024"}
ovs_version: "2.8.90"
And I used DPDK v17.08.
So, as it can be see from the example above, with the patch applied when a new
mtu_request is in the same range as the previously set MTU, then it has no
effect until service restart. The mtu_request has immediate effect when it is
in different range as the previously set MTU. Or did I miss something during
the testing?
My patch what I used last week does the following. During reconfiguration the
mempool is always deleted before a new one is created. It solved the problem
without side effects, but it is not optimized (always recreates the mempool
when this function is called).
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index c60f46f..de38f95 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -621,6 +621,7 @@ netdev_dpdk_mempool_configure(struct netdev_dpdk *dev)
uint32_t buf_size = dpdk_buf_size(dev->requested_mtu);
struct dpdk_mp *mp;
+ dpdk_mp_put(dev->dpdk_mp);
mp = dpdk_mp_get(dev, FRAME_LEN_TO_MTU(buf_size));
if (!mp) {
VLOG_ERR("Failed to create memory pool for netdev "
@@ -629,7 +630,6 @@ netdev_dpdk_mempool_configure(struct netdev_dpdk *dev)
rte_strerror(rte_errno));
return rte_errno;
} else {
- dpdk_mp_put(dev->dpdk_mp);
dev->dpdk_mp = mp;
dev->mtu = dev->requested_mtu;
dev->socket_id = dev->requested_socket_id;
What do you think about this solution?
Regards,
Robert
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev