]> git.proxmox.com Git - mirror_ovs.git/commitdiff
netdev-afxdp: Add interrupt mode netdev class.
authorWilliam Tu <u9012063@gmail.com>
Tue, 14 Apr 2020 13:22:55 +0000 (06:22 -0700)
committerIlya Maximets <i.maximets@ovn.org>
Tue, 28 Apr 2020 15:58:31 +0000 (17:58 +0200)
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.

Signed-off-by: William Tu <u9012063@gmail.com>
Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
NEWS
lib/netdev-linux.c
lib/netdev-provider.h
lib/netdev.c
tests/system-afxdp.at

diff --git a/NEWS b/NEWS
index 70bd17584594eceb8bee65079d9712895897290a..6db2d993ffdbb2235b0c4ddba5ec3b7e1c8578db 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,9 @@ Post-v2.13.0
      * Deprecated DPDK ring ports (dpdkr) are no longer supported.
    - Linux datapath:
      * Support for kernel versions up to 5.5.x.
+   - AF_XDP:
+     * New netdev class 'afxdp-nonpmd' for netdev-afxdp to save CPU cycles
+       by enabling interrupt mode.
 
 
 v2.13.0 - 14 Feb 2020
index ff045cb1290bae12dee066dc6aac4dffaab349c9..1d7ed0145c48acabbb30103c604b7fc920fc70fc 100644 (file)
@@ -3599,24 +3599,33 @@ const struct netdev_class netdev_internal_class = {
 };
 
 #ifdef HAVE_AF_XDP
+#define NETDEV_AFXDP_CLASS_COMMON                               \
+    .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
+
 const struct netdev_class netdev_afxdp_class = {
     NETDEV_LINUX_CLASS_COMMON,
+    NETDEV_AFXDP_CLASS_COMMON,
     .type = "afxdp",
     .is_pmd = true,
-    .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,
+};
+
+const struct netdev_class netdev_afxdp_nonpmd_class = {
+    NETDEV_LINUX_CLASS_COMMON,
+    NETDEV_AFXDP_CLASS_COMMON,
+    .type = "afxdp-nonpmd",
+    .is_pmd = false,
 };
 #endif
 \f
index 6f509424bc81135afcd42299b901a8e11354e6ff..d9503adb0fb69cd4c98aea549d40cf6e7734bc09 100644 (file)
@@ -850,6 +850,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
 }
index 8c44eee8e98a0a8b5070bd56a08d3b105d085fe8..90962eec66cfee624a7680c3a794769f044d33d3 100644 (file)
@@ -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__)
index e4451624f882a92a1146f9da555c0758d9d4a433..0d09906fb6c85cc48df09966acaee890a306f836 100644 (file)
@@ -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