On 17 Apr 2019, at 14:01, Eelco Chaudron wrote:
Hi William,
I think you applied the following patch to get it to compile? Or did
you copy in the kernel headers?
https://www.spinics.net/lists/netdev/msg563507.html
I noticed you duplicated the macros, which resulted in all kind of
compile errors. So I removed them, applied the two patches above, which
would get me to the next step.
I’m building it with DPDK enabled and it was causing all kind of
duplicate definition errors as the kernel and DPDK re-use some structure
names.
To get it all compiled and working I had top make the following changes:
$ git diff
diff --git a/lib/netdev-afxdp.c b/lib/netdev-afxdp.c
index b3bf2f044..47fb3342a 100644
--- a/lib/netdev-afxdp.c
+++ b/lib/netdev-afxdp.c
@@ -295,7 +295,7 @@ netdev_linux_rxq_xsk(struct xsk_socket_info *xsk,
uint32_t idx_rx = 0, idx_fq = 0;
int ret = 0;
- unsigned int non_afxdp;
+ unsigned int non_afxdp = 0;
/* See if there is any packet on RX queue,
* if yes, idx_rx is the index having the packet.
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 47153dc60..77f2150ab 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -24,7 +24,7 @@
#include <unistd.h>
#include <linux/virtio_net.h>
#include <sys/socket.h>
-#include <linux/if.h>
+//#include <linux/if.h>
#include <rte_bus_pci.h>
#include <rte_config.h>
diff --git a/lib/xdpsock.h b/lib/xdpsock.h
index 8df8fa451..a2ed1a136 100644
--- a/lib/xdpsock.h
+++ b/lib/xdpsock.h
@@ -28,7 +28,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <net/ethernet.h>
+//#include <net/ethernet.h>
#include <sys/resource.h>
#include <sys/socket.h>
#include <sys/mman.h>
@@ -43,14 +43,6 @@
#include "ovs-atomic.h"
#include "openvswitch/thread.h"
-/* bpf/xsk.h uses the following macros not defined in OVS,
- * so re-define them before include.
- */
-#define unlikely OVS_UNLIKELY
-#define likely OVS_LIKELY
-#define barrier() __asm__ __volatile__("": : :"memory")
-#define smp_rmb() barrier()
-#define smp_wmb() barrier()
#include <bpf/xsk.h>
In addition you need to do “make install_headers” from kernel libbpf
and copy the libbpf_util.h manually.
I was able to do a simple physical port in same physical port out test
without crashing, but the numbers seem low:
$ ovs-ofctl dump-flows ovs_pvp_br0
cookie=0x0, duration=210.344s, table=0, n_packets=1784692,
n_bytes=2694884920, in_port=eno1 actions=IN_PORT
"Physical loopback test, L3 flows[port redirect]"
,Packet size
Number of flows,64,128,256,512,768,1024,1514
100,77574,77329,76605,76417,75539,75252,74617
The above is using two cores, but with a single DPDK core I get the
following (on the same machine):
"Physical loopback test, L3 flows[port redirect]"
,Packet size
Number of flows,64,128,256,512,768,1024,1514
100,9527075,8445852,4528935,2349597,1586276,1197304,814854
For the kernel datapath the numbers are:
"Physical loopback test, L3 flows[port redirect]"
,Packet size
Number of flows,64,128,256,512,768,1024,1514
100,4862995,5521870,4528872,2349596,1586277,1197305,814854
But keep in mind it uses roughly 550/610/520/380/180/140/110% of the CPU
for the respective packet size.
On 2 Apr 2019, at 0:46, William Tu wrote:
The patch series introduces AF_XDP support for OVS netdev.
AF_XDP is a new address family working together with eBPF.
In short, a socket with AF_XDP family can receive and send
packets from an eBPF/XDP program attached to the netdev.
For more details about AF_XDP, please see linux kernel's
Documentation/networking/af_xdp.rst
OVS has a couple of netdev types, i.e., system, tap, or
internal. The patch first adds a new netdev types called
"afxdp", and implement its configuration, packet reception,
and transmit functions. Since the AF_XDP socket, xsk,
operates in userspace, once ovs-vswitchd receives packets
from xsk, the proposed architecture re-uses the existing
userspace dpif-netdev datapath. As a result, most of
the packet processing happens at the userspace instead of
linux kernel.
Architecure
===========
_
| +-------------------+
| | ovs-vswitchd |<-->ovsdb-server
| +-------------------+
| | ofproto |<-->OpenFlow controllers
| +--------+-+--------+
| | netdev | |ofproto-|
userspace | +--------+ | dpif |
| | netdev | +--------+
| |provider| | dpif |
| +---||---+ +--------+
| || | dpif- |
| || | netdev |
|_ || +--------+
||
_ +---||-----+--------+
| | af_xdp prog + |
kernel | | xsk_map |
|_ +--------||---------+
||
physical
NIC
To simply start, create a ovs userspace bridge using dpif-netdev
by setting the datapath_type to netdev:
# ovs-vsctl -- add-br br0 -- set Bridge br0 datapath_type=netdev
And attach a linux netdev with type afxdp:
# ovs-vsctl add-port br0 afxdp-p0 -- \
set interface afxdp-p0 type="afxdp"
Performance
===========
For this version, v4, I mainly focus on making the features right
with
libbpf AF_XDP API and use the AF_XDP SKB mode, which is the slower
set-up.
My next version is to measure the performance and add optimizations.
Documentation
=============
Most of the design details are described in the paper presetned at
Linux Plumber 2018, "Bringing the Power of eBPF to Open vSwitch"[1],
section 4, and slides[2].
This path uses a not-yet upstreamed feature called XDP_ATTACH[3],
described in section 3.1, which is a built-in XDP program for the
AF_XDP.
This greatly simplifies the management of XDP/eBPF programs.
[1] http://vger.kernel.org/lpc_net2018_talks/ovs-ebpf-afxdp.pdf
[2]
http://vger.kernel.org/lpc_net2018_talks/ovs-ebpf-lpc18-presentation.pdf
[3]
http://vger.kernel.org/lpc_net2018_talks/lpc18_paper_af_xdp_perf-v2.pdf
For installation and configuration guide, see
# Documentation/intro/install/bpf.rst
Test Cases
==========
Test cases are created using namespaces and veth peer, with AF_XDP
socket
attached to the veth (thus the SKB_MODE). By issuing "make
check-afxdp",
the patch shows the following:
AF_XDP netdev datapath-sanity
1: datapath - ping between two ports ok
2: datapath - ping between two ports on vlan ok
3: datapath - ping6 between two ports ok
4: datapath - ping6 between two ports on vlan ok
5: datapath - ping over vxlan tunnel ok
6: datapath - ping over vxlan6 tunnel ok
7: datapath - ping over gre tunnel ok
8: datapath - ping over erspan v1 tunnel ok
9: datapath - ping over erspan v2 tunnel ok
10: datapath - ping over ip6erspan v1 tunnel ok
11: datapath - ping over ip6erspan v2 tunnel ok
12: datapath - ping over geneve tunnel ok
13: datapath - ping over geneve6 tunnel ok
14: datapath - clone action ok
15: datapath - basic truncate action ok
conntrack
16: conntrack - controller ok
17: conntrack - force commit ok
18: conntrack - ct flush by 5-tuple ok
19: conntrack - IPv4 ping ok
20: conntrack - get_nconns and get/set_maxconns ok
21: conntrack - IPv6 ping ok
system-ovn
22: ovn -- 2 LRs connected via LS, gateway router, SNAT and DNAT ok
23: ovn -- 2 LRs connected via LS, gateway router, easy SNAT ok
24: ovn -- multiple gateway routers, SNAT and DNAT ok
25: ovn -- load-balancing ok
26: ovn -- load-balancing - same subnet. ok
27: ovn -- load balancing in gateway router ok
28: ovn -- multiple gateway routers, load-balancing ok
29: ovn -- load balancing in router with gateway router port ok
30: ovn -- DNAT and SNAT on distributed router - N/S ok
31: ovn -- DNAT and SNAT on distributed router - E/W ok
---
v1->v2:
- add a list to maintain unused umem elements
- remove copy from rx umem to ovs internal buffer
- use hugetlb to reduce misses (not much difference)
- use pmd mode netdev in OVS (huge performance improve)
- remove malloc dp_packet, instead put dp_packet in umem
v2->v3:
- rebase on the OVS master, 7ab4b0653784
("configure: Check for more specific function to pull in pthread
library.")
- remove the dependency on libbpf and dpif-bpf.
instead, use the built-in XDP_ATTACH feature.
- data structure optimizations for better performance, see[1]
- more test cases support
v3:
https://mail.openvswitch.org/pipermail/ovs-dev/2018-November/354179.html
v3->v4:
- Use AF_XDP API provided by libbpf
- Remove the dependency on XDP_ATTACH kernel patch set
- Add documentation, bpf.rst
William Tu (4):
Add libbpf build support.
netdev-afxdp: add new netdev type for AF_XDP
tests: add AF_XDP netdev test cases.
afxdp netdev: add documentation and configuration.
Documentation/automake.mk | 1 +
Documentation/index.rst | 1 +
Documentation/intro/install/bpf.rst | 182 +++++++
Documentation/intro/install/index.rst | 1 +
acinclude.m4 | 20 +
configure.ac | 1 +
lib/automake.mk | 7 +-
lib/dp-packet.c | 12 +
lib/dp-packet.h | 32 +-
lib/dpif-netdev.c | 2 +-
lib/netdev-afxdp.c | 491 +++++++++++++++++
lib/netdev-afxdp.h | 39 ++
lib/netdev-linux.c | 78 ++-
lib/netdev-provider.h | 1 +
lib/netdev.c | 1 +
lib/xdpsock.c | 179 +++++++
lib/xdpsock.h | 129 +++++
tests/automake.mk | 17 +
tests/system-afxdp-macros.at | 153 ++++++
tests/system-afxdp-testsuite.at | 26 +
tests/system-afxdp-traffic.at | 978
++++++++++++++++++++++++++++++++++
21 files changed, 2345 insertions(+), 6 deletions(-)
create mode 100644 Documentation/intro/install/bpf.rst
create mode 100644 lib/netdev-afxdp.c
create mode 100644 lib/netdev-afxdp.h
create mode 100644 lib/xdpsock.c
create mode 100644 lib/xdpsock.h
create mode 100644 tests/system-afxdp-macros.at
create mode 100644 tests/system-afxdp-testsuite.at
create mode 100644 tests/system-afxdp-traffic.at
--
2.7.4
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev