@@ -4,6 +4,9 @@ Post-v2.13.0
- OpenFlow:
* The OpenFlow ofp_desc/serial_num may now be configured by setting the
value of other-config:dp-sn in the Bridge table.
+ - AF_XDP:
+ * New netdev class 'afxdp-nonpmd' for netdev-afxdp to save CPU cycles
+ by enabling interrupt mode.
v2.13.0 - 14 Feb 2020
@@ -1115,9 +1115,9 @@ netdev_afxdp_batch_send(struct netdev *netdev, int qid,
struct netdev_linux *dev;
int ret;
+ qid = qid % netdev_n_txq(netdev);
if (concurrent_txq) {
dev = netdev_linux_cast(netdev);
- qid = qid % netdev_n_txq(netdev);
ovs_spin_lock(&dev->tx_locks[qid].lock);
ret = __netdev_afxdp_batch_send(netdev, qid, batch);
@@ -3605,6 +3605,26 @@ const struct netdev_class netdev_afxdp_class = {
.rxq_destruct = netdev_afxdp_rxq_destruct,
.rxq_recv = netdev_afxdp_rxq_recv,
};
+
+const struct netdev_class netdev_afxdp_nonpmd_class = {
+ NETDEV_LINUX_CLASS_COMMON,
+ .type = "afxdp-nonpmd",
+ .is_pmd = false,
+ .init = netdev_afxdp_init,
+ .construct = netdev_afxdp_construct,
+ .destruct = netdev_afxdp_destruct,
+ .get_stats = netdev_afxdp_get_stats,
+ .get_custom_stats = netdev_afxdp_get_custom_stats,
+ .get_status = netdev_linux_get_status,
+ .set_config = netdev_afxdp_set_config,
+ .get_config = netdev_afxdp_get_config,
+ .reconfigure = netdev_afxdp_reconfigure,
+ .get_numa_id = netdev_linux_get_numa_id,
+ .send = netdev_afxdp_batch_send,
+ .rxq_construct = netdev_afxdp_rxq_construct,
+ .rxq_destruct = netdev_afxdp_rxq_destruct,
+ .rxq_recv = netdev_afxdp_rxq_recv,
+};
#endif
@@ -848,6 +848,7 @@ extern const struct netdev_class netdev_tap_class;
#ifdef HAVE_AF_XDP
extern const struct netdev_class netdev_afxdp_class;
+extern const struct netdev_class netdev_afxdp_nonpmd_class;
#endif
#ifdef __cplusplus
}
@@ -154,6 +154,7 @@ netdev_initialize(void)
netdev_register_flow_api_provider(&netdev_offload_tc);
#ifdef HAVE_AF_XDP
netdev_register_provider(&netdev_afxdp_class);
+ netdev_register_provider(&netdev_afxdp_nonpmd_class);
#endif
#endif
#if defined(__FreeBSD__) || defined(__NetBSD__)
@@ -22,3 +22,26 @@ AT_CHECK([grep "ovs-p0: could not set configuration" ovs-vswitchd.log | wc -l],
OVS_TRAFFIC_VSWITCHD_STOP(["/ovs-p0: Too big 'n_rxq'/d
/ovs-p0: could not set configuration/d"])
AT_CLEANUP
+
+
+AT_SETUP([AF_XDP - ping between pmd and non-pmd ports])
+AT_KEYWORDS([afxdp nonpmd])
+OVS_TRAFFIC_VSWITCHD_START()
+
+AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
+
+ADD_NAMESPACES(at_ns0, at_ns1)
+ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
+ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
+
+AT_CHECK([ovs-vsctl del-port ovs-p0])
+AT_CHECK([ovs-vsctl add-port br0 ovs-p0 -- \
+ set interface ovs-p0 type=afxdp-nonpmd options:n_rxq=1],
+ [0], [], [stderr])
+
+NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
+3 packets transmitted, 3 received, 0% packet loss, time 0ms
+])
+
+OVS_TRAFFIC_VSWITCHD_STOP
+AT_CLEANUP
The patch adds a new netdev class 'afxdp-nonpmd' to enable afxdp interrupt mode. This is similar to 'type=afxdp', except that the is_pmd field is set to false. As a result, the packet processing is handled by main thread, not pmd thread. This avoids burning the CPU to always 100% when there is no traffic. Tested-at: https://travis-ci.org/williamtu/ovs-travis/builds/655885506 Signed-off-by: William Tu <u9012063@gmail.com> --- NEWS | 3 +++ lib/netdev-afxdp.c | 2 +- lib/netdev-linux.c | 20 ++++++++++++++++++++ lib/netdev-provider.h | 1 + lib/netdev.c | 1 + tests/system-afxdp.at | 23 +++++++++++++++++++++++ 6 files changed, 49 insertions(+), 1 deletion(-)