aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-dpdk/README
blob: 0f2210b42a8abff275138060c539dd49dd816691 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
Copyright (c) 2014, Linaro Limited
All rights reserved.

SPDX-License-Identifier:        BSD-3-Clause

ODP-DPDK:
---------
	This effort is to port ODP on top of DPDK and use DPDK as the
accelerator for all intel NIC's. Pre-requisite is DPDK should be cloned and
compiled. DPDK and ODP was compiled and tested on Ubuntu 14.04
3.13.0-29-generic kernel.

# To Clone DPDK
$ git clone http://92.243.14.124/git/dpdk ./<dpdk-dir>

# we support only 1.6.0r2 of DPDK for now
$ git tag -l -- will list all the tags available
$ git checkout -b 1.6.0 tags/v1.6.0r2
# Please refer to http://dpdk.org/doc for more details on how to build
# DPDK. Getting started guide for Linux might be of help.
# Best effort is done to provide some help on DPDK cmds below for Ubuntu,
# where it was compiled and tested.
# Please refer "How to setup and compile DPDK" section in this document

# To compile ODP with linux-dpdk

$ export RTE_SDK=<dpdk-dir>
# For example
$ export RTE_SDK=/root/dpdk
$ export RTE_TARGET=x86_64-default-linuxapp-gcc
# RTE_TARGET is the configuration used while building DPDK

$ cd <odp-dir>
$ ./bootstrap
$ ./configure --with-platform=linux-dpdk --with-sdk-install-path=$RTE_SDK/$RTE_TARGET
$ make

# App commands to test
l2fwding app - sudo ./example/l2fwd/odp_l2fwd -i 0,1 -m 0 -c 2
loopback app - sudo ./example/packet/odp_pktio -i 0,1 -m 0 -c 2

	-i 0,1 - interface number
	-m 0   - burst mode
	-c 2   - number of cpus

How to setup and compile DPDK:
==============================
$ cd <dpdk-dir>

# This has to be done only once.
$ make config T=x86_64-default-linuxapp-gcc O=x86_64-default-linuxapp-gcc
# set CONFIG_RTE_BUILD_COMBINE_LIBS=y in .config file
# Note: if non-intel SFP's are used in IXGBE, then set CONFIG_RTE_LIBRTE_IXGBE_ALLOW_UNSUPPORTED_SFP=y in .config file
$ make install T=x86_64-default-linuxapp-gcc EXTRA_CFLAGS="-fPIC"


# If "conflicting types for skb_set_hash" error happens during DPDK
# build, then please knock-off skb_set_hash function from kcompat.h as
# shown below. This was seen in Ubuntu 3.13.0-30-generic.
diff --git a/lib/librte_eal/linuxapp/kni/ethtool/igb/kcompat.h b/lib/librte_eal/linuxapp/kni/ethtool/igb/kcompat.h
index 19df483..78a794a 100644
--- a/lib/librte_eal/linuxapp/kni/ethtool/igb/kcompat.h
+++ b/lib/librte_eal/linuxapp/kni/ethtool/igb/kcompat.h
@@ -3845,11 +3845,6 @@ static inline struct sk_buff *__kc__vlan_hwaccel_put_tag(struct sk_buff *skb,
 #if ( LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0) )
 #ifdef NETIF_F_RXHASH
 #define PKT_HASH_TYPE_L3 0
-static inline void
-skb_set_hash(struct sk_buff *skb, __u32 hash, __always_unused int type)
-{
-       skb->rxhash = hash;
-}
 #endif /* NETIF_F_RXHASH */
 #endif /* < 3.14.0 */
# this only ensures building DPDK, but traffic is not tested with this
# build yet. It is upto the user to test it.

# To reserve huge pages, which is needed for DPDK, execute following command
$ sudo sh -c 'echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages'
# If you are running on a multi-node machine then, hugepages should be reserved on each node
$ ls /sys/devices/system/node
$ sudo sh -c 'echo 1024 > /sys/devices/system/node/node*/hugepages/hugepages-2048kB/nr_hugepages'

$ sudo mkdir /mnt/huge
$ sudo mount -t hugetlbfs nodev /mnt/huge
# To load uio driver
$ sudo /sbin/modprobe uio
$ ulimit -Sn 2048

$ cd <dpdk-dir>
$ sudo insmod ./build/build/lib/librte_eal/linuxapp/igb_uio/igb_uio.ko

$ sudo rmmod ixgbe
$ sudo modprobe ixgbe
# If the SFP's used are non-intel, then
$ sudo modprobe ixgbe allow_unsupported_sfp=1

$ cd <dpdk-dir>
$ ./tools/igb_uio_bind.py --status
# this command produces output that is something similar as given below

Network devices using IGB_UIO driver
====================================
0000:05:00.0 'Ethernet 10G 2P X520 Adapter' drv=igb_uio unused=
0000:05:00.1 'Ethernet 10G 2P X520 Adapter' drv=igb_uio unused=

Network devices using kernel driver
===================================
0000:01:00.0 'NetXtreme II BCM5709 Gigabit Ethernet' if=eth0 drv=bnx2 unused=<none> *Active*
0000:01:00.1 'NetXtreme II BCM5709 Gigabit Ethernet' if=eth1 drv=bnx2 unused=<none>
0000:07:00.0 'T320 10GbE Dual Port Adapter' if=eth2,eth3 drv=cxgb3 unused=<none>

Other network devices
=====================
<none>

# Now you should look for pci id listed and give it in the following command
# in place of 05:00.X

# To give the interfaces to DPDK, use following command
$ sudo ./tools/igb_uio_bind.py --bind=igb_uio 05:00.0
$ sudo ./tools/igb_uio_bind.py --bind=igb_uio 05:00.1
# To restore it back to kernel, use following command
$ sudo ./tools/igb_uio_bind.py --bind=ixgbe 05:00.0
$ sudo ./tools/igb_uio_bind.py --bind=ixgbe 05:00.1