mirror of
https://github.com/openvswitch/ovs
synced 2025-08-22 01:51:26 +00:00
netdev-afxdp: Add interrupt mode netdev class.
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>
This commit is contained in:
parent
ffc0c87393
commit
5bfc519fee
3
NEWS
3
NEWS
@ -10,6 +10,9 @@ Post-v2.13.0
|
|||||||
* Deprecated DPDK ring ports (dpdkr) are no longer supported.
|
* Deprecated DPDK ring ports (dpdkr) are no longer supported.
|
||||||
- Linux datapath:
|
- Linux datapath:
|
||||||
* Support for kernel versions up to 5.5.x.
|
* 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
|
v2.13.0 - 14 Feb 2020
|
||||||
|
@ -3599,24 +3599,33 @@ const struct netdev_class netdev_internal_class = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#ifdef HAVE_AF_XDP
|
#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 = {
|
const struct netdev_class netdev_afxdp_class = {
|
||||||
NETDEV_LINUX_CLASS_COMMON,
|
NETDEV_LINUX_CLASS_COMMON,
|
||||||
|
NETDEV_AFXDP_CLASS_COMMON,
|
||||||
.type = "afxdp",
|
.type = "afxdp",
|
||||||
.is_pmd = true,
|
.is_pmd = true,
|
||||||
.init = netdev_afxdp_init,
|
};
|
||||||
.construct = netdev_afxdp_construct,
|
|
||||||
.destruct = netdev_afxdp_destruct,
|
const struct netdev_class netdev_afxdp_nonpmd_class = {
|
||||||
.get_stats = netdev_afxdp_get_stats,
|
NETDEV_LINUX_CLASS_COMMON,
|
||||||
.get_custom_stats = netdev_afxdp_get_custom_stats,
|
NETDEV_AFXDP_CLASS_COMMON,
|
||||||
.get_status = netdev_linux_get_status,
|
.type = "afxdp-nonpmd",
|
||||||
.set_config = netdev_afxdp_set_config,
|
.is_pmd = false,
|
||||||
.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
|
#endif
|
||||||
|
|
||||||
|
@ -850,6 +850,7 @@ extern const struct netdev_class netdev_tap_class;
|
|||||||
|
|
||||||
#ifdef HAVE_AF_XDP
|
#ifdef HAVE_AF_XDP
|
||||||
extern const struct netdev_class netdev_afxdp_class;
|
extern const struct netdev_class netdev_afxdp_class;
|
||||||
|
extern const struct netdev_class netdev_afxdp_nonpmd_class;
|
||||||
#endif
|
#endif
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -154,6 +154,7 @@ netdev_initialize(void)
|
|||||||
netdev_register_flow_api_provider(&netdev_offload_tc);
|
netdev_register_flow_api_provider(&netdev_offload_tc);
|
||||||
#ifdef HAVE_AF_XDP
|
#ifdef HAVE_AF_XDP
|
||||||
netdev_register_provider(&netdev_afxdp_class);
|
netdev_register_provider(&netdev_afxdp_class);
|
||||||
|
netdev_register_provider(&netdev_afxdp_nonpmd_class);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if defined(__FreeBSD__) || defined(__NetBSD__)
|
#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_TRAFFIC_VSWITCHD_STOP(["/ovs-p0: Too big 'n_rxq'/d
|
||||||
/ovs-p0: could not set configuration/d"])
|
/ovs-p0: could not set configuration/d"])
|
||||||
AT_CLEANUP
|
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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user