mirror of
https://github.com/openvswitch/ovs
synced 2025-09-03 15:55:19 +00:00
doc: Convert INSTALL.DPDK to rST
Signed-off-by: Stephen Finucane <stephen@that.guru> Signed-off-by: Russell Bryant <russell@ovn.org>
This commit is contained in:
committed by
Russell Bryant
parent
aff0c4a22e
commit
167703d664
6
FAQ.md
6
FAQ.md
@@ -465,7 +465,7 @@ A: Firstly, you must have a DPDK-enabled version of Open vSwitch.
|
|||||||
|
|
||||||
Finally, it is required that DPDK port names begin with 'dpdk'.
|
Finally, it is required that DPDK port names begin with 'dpdk'.
|
||||||
|
|
||||||
See [INSTALL.DPDK.md] for more information on enabling and using DPDK with
|
See [INSTALL.DPDK.rst] for more information on enabling and using DPDK with
|
||||||
Open vSwitch.
|
Open vSwitch.
|
||||||
|
|
||||||
### Q: How do I configure a VLAN as an RSPAN VLAN, that is, enable mirroring of all traffic to that VLAN?
|
### Q: How do I configure a VLAN as an RSPAN VLAN, that is, enable mirroring of all traffic to that VLAN?
|
||||||
@@ -778,7 +778,7 @@ A: More than likely, you've looped your network. Probably, eth0 and
|
|||||||
for all the details.
|
for all the details.
|
||||||
|
|
||||||
Configuration for DPDK-enabled interfaces is slightly less
|
Configuration for DPDK-enabled interfaces is slightly less
|
||||||
straightforward: see [INSTALL.DPDK.md].
|
straightforward: see [INSTALL.DPDK.rst].
|
||||||
|
|
||||||
- Perhaps you don't actually need eth0 and eth1 to be on the
|
- Perhaps you don't actually need eth0 and eth1 to be on the
|
||||||
same bridge. For example, if you simply want to be able to
|
same bridge. For example, if you simply want to be able to
|
||||||
@@ -2153,6 +2153,6 @@ http://openvswitch.org/
|
|||||||
[WHY-OVS.md]:WHY-OVS.md
|
[WHY-OVS.md]:WHY-OVS.md
|
||||||
[INSTALL.rst]:INSTALL.rst
|
[INSTALL.rst]:INSTALL.rst
|
||||||
[OPENFLOW-1.1+.md]:OPENFLOW-1.1+.md
|
[OPENFLOW-1.1+.md]:OPENFLOW-1.1+.md
|
||||||
[INSTALL.DPDK.md]:INSTALL.DPDK.md
|
[INSTALL.DPDK.rst]:INSTALL.DPDK.rst
|
||||||
[Tutorial.md]:tutorial/Tutorial.md
|
[Tutorial.md]:tutorial/Tutorial.md
|
||||||
[release-process.md]:Documentation/release-process.md
|
[release-process.md]:Documentation/release-process.md
|
||||||
|
@@ -892,7 +892,7 @@ Please report problems to bugs@openvswitch.org.
|
|||||||
[DPDK Linux GSG]: http://www.dpdk.org/doc/guides/linux_gsg/build_dpdk.html#binding-and-unbinding-network-ports-to-from-the-igb-uioor-vfio-modules
|
[DPDK Linux GSG]: http://www.dpdk.org/doc/guides/linux_gsg/build_dpdk.html#binding-and-unbinding-network-ports-to-from-the-igb-uioor-vfio-modules
|
||||||
[DPDK Docs]: http://dpdk.org/doc
|
[DPDK Docs]: http://dpdk.org/doc
|
||||||
[libvirt]: http://libvirt.org/formatdomain.html
|
[libvirt]: http://libvirt.org/formatdomain.html
|
||||||
[Guest VM using libvirt]: INSTALL.DPDK.md#ovstc
|
[Guest VM using libvirt]: INSTALL.DPDK.rst#ovstc
|
||||||
[Vhost walkthrough]: INSTALL.DPDK.md#vhost
|
[Vhost walkthrough]: INSTALL.DPDK.rst#vhost
|
||||||
[INSTALL DPDK]: INSTALL.DPDK.md#build
|
[INSTALL DPDK]: INSTALL.DPDK.rst#build
|
||||||
[INSTALL OVS]: INSTALL.DPDK.md#build
|
[INSTALL OVS]: INSTALL.DPDK.rst#build
|
||||||
|
625
INSTALL.DPDK.md
625
INSTALL.DPDK.md
@@ -1,625 +0,0 @@
|
|||||||
OVS DPDK INSTALL GUIDE
|
|
||||||
================================
|
|
||||||
|
|
||||||
## Contents
|
|
||||||
|
|
||||||
1. [Overview](#overview)
|
|
||||||
2. [Building and Installation](#build)
|
|
||||||
3. [Setup OVS DPDK datapath](#ovssetup)
|
|
||||||
4. [DPDK in the VM](#builddpdk)
|
|
||||||
5. [OVS Testcases](#ovstc)
|
|
||||||
6. [Limitations ](#ovslimits)
|
|
||||||
|
|
||||||
## <a name="overview"></a> 1. Overview
|
|
||||||
|
|
||||||
Open vSwitch can use DPDK lib to operate entirely in userspace.
|
|
||||||
This file provides information on installation and use of Open vSwitch
|
|
||||||
using DPDK datapath. This version of Open vSwitch should be built manually
|
|
||||||
with `configure` and `make`.
|
|
||||||
|
|
||||||
The DPDK support of Open vSwitch is considered 'experimental'.
|
|
||||||
|
|
||||||
### Prerequisites
|
|
||||||
|
|
||||||
* Required: DPDK 16.07
|
|
||||||
* Hardware: [DPDK Supported NICs] when physical ports in use
|
|
||||||
|
|
||||||
## <a name="build"></a> 2. Building and Installation
|
|
||||||
|
|
||||||
### 2.1 Configure & build the Linux kernel
|
|
||||||
|
|
||||||
On Linux Distros running kernel version >= 3.0, kernel rebuild is not required
|
|
||||||
and only grub cmdline needs to be updated for enabling IOMMU [VFIO support - 3.2].
|
|
||||||
For older kernels, check if kernel is built with UIO, HUGETLBFS, PROC_PAGE_MONITOR,
|
|
||||||
HPET, HPET_MMAP support.
|
|
||||||
|
|
||||||
Detailed system requirements can be found at [DPDK requirements] and also refer to
|
|
||||||
advanced install guide [INSTALL.DPDK-ADVANCED.md]
|
|
||||||
|
|
||||||
### 2.2 Install DPDK
|
|
||||||
1. [Download DPDK] and extract the file, for example in to /usr/src
|
|
||||||
and set DPDK_DIR
|
|
||||||
|
|
||||||
```
|
|
||||||
cd /usr/src/
|
|
||||||
wget http://dpdk.org/browse/dpdk/snapshot/dpdk-16.07.zip
|
|
||||||
unzip dpdk-16.07.zip
|
|
||||||
|
|
||||||
export DPDK_DIR=/usr/src/dpdk-16.07
|
|
||||||
cd $DPDK_DIR
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Configure and Install DPDK
|
|
||||||
|
|
||||||
Build and install the DPDK library.
|
|
||||||
|
|
||||||
```
|
|
||||||
export DPDK_TARGET=x86_64-native-linuxapp-gcc
|
|
||||||
export DPDK_BUILD=$DPDK_DIR/$DPDK_TARGET
|
|
||||||
make install T=$DPDK_TARGET DESTDIR=install
|
|
||||||
```
|
|
||||||
|
|
||||||
Note: For IVSHMEM, Set `export DPDK_TARGET=x86_64-ivshmem-linuxapp-gcc`
|
|
||||||
|
|
||||||
### 2.3 Install OVS
|
|
||||||
OVS can be installed using different methods. For OVS to use DPDK datapath,
|
|
||||||
it has to be configured with DPDK support and is done by './configure --with-dpdk'.
|
|
||||||
This section focus on generic recipe that suits most cases and for distribution
|
|
||||||
specific instructions, refer [INSTALL.Fedora.md], [INSTALL.RHEL.md] and
|
|
||||||
[INSTALL.Debian.md].
|
|
||||||
|
|
||||||
The OVS sources can be downloaded in different ways and skip this section
|
|
||||||
if already having the correct sources. Otherwise download the correct version using
|
|
||||||
one of the below suggested methods and follow the documentation of that specific
|
|
||||||
version.
|
|
||||||
|
|
||||||
- OVS stable releases can be downloaded in compressed format from [Download OVS]
|
|
||||||
|
|
||||||
```
|
|
||||||
cd /usr/src
|
|
||||||
wget http://openvswitch.org/releases/openvswitch-<version>.tar.gz
|
|
||||||
tar -zxvf openvswitch-<version>.tar.gz
|
|
||||||
export OVS_DIR=/usr/src/openvswitch-<version>
|
|
||||||
```
|
|
||||||
|
|
||||||
- OVS current development can be clone using 'git' tool
|
|
||||||
|
|
||||||
```
|
|
||||||
cd /usr/src/
|
|
||||||
git clone https://github.com/openvswitch/ovs.git
|
|
||||||
export OVS_DIR=/usr/src/ovs
|
|
||||||
```
|
|
||||||
|
|
||||||
- Install OVS dependencies
|
|
||||||
|
|
||||||
GNU make, GCC 4.x (or) Clang 3.4, libnuma (Mandatory)
|
|
||||||
libssl, libcap-ng, Python 2.7 (Optional)
|
|
||||||
More information can be found at [Build Requirements]
|
|
||||||
|
|
||||||
- Configure, Install OVS
|
|
||||||
|
|
||||||
```
|
|
||||||
cd $OVS_DIR
|
|
||||||
./boot.sh
|
|
||||||
./configure --with-dpdk=$DPDK_BUILD
|
|
||||||
make install
|
|
||||||
```
|
|
||||||
|
|
||||||
Note: Passing DPDK_BUILD can be skipped if DPDK library is installed in
|
|
||||||
standard locations i.e `./configure --with-dpdk` should suffice.
|
|
||||||
|
|
||||||
Additional information can be found in [INSTALL.rst].
|
|
||||||
|
|
||||||
## <a name="ovssetup"></a> 3. Setup OVS with DPDK datapath
|
|
||||||
|
|
||||||
### 3.1 Setup Hugepages
|
|
||||||
|
|
||||||
Allocate and mount 2M Huge pages:
|
|
||||||
|
|
||||||
- For persistent allocation of huge pages, write to hugepages.conf file
|
|
||||||
in /etc/sysctl.d
|
|
||||||
|
|
||||||
`echo 'vm.nr_hugepages=2048' > /etc/sysctl.d/hugepages.conf`
|
|
||||||
|
|
||||||
- For run-time allocation of huge pages
|
|
||||||
|
|
||||||
`sysctl -w vm.nr_hugepages=N` where N = No. of 2M huge pages allocated
|
|
||||||
|
|
||||||
- To verify hugepage configuration
|
|
||||||
|
|
||||||
`grep HugePages_ /proc/meminfo`
|
|
||||||
|
|
||||||
- Mount hugepages
|
|
||||||
|
|
||||||
`mount -t hugetlbfs none /dev/hugepages`
|
|
||||||
|
|
||||||
Note: Mount hugepages if not already mounted by default.
|
|
||||||
|
|
||||||
### 3.2 Setup DPDK devices using VFIO
|
|
||||||
|
|
||||||
- Supported with kernel version >= 3.6
|
|
||||||
- VFIO needs support from BIOS and kernel.
|
|
||||||
- BIOS changes:
|
|
||||||
|
|
||||||
Enable VT-d, can be verified from `dmesg | grep -e DMAR -e IOMMU` output
|
|
||||||
|
|
||||||
- GRUB bootline:
|
|
||||||
|
|
||||||
Add `iommu=pt intel_iommu=on`, can be verified from `cat /proc/cmdline` output
|
|
||||||
|
|
||||||
- Load modules and bind the NIC to VFIO driver
|
|
||||||
|
|
||||||
```
|
|
||||||
modprobe vfio-pci
|
|
||||||
sudo /usr/bin/chmod a+x /dev/vfio
|
|
||||||
sudo /usr/bin/chmod 0666 /dev/vfio/*
|
|
||||||
$DPDK_DIR/tools/dpdk-devbind.py --bind=vfio-pci eth1
|
|
||||||
$DPDK_DIR/tools/dpdk-devbind.py --status
|
|
||||||
```
|
|
||||||
|
|
||||||
Note: If running kernels < 3.6 UIO drivers to be used,
|
|
||||||
please check [DPDK in the VM], DPDK devices using UIO section for the steps.
|
|
||||||
|
|
||||||
### 3.3 Setup OVS
|
|
||||||
|
|
||||||
1. DB creation (One time step)
|
|
||||||
|
|
||||||
```
|
|
||||||
mkdir -p /usr/local/etc/openvswitch
|
|
||||||
mkdir -p /usr/local/var/run/openvswitch
|
|
||||||
rm /usr/local/etc/openvswitch/conf.db
|
|
||||||
ovsdb-tool create /usr/local/etc/openvswitch/conf.db \
|
|
||||||
/usr/local/share/openvswitch/vswitch.ovsschema
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Start ovsdb-server
|
|
||||||
|
|
||||||
No SSL support
|
|
||||||
|
|
||||||
```
|
|
||||||
ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock \
|
|
||||||
--remote=db:Open_vSwitch,Open_vSwitch,manager_options \
|
|
||||||
--pidfile --detach
|
|
||||||
```
|
|
||||||
|
|
||||||
SSL support
|
|
||||||
|
|
||||||
```
|
|
||||||
ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock \
|
|
||||||
--remote=db:Open_vSwitch,Open_vSwitch,manager_options \
|
|
||||||
--private-key=db:Open_vSwitch,SSL,private_key \
|
|
||||||
--certificate=Open_vSwitch,SSL,certificate \
|
|
||||||
--bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --pidfile --detach
|
|
||||||
```
|
|
||||||
|
|
||||||
3. Initialize DB (One time step)
|
|
||||||
|
|
||||||
```
|
|
||||||
ovs-vsctl --no-wait init
|
|
||||||
```
|
|
||||||
|
|
||||||
4. Start vswitchd
|
|
||||||
|
|
||||||
DPDK configuration arguments can be passed to vswitchd via Open_vSwitch
|
|
||||||
'other_config' column. The important configuration options are listed below.
|
|
||||||
Defaults will be provided for all values not explicitly set. Refer
|
|
||||||
ovs-vswitchd.conf.db(5) for additional information on configuration options.
|
|
||||||
|
|
||||||
* dpdk-init
|
|
||||||
Specifies whether OVS should initialize and support DPDK ports. This is
|
|
||||||
a boolean, and defaults to false.
|
|
||||||
|
|
||||||
* dpdk-lcore-mask
|
|
||||||
Specifies the CPU cores on which dpdk lcore threads should be spawned and
|
|
||||||
expects hex string (eg '0x123').
|
|
||||||
|
|
||||||
* dpdk-socket-mem
|
|
||||||
Comma separated list of memory to pre-allocate from hugepages on specific
|
|
||||||
sockets.
|
|
||||||
|
|
||||||
* dpdk-hugepage-dir
|
|
||||||
Directory where hugetlbfs is mounted
|
|
||||||
|
|
||||||
* vhost-sock-dir
|
|
||||||
Option to set the path to the vhost_user unix socket files.
|
|
||||||
|
|
||||||
NOTE: Changing any of these options requires restarting the ovs-vswitchd
|
|
||||||
application.
|
|
||||||
|
|
||||||
Open vSwitch can be started as normal. DPDK will be initialized as long
|
|
||||||
as the dpdk-init option has been set to 'true'.
|
|
||||||
|
|
||||||
```
|
|
||||||
export DB_SOCK=/usr/local/var/run/openvswitch/db.sock
|
|
||||||
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
|
|
||||||
ovs-vswitchd unix:$DB_SOCK --pidfile --detach
|
|
||||||
```
|
|
||||||
|
|
||||||
If allocated more than one GB hugepage (as for IVSHMEM), set amount and
|
|
||||||
use NUMA node 0 memory. For details on using ivshmem with DPDK, refer to
|
|
||||||
[OVS Testcases].
|
|
||||||
|
|
||||||
```
|
|
||||||
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem="1024,0"
|
|
||||||
ovs-vswitchd unix:$DB_SOCK --pidfile --detach
|
|
||||||
```
|
|
||||||
|
|
||||||
To better scale the work loads across cores, Multiple pmd threads can be
|
|
||||||
created and pinned to CPU cores by explicity specifying pmd-cpu-mask.
|
|
||||||
eg: To spawn 2 pmd threads and pin them to cores 1, 2
|
|
||||||
|
|
||||||
```
|
|
||||||
ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=6
|
|
||||||
```
|
|
||||||
|
|
||||||
5. Create bridge & add DPDK devices
|
|
||||||
|
|
||||||
create a bridge with datapath_type "netdev" in the configuration database
|
|
||||||
|
|
||||||
`ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev`
|
|
||||||
|
|
||||||
Now you can add DPDK devices. OVS expects DPDK device names to start with
|
|
||||||
"dpdk" and end with a portid. vswitchd should print (in the log file) the
|
|
||||||
number of dpdk devices found.
|
|
||||||
|
|
||||||
```
|
|
||||||
ovs-vsctl add-port br0 dpdk0 -- set Interface dpdk0 type=dpdk
|
|
||||||
ovs-vsctl add-port br0 dpdk1 -- set Interface dpdk1 type=dpdk
|
|
||||||
```
|
|
||||||
|
|
||||||
After the DPDK ports get added to switch, a polling thread continuously polls
|
|
||||||
DPDK devices and consumes 100% of the core as can be checked from 'top' and 'ps' cmds.
|
|
||||||
|
|
||||||
```
|
|
||||||
top -H
|
|
||||||
ps -eLo pid,psr,comm | grep pmd
|
|
||||||
```
|
|
||||||
|
|
||||||
Note: creating bonds of DPDK interfaces is slightly different to creating
|
|
||||||
bonds of system interfaces. For DPDK, the interface type must be explicitly
|
|
||||||
set, for example:
|
|
||||||
|
|
||||||
```
|
|
||||||
ovs-vsctl add-bond br0 dpdkbond dpdk0 dpdk1 -- set Interface dpdk0 type=dpdk -- set Interface dpdk1 type=dpdk
|
|
||||||
```
|
|
||||||
|
|
||||||
6. PMD thread statistics
|
|
||||||
|
|
||||||
```
|
|
||||||
# Check current stats
|
|
||||||
ovs-appctl dpif-netdev/pmd-stats-show
|
|
||||||
|
|
||||||
# Clear previous stats
|
|
||||||
ovs-appctl dpif-netdev/pmd-stats-clear
|
|
||||||
```
|
|
||||||
|
|
||||||
7. Port/rxq assigment to PMD threads
|
|
||||||
|
|
||||||
```
|
|
||||||
# Show port/rxq assignment
|
|
||||||
ovs-appctl dpif-netdev/pmd-rxq-show
|
|
||||||
```
|
|
||||||
|
|
||||||
To change default rxq assignment to pmd threads rxqs may be manually
|
|
||||||
pinned to desired cores using:
|
|
||||||
|
|
||||||
```
|
|
||||||
ovs-vsctl set Interface <iface> \
|
|
||||||
other_config:pmd-rxq-affinity=<rxq-affinity-list>
|
|
||||||
```
|
|
||||||
where:
|
|
||||||
|
|
||||||
```
|
|
||||||
<rxq-affinity-list> ::= NULL | <non-empty-list>
|
|
||||||
<non-empty-list> ::= <affinity-pair> |
|
|
||||||
<affinity-pair> , <non-empty-list>
|
|
||||||
<affinity-pair> ::= <queue-id> : <core-id>
|
|
||||||
```
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
```
|
|
||||||
ovs-vsctl set interface dpdk0 options:n_rxq=4 \
|
|
||||||
other_config:pmd-rxq-affinity="0:3,1:7,3:8"
|
|
||||||
|
|
||||||
Queue #0 pinned to core 3;
|
|
||||||
Queue #1 pinned to core 7;
|
|
||||||
Queue #2 not pinned.
|
|
||||||
Queue #3 pinned to core 8;
|
|
||||||
```
|
|
||||||
|
|
||||||
After that PMD threads on cores where RX queues was pinned will become
|
|
||||||
`isolated`. This means that this thread will poll only pinned RX queues.
|
|
||||||
|
|
||||||
WARNING: If there are no `non-isolated` PMD threads, `non-pinned` RX queues
|
|
||||||
will not be polled. Also, if provided `core_id` is not available (ex. this
|
|
||||||
`core_id` not in `pmd-cpu-mask`), RX queue will not be polled by any
|
|
||||||
PMD thread.
|
|
||||||
|
|
||||||
Isolation of PMD threads also can be checked using
|
|
||||||
`ovs-appctl dpif-netdev/pmd-rxq-show` command.
|
|
||||||
|
|
||||||
8. Stop vswitchd & Delete bridge
|
|
||||||
|
|
||||||
```
|
|
||||||
ovs-appctl -t ovs-vswitchd exit
|
|
||||||
ovs-appctl -t ovsdb-server exit
|
|
||||||
ovs-vsctl del-br br0
|
|
||||||
```
|
|
||||||
|
|
||||||
## <a name="builddpdk"></a> 4. DPDK in the VM
|
|
||||||
|
|
||||||
DPDK 'testpmd' application can be run in the Guest VM for high speed
|
|
||||||
packet forwarding between vhostuser ports. DPDK and testpmd application
|
|
||||||
has to be compiled on the guest VM. Below are the steps for setting up
|
|
||||||
the testpmd application in the VM. More information on the vhostuser ports
|
|
||||||
can be found in [Vhost Walkthrough].
|
|
||||||
|
|
||||||
* Instantiate the Guest
|
|
||||||
|
|
||||||
```
|
|
||||||
Qemu version >= 2.2.0
|
|
||||||
|
|
||||||
export VM_NAME=Centos-vm
|
|
||||||
export GUEST_MEM=3072M
|
|
||||||
export QCOW2_IMAGE=/root/CentOS7_x86_64.qcow2
|
|
||||||
export VHOST_SOCK_DIR=/usr/local/var/run/openvswitch
|
|
||||||
|
|
||||||
qemu-system-x86_64 -name $VM_NAME -cpu host -enable-kvm -m $GUEST_MEM -object memory-backend-file,id=mem,size=$GUEST_MEM,mem-path=/dev/hugepages,share=on -numa node,memdev=mem -mem-prealloc -smp sockets=1,cores=2 -drive file=$QCOW2_IMAGE -chardev socket,id=char0,path=$VHOST_SOCK_DIR/dpdkvhostuser0 -netdev type=vhost-user,id=mynet1,chardev=char0,vhostforce -device virtio-net-pci,mac=00:00:00:00:00:01,netdev=mynet1,mrg_rxbuf=off -chardev socket,id=char1,path=$VHOST_SOCK_DIR/dpdkvhostuser1 -netdev type=vhost-user,id=mynet2,chardev=char1,vhostforce -device virtio-net-pci,mac=00:00:00:00:00:02,netdev=mynet2,mrg_rxbuf=off --nographic -snapshot
|
|
||||||
```
|
|
||||||
|
|
||||||
* Download the DPDK Srcs to VM and build DPDK
|
|
||||||
|
|
||||||
```
|
|
||||||
cd /root/dpdk/
|
|
||||||
wget http://dpdk.org/browse/dpdk/snapshot/dpdk-16.07.zip
|
|
||||||
unzip dpdk-16.07.zip
|
|
||||||
export DPDK_DIR=/root/dpdk/dpdk-16.07
|
|
||||||
export DPDK_TARGET=x86_64-native-linuxapp-gcc
|
|
||||||
export DPDK_BUILD=$DPDK_DIR/$DPDK_TARGET
|
|
||||||
cd $DPDK_DIR
|
|
||||||
make install T=$DPDK_TARGET DESTDIR=install
|
|
||||||
```
|
|
||||||
|
|
||||||
* Build the test-pmd application
|
|
||||||
|
|
||||||
```
|
|
||||||
cd app/test-pmd
|
|
||||||
export RTE_SDK=$DPDK_DIR
|
|
||||||
export RTE_TARGET=$DPDK_TARGET
|
|
||||||
make
|
|
||||||
```
|
|
||||||
|
|
||||||
* Setup Huge pages and DPDK devices using UIO
|
|
||||||
|
|
||||||
```
|
|
||||||
sysctl vm.nr_hugepages=1024
|
|
||||||
mkdir -p /dev/hugepages
|
|
||||||
mount -t hugetlbfs hugetlbfs /dev/hugepages (only if not already mounted)
|
|
||||||
modprobe uio
|
|
||||||
insmod $DPDK_BUILD/kmod/igb_uio.ko
|
|
||||||
$DPDK_DIR/tools/dpdk-devbind.py --status
|
|
||||||
$DPDK_DIR/tools/dpdk-devbind.py -b igb_uio 00:03.0 00:04.0
|
|
||||||
```
|
|
||||||
|
|
||||||
vhost ports pci ids can be retrieved using `lspci | grep Ethernet` cmd.
|
|
||||||
|
|
||||||
## <a name="ovstc"></a> 5. OVS Testcases
|
|
||||||
|
|
||||||
Below are few testcases and the list of steps to be followed.
|
|
||||||
|
|
||||||
### 5.1 PHY-PHY
|
|
||||||
|
|
||||||
The steps (1-5) in 3.3 section will create & initialize DB, start vswitchd and also
|
|
||||||
add DPDK devices to bridge 'br0'.
|
|
||||||
|
|
||||||
1. Add Test flows to forward packets betwen DPDK port 0 and port 1
|
|
||||||
|
|
||||||
```
|
|
||||||
# Clear current flows
|
|
||||||
ovs-ofctl del-flows br0
|
|
||||||
|
|
||||||
# Add flows between port 1 (dpdk0) to port 2 (dpdk1)
|
|
||||||
ovs-ofctl add-flow br0 in_port=1,action=output:2
|
|
||||||
ovs-ofctl add-flow br0 in_port=2,action=output:1
|
|
||||||
```
|
|
||||||
|
|
||||||
### 5.2 PHY-VM-PHY [VHOST LOOPBACK]
|
|
||||||
|
|
||||||
The steps (1-5) in 3.3 section will create & initialize DB, start vswitchd and also
|
|
||||||
add DPDK devices to bridge 'br0'.
|
|
||||||
|
|
||||||
1. Add dpdkvhostuser ports to bridge 'br0'. More information on the dpdkvhostuser ports
|
|
||||||
can be found in [Vhost Walkthrough].
|
|
||||||
|
|
||||||
```
|
|
||||||
ovs-vsctl add-port br0 dpdkvhostuser0 -- set Interface dpdkvhostuser0 type=dpdkvhostuser
|
|
||||||
ovs-vsctl add-port br0 dpdkvhostuser1 -- set Interface dpdkvhostuser1 type=dpdkvhostuser
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Add Test flows to forward packets betwen DPDK devices and VM ports
|
|
||||||
|
|
||||||
```
|
|
||||||
# Clear current flows
|
|
||||||
ovs-ofctl del-flows br0
|
|
||||||
|
|
||||||
# Add flows
|
|
||||||
ovs-ofctl add-flow br0 in_port=1,action=output:3
|
|
||||||
ovs-ofctl add-flow br0 in_port=3,action=output:1
|
|
||||||
ovs-ofctl add-flow br0 in_port=4,action=output:2
|
|
||||||
ovs-ofctl add-flow br0 in_port=2,action=output:4
|
|
||||||
|
|
||||||
# Dump flows
|
|
||||||
ovs-ofctl dump-flows br0
|
|
||||||
```
|
|
||||||
|
|
||||||
3. Instantiate Guest VM using Qemu cmdline
|
|
||||||
|
|
||||||
Guest Configuration
|
|
||||||
|
|
||||||
```
|
|
||||||
| configuration | values | comments
|
|
||||||
|----------------------|--------|-----------------
|
|
||||||
| qemu version | 2.2.0 |
|
|
||||||
| qemu thread affinity | core 5 | taskset 0x20
|
|
||||||
| memory | 4GB | -
|
|
||||||
| cores | 2 | -
|
|
||||||
| Qcow2 image | CentOS7| -
|
|
||||||
| mrg_rxbuf | off | -
|
|
||||||
```
|
|
||||||
|
|
||||||
Instantiate Guest
|
|
||||||
|
|
||||||
```
|
|
||||||
export VM_NAME=vhost-vm
|
|
||||||
export GUEST_MEM=3072M
|
|
||||||
export QCOW2_IMAGE=/root/CentOS7_x86_64.qcow2
|
|
||||||
export VHOST_SOCK_DIR=/usr/local/var/run/openvswitch
|
|
||||||
|
|
||||||
taskset 0x20 qemu-system-x86_64 -name $VM_NAME -cpu host -enable-kvm -m $GUEST_MEM -object memory-backend-file,id=mem,size=$GUEST_MEM,mem-path=/dev/hugepages,share=on -numa node,memdev=mem -mem-prealloc -smp sockets=1,cores=2 -drive file=$QCOW2_IMAGE -chardev socket,id=char0,path=$VHOST_SOCK_DIR/dpdkvhostuser0 -netdev type=vhost-user,id=mynet1,chardev=char0,vhostforce -device virtio-net-pci,mac=00:00:00:00:00:01,netdev=mynet1,mrg_rxbuf=off -chardev socket,id=char1,path=$VHOST_SOCK_DIR/dpdkvhostuser1 -netdev type=vhost-user,id=mynet2,chardev=char1,vhostforce -device virtio-net-pci,mac=00:00:00:00:00:02,netdev=mynet2,mrg_rxbuf=off --nographic -snapshot
|
|
||||||
```
|
|
||||||
|
|
||||||
4. Guest VM using libvirt
|
|
||||||
|
|
||||||
The below is a simple xml configuration of 'demovm' guest that can be instantiated
|
|
||||||
using 'virsh'. The guest uses a pair of vhostuser port and boots with 4GB RAM and 2 cores.
|
|
||||||
More information can be found in [Vhost Walkthrough].
|
|
||||||
|
|
||||||
```
|
|
||||||
<domain type='kvm'>
|
|
||||||
<name>demovm</name>
|
|
||||||
<uuid>4a9b3f53-fa2a-47f3-a757-dd87720d9d1d</uuid>
|
|
||||||
<memory unit='KiB'>4194304</memory>
|
|
||||||
<currentMemory unit='KiB'>4194304</currentMemory>
|
|
||||||
<memoryBacking>
|
|
||||||
<hugepages>
|
|
||||||
<page size='2' unit='M' nodeset='0'/>
|
|
||||||
</hugepages>
|
|
||||||
</memoryBacking>
|
|
||||||
<vcpu placement='static'>2</vcpu>
|
|
||||||
<cputune>
|
|
||||||
<shares>4096</shares>
|
|
||||||
<vcpupin vcpu='0' cpuset='4'/>
|
|
||||||
<vcpupin vcpu='1' cpuset='5'/>
|
|
||||||
<emulatorpin cpuset='4,5'/>
|
|
||||||
</cputune>
|
|
||||||
<os>
|
|
||||||
<type arch='x86_64' machine='pc'>hvm</type>
|
|
||||||
<boot dev='hd'/>
|
|
||||||
</os>
|
|
||||||
<features>
|
|
||||||
<acpi/>
|
|
||||||
<apic/>
|
|
||||||
</features>
|
|
||||||
<cpu mode='host-model'>
|
|
||||||
<model fallback='allow'/>
|
|
||||||
<topology sockets='2' cores='1' threads='1'/>
|
|
||||||
<numa>
|
|
||||||
<cell id='0' cpus='0-1' memory='4194304' unit='KiB' memAccess='shared'/>
|
|
||||||
</numa>
|
|
||||||
</cpu>
|
|
||||||
<on_poweroff>destroy</on_poweroff>
|
|
||||||
<on_reboot>restart</on_reboot>
|
|
||||||
<on_crash>destroy</on_crash>
|
|
||||||
<devices>
|
|
||||||
<emulator>/usr/bin/qemu-kvm</emulator>
|
|
||||||
<disk type='file' device='disk'>
|
|
||||||
<driver name='qemu' type='qcow2' cache='none'/>
|
|
||||||
<source file='/root/CentOS7_x86_64.qcow2'/>
|
|
||||||
<target dev='vda' bus='virtio'/>
|
|
||||||
</disk>
|
|
||||||
<disk type='dir' device='disk'>
|
|
||||||
<driver name='qemu' type='fat'/>
|
|
||||||
<source dir='/usr/src/dpdk-16.07'/>
|
|
||||||
<target dev='vdb' bus='virtio'/>
|
|
||||||
<readonly/>
|
|
||||||
</disk>
|
|
||||||
<interface type='vhostuser'>
|
|
||||||
<mac address='00:00:00:00:00:01'/>
|
|
||||||
<source type='unix' path='/usr/local/var/run/openvswitch/dpdkvhostuser0' mode='client'/>
|
|
||||||
<model type='virtio'/>
|
|
||||||
<driver queues='2'>
|
|
||||||
<host mrg_rxbuf='off'/>
|
|
||||||
</driver>
|
|
||||||
</interface>
|
|
||||||
<interface type='vhostuser'>
|
|
||||||
<mac address='00:00:00:00:00:02'/>
|
|
||||||
<source type='unix' path='/usr/local/var/run/openvswitch/dpdkvhostuser1' mode='client'/>
|
|
||||||
<model type='virtio'/>
|
|
||||||
<driver queues='2'>
|
|
||||||
<host mrg_rxbuf='off'/>
|
|
||||||
</driver>
|
|
||||||
</interface>
|
|
||||||
<serial type='pty'>
|
|
||||||
<target port='0'/>
|
|
||||||
</serial>
|
|
||||||
<console type='pty'>
|
|
||||||
<target type='serial' port='0'/>
|
|
||||||
</console>
|
|
||||||
</devices>
|
|
||||||
</domain>
|
|
||||||
```
|
|
||||||
|
|
||||||
5. DPDK Packet forwarding in Guest VM
|
|
||||||
|
|
||||||
To accomplish this, DPDK and testpmd application have to be first compiled
|
|
||||||
on the VM and the steps are listed in [DPDK in the VM].
|
|
||||||
|
|
||||||
* Run test-pmd application
|
|
||||||
|
|
||||||
```
|
|
||||||
cd $DPDK_DIR/app/test-pmd;
|
|
||||||
./testpmd -c 0x3 -n 4 --socket-mem 1024 -- --burst=64 -i --txqflags=0xf00 --disable-hw-vlan
|
|
||||||
set fwd mac retry
|
|
||||||
start
|
|
||||||
```
|
|
||||||
|
|
||||||
* Bind vNIC back to kernel once the test is completed.
|
|
||||||
|
|
||||||
```
|
|
||||||
$DPDK_DIR/tools/dpdk-devbind.py --bind=virtio-pci 0000:00:03.0
|
|
||||||
$DPDK_DIR/tools/dpdk-devbind.py --bind=virtio-pci 0000:00:04.0
|
|
||||||
```
|
|
||||||
Note: Appropriate PCI IDs to be passed in above example. The PCI IDs can be
|
|
||||||
retrieved using '$DPDK_DIR/tools/dpdk-devbind.py --status' cmd.
|
|
||||||
|
|
||||||
### 5.3 PHY-VM-PHY [IVSHMEM]
|
|
||||||
|
|
||||||
The steps for setup of IVSHMEM are covered in section 5.2(PVP - IVSHMEM)
|
|
||||||
of [OVS Testcases] in ADVANCED install guide.
|
|
||||||
|
|
||||||
## <a name="ovslimits"></a> 6. Limitations
|
|
||||||
|
|
||||||
- Currently DPDK ports does not use HW offload functionality.
|
|
||||||
- Network Interface Firmware requirements:
|
|
||||||
Each release of DPDK is validated against a specific firmware version for
|
|
||||||
a supported Network Interface. New firmware versions introduce bug fixes,
|
|
||||||
performance improvements and new functionality that DPDK leverages. The
|
|
||||||
validated firmware versions are available as part of the release notes for
|
|
||||||
DPDK. It is recommended that users update Network Interface firmware to
|
|
||||||
match what has been validated for the DPDK release.
|
|
||||||
|
|
||||||
For DPDK 16.07, the list of validated firmware versions can be found at:
|
|
||||||
|
|
||||||
http://dpdk.org/doc/guides/rel_notes/release_16.07.html
|
|
||||||
|
|
||||||
|
|
||||||
Bug Reporting:
|
|
||||||
--------------
|
|
||||||
|
|
||||||
Please report problems to bugs@openvswitch.org.
|
|
||||||
|
|
||||||
|
|
||||||
[DPDK requirements]: http://dpdk.org/doc/guides/linux_gsg/sys_reqs.html
|
|
||||||
[Download DPDK]: http://dpdk.org/browse/dpdk/refs/
|
|
||||||
[Download OVS]: http://openvswitch.org/releases/
|
|
||||||
[DPDK Supported NICs]: http://dpdk.org/doc/nics
|
|
||||||
[Build Requirements]: https://github.com/openvswitch/ovs/blob/master/INSTALL.rst#build-requirements
|
|
||||||
[INSTALL.DPDK-ADVANCED.md]: INSTALL.DPDK-ADVANCED.md
|
|
||||||
[OVS Testcases]: INSTALL.DPDK-ADVANCED.md#ovstc
|
|
||||||
[Vhost Walkthrough]: INSTALL.DPDK-ADVANCED.md#vhost
|
|
||||||
[DPDK in the VM]: INSTALL.DPDK.md#builddpdk
|
|
||||||
[INSTALL.rst]:INSTALL.rst
|
|
||||||
[INSTALL.Fedora.md]:INSTALL.Fedora.md
|
|
||||||
[INSTALL.RHEL.md]:INSTALL.RHEL.md
|
|
||||||
[INSTALL.Debian.md]:INSTALL.Debian.md
|
|
604
INSTALL.DPDK.rst
Normal file
604
INSTALL.DPDK.rst
Normal file
@@ -0,0 +1,604 @@
|
|||||||
|
..
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
not use this file except in compliance with the License. You may obtain
|
||||||
|
a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
License for the specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
|
||||||
|
Convention for heading levels in Open vSwitch documentation:
|
||||||
|
|
||||||
|
======= Heading 0 (reserved for the title in a document)
|
||||||
|
------- Heading 1
|
||||||
|
~~~~~~~ Heading 2
|
||||||
|
+++++++ Heading 3
|
||||||
|
''''''' Heading 4
|
||||||
|
|
||||||
|
Avoid deeper levels because they do not render well.
|
||||||
|
|
||||||
|
======================
|
||||||
|
Open vSwitch with DPDK
|
||||||
|
======================
|
||||||
|
|
||||||
|
This document describes how to build and install Open vSwitch using a DPDK
|
||||||
|
datapath. Open vSwitch can use the DPDK library to operate entirely in
|
||||||
|
userspace.
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
The DPDK support of Open vSwitch is considered 'experimental'.
|
||||||
|
|
||||||
|
Build requirements
|
||||||
|
------------------
|
||||||
|
|
||||||
|
In addition to the requirements described in the `installation guide
|
||||||
|
<INSTALL.rst>`__, building Open vSwitch with DPDK will require the following:
|
||||||
|
|
||||||
|
- DPDK 16.07
|
||||||
|
|
||||||
|
- A `DPDK supported NIC`_
|
||||||
|
|
||||||
|
Only required when physical ports are in use
|
||||||
|
|
||||||
|
- A suitable kernel
|
||||||
|
|
||||||
|
On Linux Distros running kernel version >= 3.0, only `IOMMU` needs to enabled
|
||||||
|
via the grub cmdline, assuming you are using **VFIO**. For older kernels,
|
||||||
|
ensure the kernel is built with ``UIO``, ``HUGETLBFS``,
|
||||||
|
``PROC_PAGE_MONITOR``, ``HPET``, ``HPET_MMAP`` support. If these are not
|
||||||
|
present, it will be necessary to upgrade your kernel or build a custom kernel
|
||||||
|
with these flags enabled.
|
||||||
|
|
||||||
|
Detailed system requirements can be found at `DPDK requirements`_, while more
|
||||||
|
detailed install information can be found in the `advanced installation guide
|
||||||
|
<../../INSTALL.DPDK-advanced.md>`__.
|
||||||
|
|
||||||
|
.. _DPDK supported NIC: http://dpdk.org/doc/nics
|
||||||
|
.. _DPDK requirements: http://dpdk.org/doc/guides/linux_gsg/sys_reqs.html
|
||||||
|
|
||||||
|
Installing
|
||||||
|
----------
|
||||||
|
|
||||||
|
DPDK
|
||||||
|
~~~~
|
||||||
|
|
||||||
|
1. Download the `DPDK sources`_, extract the file and set ``DPDK_DIR``:::
|
||||||
|
|
||||||
|
$ cd /usr/src/
|
||||||
|
$ wget http://dpdk.org/browse/dpdk/snapshot/dpdk-16.07.zip
|
||||||
|
$ unzip dpdk-16.07.zip
|
||||||
|
$ export DPDK_DIR=/usr/src/dpdk-16.07
|
||||||
|
$ cd $DPDK_DIR
|
||||||
|
|
||||||
|
2. Configure and install DPDK
|
||||||
|
|
||||||
|
Build and install the DPDK library:::
|
||||||
|
|
||||||
|
$ export DPDK_TARGET=x86_64-native-linuxapp-gcc
|
||||||
|
$ export DPDK_BUILD=$DPDK_DIR/$DPDK_TARGET
|
||||||
|
$ make install T=$DPDK_TARGET DESTDIR=install
|
||||||
|
|
||||||
|
If IVSHMEM support is required, use a different target:::
|
||||||
|
|
||||||
|
$ export DPDK_TARGET=x86_64-ivshmem-linuxapp-gcc
|
||||||
|
|
||||||
|
.. _DPDK sources: http://dpdk.org/browse/dpdk/refs/
|
||||||
|
|
||||||
|
Install OVS
|
||||||
|
~~~~~~~~~~~
|
||||||
|
|
||||||
|
OVS can be installed using different methods. For OVS to use DPDK datapath, it
|
||||||
|
has to be configured with DPDK support (``--with-dpdk``).
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
This section focuses on generic recipe that suits most cases. For
|
||||||
|
distribution specific instructions, refer to one of the more relevant guides.
|
||||||
|
|
||||||
|
.. _OVS sources: http://openvswitch.org/releases/
|
||||||
|
|
||||||
|
1. Ensure the standard OVS requirements, described in the `installation guide
|
||||||
|
<INSTALL.rst>`__, are installed.
|
||||||
|
|
||||||
|
2. Bootstrap, if required, as described in the `installation guide
|
||||||
|
<INSTALL.rst>`__.
|
||||||
|
|
||||||
|
3. Configure the package using the ``--with-dpdk`` flag:::
|
||||||
|
|
||||||
|
$ ./configure --with-dpdk=$DPDK_BUILD
|
||||||
|
|
||||||
|
where ``DPDK_BUILD`` is the path to the built DPDK library. This can be
|
||||||
|
skipped if DPDK library is installed in its default location.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
While ``--with-dpdk`` is required, you can pass any other configuration
|
||||||
|
option described in the `installation guide <INSTALL.rst>`__.
|
||||||
|
|
||||||
|
4. Build and install OVS, as described in the `installation guide
|
||||||
|
<INSTALL.rst>`__.
|
||||||
|
|
||||||
|
Additional information can be found in the `installation guide
|
||||||
|
<INSTALL.rst>`__.
|
||||||
|
|
||||||
|
Setup
|
||||||
|
-----
|
||||||
|
|
||||||
|
Setup Hugepages
|
||||||
|
~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Allocate a number of 2M Huge pages:
|
||||||
|
|
||||||
|
- For persistent allocation of huge pages, write to hugepages.conf file
|
||||||
|
in `/etc/sysctl.d`:::
|
||||||
|
|
||||||
|
$ echo 'vm.nr_hugepages=2048' > /etc/sysctl.d/hugepages.conf
|
||||||
|
|
||||||
|
- For run-time allocation of huge pages, use the ``sysctl`` utility:::
|
||||||
|
|
||||||
|
$ sysctl -w vm.nr_hugepages=N # where N = No. of 2M huge pages
|
||||||
|
|
||||||
|
To verify hugepage configuration:::
|
||||||
|
|
||||||
|
$ grep HugePages_ /proc/meminfo
|
||||||
|
|
||||||
|
Mount the hugepages, if not already mounted by default:::
|
||||||
|
|
||||||
|
$ mount -t hugetlbfs none /dev/hugepages``
|
||||||
|
|
||||||
|
.. _dpdk-vfio:
|
||||||
|
|
||||||
|
Setup DPDK devices using VFIO
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
VFIO is prefered to the UIO driver when using recent versions of DPDK. VFIO
|
||||||
|
support required support from both the kernel and BIOS. For the former, kernel
|
||||||
|
version > 3.6 must be used. For the latter, you must enable VT-d in the BIOS
|
||||||
|
and ensure this is configured via grub. To ensure VT-d is enabled via the BIOS,
|
||||||
|
run:::
|
||||||
|
|
||||||
|
$ dmesg | grep -e DMAR -e IOMMU
|
||||||
|
|
||||||
|
If VT-d is not enabled in the BIOS, enable it now.
|
||||||
|
|
||||||
|
To ensure VT-d is enabled in the kernel, run:::
|
||||||
|
|
||||||
|
$ cat /proc/cmdline | grep iommu=pt
|
||||||
|
$ cat /proc/cmdline | grep intel_iommu=on
|
||||||
|
|
||||||
|
If VT-d is not enabled in the kernel, enable it now.
|
||||||
|
|
||||||
|
Once VT-d is correctly configured, load the required modules and bind the NIC
|
||||||
|
to the VFIO driver:::
|
||||||
|
|
||||||
|
$ modprobe vfio-pci
|
||||||
|
$ /usr/bin/chmod a+x /dev/vfio
|
||||||
|
$ /usr/bin/chmod 0666 /dev/vfio/*
|
||||||
|
$ $DPDK_DIR/tools/dpdk-devbind.py --bind=vfio-pci eth1
|
||||||
|
$ $DPDK_DIR/tools/dpdk-devbind.py --status
|
||||||
|
|
||||||
|
Setup OVS
|
||||||
|
~~~~~~~~~
|
||||||
|
|
||||||
|
Open vSwitch should be started as described in the `installation guide
|
||||||
|
<INSTALL.rst>`__ with the exception of ovs-vswitchd, which requires some
|
||||||
|
special configuration to enable DPDK functionality. DPDK configuration
|
||||||
|
arguments can be passed to ovs-vswitchd via the ``other_config`` column of the
|
||||||
|
``Open_vSwitch`` table. At a minimum, the ``dpdk-init`` option must be set to
|
||||||
|
``true``. For example:::
|
||||||
|
|
||||||
|
$ export DB_SOCK=/usr/local/var/run/openvswitch/db.sock
|
||||||
|
$ ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
|
||||||
|
$ ovs-vswitchd unix:$DB_SOCK --pidfile --detach
|
||||||
|
|
||||||
|
There are many other configuration options, the most important of which are
|
||||||
|
listed below. Defaults will be provided for all values not explicitly set.
|
||||||
|
|
||||||
|
``dpdk-init``
|
||||||
|
Specifies whether OVS should initialize and support DPDK ports. This is a
|
||||||
|
boolean, and defaults to false.
|
||||||
|
|
||||||
|
``dpdk-lcore-mask``
|
||||||
|
Specifies the CPU cores on which dpdk lcore threads should be spawned and
|
||||||
|
expects hex string (eg '0x123').
|
||||||
|
|
||||||
|
``dpdk-socket-mem``
|
||||||
|
Comma separated list of memory to pre-allocate from hugepages on specific
|
||||||
|
sockets.
|
||||||
|
|
||||||
|
``dpdk-hugepage-dir``
|
||||||
|
Directory where hugetlbfs is mounted
|
||||||
|
|
||||||
|
``vhost-sock-dir``
|
||||||
|
Option to set the path to the vhost-user unix socket files.
|
||||||
|
|
||||||
|
If allocating more than one GB hugepage (as for IVSHMEM), you can configure the
|
||||||
|
amount of memory used from any given NUMA nodes. For example, to use 1GB from
|
||||||
|
NUMA node 0, run:::
|
||||||
|
|
||||||
|
$ ovs-vsctl --no-wait set Open_vSwitch . \
|
||||||
|
other_config:dpdk-socket-mem="1024,0"
|
||||||
|
|
||||||
|
Similarly, if you wish to better scale the workloads across cores, then
|
||||||
|
multiple pmd threads can be created and pinned to CPU cores by explicity
|
||||||
|
specifying ``pmd-cpu-mask``. For example, to spawn two pmd threads and pin
|
||||||
|
them to cores 1,2, run:::
|
||||||
|
|
||||||
|
$ ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=6
|
||||||
|
|
||||||
|
For details on using ivshmem with DPDK, refer to `the advanced installation
|
||||||
|
guide <../../INSTALL.DPDK-ADVANCED.md>`__.
|
||||||
|
|
||||||
|
Refer to ovs-vswitchd.conf.db(5) for additional information on configuration
|
||||||
|
options.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
Changing any of these options requires restarting the ovs-vswitchd
|
||||||
|
application
|
||||||
|
|
||||||
|
Validating
|
||||||
|
----------
|
||||||
|
|
||||||
|
Creating bridges and ports
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
You can now use ovs-vsctl to set up bridges and other Open vSwitch features.
|
||||||
|
Bridges should be created with a ``datapath_type=netdev``:::
|
||||||
|
|
||||||
|
$ ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
|
||||||
|
|
||||||
|
Now you can add DPDK devices. OVS expects DPDK device names to start with
|
||||||
|
``dpdk`` and end with a portid. ovs-vswitchd should print the number of dpdk
|
||||||
|
devices found in the log file:::
|
||||||
|
|
||||||
|
$ ovs-vsctl add-port br0 dpdk0 -- set Interface dpdk0 type=dpdk
|
||||||
|
$ ovs-vsctl add-port br0 dpdk1 -- set Interface dpdk1 type=dpdk
|
||||||
|
|
||||||
|
After the DPDK ports get added to switch, a polling thread continuously polls
|
||||||
|
DPDK devices and consumes 100% of the core, as can be checked from 'top' and
|
||||||
|
'ps' cmds:::
|
||||||
|
|
||||||
|
$ top -H
|
||||||
|
$ ps -eLo pid,psr,comm | grep pmd
|
||||||
|
|
||||||
|
Creating bonds of DPDK interfaces is slightly different to creating bonds of
|
||||||
|
system interfaces. For DPDK, the interface type must be explicitly set. For
|
||||||
|
example:::
|
||||||
|
|
||||||
|
$ ovs-vsctl add-bond br0 dpdkbond dpdk0 dpdk1 \
|
||||||
|
-- set Interface dpdk0 type=dpdk \
|
||||||
|
-- set Interface dpdk1 type=dpdk
|
||||||
|
|
||||||
|
To stop ovs-vswitchd & delete bridge, run:::
|
||||||
|
|
||||||
|
$ ovs-appctl -t ovs-vswitchd exit
|
||||||
|
$ ovs-appctl -t ovsdb-server exit
|
||||||
|
$ ovs-vsctl del-br br0
|
||||||
|
|
||||||
|
PMD thread statistics
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
To show current stats:::
|
||||||
|
|
||||||
|
$ ovs-appctl dpif-netdev/pmd-stats-show
|
||||||
|
|
||||||
|
To clear previous stats:::
|
||||||
|
|
||||||
|
$ ovs-appctl dpif-netdev/pmd-stats-clear
|
||||||
|
|
||||||
|
Port/rxq assigment to PMD threads
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
To show port/rxq assignment:::
|
||||||
|
|
||||||
|
$ ovs-appctl dpif-netdev/pmd-rxq-show
|
||||||
|
|
||||||
|
To change default rxq assignment to pmd threads, rxqs may be manually pinned to
|
||||||
|
desired cores using:::
|
||||||
|
|
||||||
|
$ ovs-vsctl set Interface <iface> \
|
||||||
|
other_config:pmd-rxq-affinity=<rxq-affinity-list>
|
||||||
|
|
||||||
|
where:
|
||||||
|
|
||||||
|
- ``<rxq-affinity-list>`` ::= ``NULL`` | ``<non-empty-list>``
|
||||||
|
- ``<non-empty-list>`` ::= ``<affinity-pair>`` |
|
||||||
|
``<affinity-pair>`` , ``<non-empty-list>``
|
||||||
|
- ``<affinity-pair>`` ::= ``<queue-id>`` : ``<core-id>``
|
||||||
|
|
||||||
|
For example:::
|
||||||
|
|
||||||
|
$ ovs-vsctl set interface dpdk0 options:n_rxq=4 \
|
||||||
|
other_config:pmd-rxq-affinity="0:3,1:7,3:8"
|
||||||
|
|
||||||
|
This will ensure:
|
||||||
|
|
||||||
|
- Queue #0 pinned to core 3
|
||||||
|
- Queue #1 pinned to core 7
|
||||||
|
- Queue #2 not pinned
|
||||||
|
- Queue #3 pinned to core 8
|
||||||
|
|
||||||
|
After that PMD threads on cores where RX queues was pinned will become
|
||||||
|
``isolated``. This means that this thread will poll only pinned RX queues.
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
If there are no ``non-isolated`` PMD threads, ``non-pinned`` RX queues will
|
||||||
|
not be polled. Also, if provided ``core_id`` is not available (ex. this
|
||||||
|
``core_id`` not in ``pmd-cpu-mask``), RX queue will not be polled by any PMD
|
||||||
|
thread.
|
||||||
|
|
||||||
|
.. _dpdk-guest-setup:
|
||||||
|
|
||||||
|
DPDK in the VM
|
||||||
|
--------------
|
||||||
|
|
||||||
|
DPDK 'testpmd' application can be run in the Guest VM for high speed packet
|
||||||
|
forwarding between vhostuser ports. DPDK and testpmd application has to be
|
||||||
|
compiled on the guest VM. Below are the steps for setting up the testpmd
|
||||||
|
application in the VM. More information on the vhostuser ports can be found in
|
||||||
|
the `advanced install guide <../../INSTALL.DPDK-ADVANCED.md>`__.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
Support for DPDK in the guest requires QEMU >= 2.2.0.
|
||||||
|
|
||||||
|
To being, instantiate the guest:::
|
||||||
|
|
||||||
|
$ export VM_NAME=Centos-vm export GUEST_MEM=3072M
|
||||||
|
$ export QCOW2_IMAGE=/root/CentOS7_x86_64.qcow2
|
||||||
|
$ export VHOST_SOCK_DIR=/usr/local/var/run/openvswitch
|
||||||
|
|
||||||
|
$ qemu-system-x86_64 -name $VM_NAME -cpu host -enable-kvm \
|
||||||
|
-m $GUEST_MEM -drive file=$QCOW2_IMAGE --nographic -snapshot \
|
||||||
|
-numa node,memdev=mem -mem-prealloc -smp sockets=1,cores=2 \
|
||||||
|
-object memory-backend-file,id=mem,size=$GUEST_MEM,mem-path=/dev/hugepages,share=on \
|
||||||
|
-chardev socket,id=char0,path=$VHOST_SOCK_DIR/dpdkvhostuser0 \
|
||||||
|
-netdev type=vhost-user,id=mynet1,chardev=char0,vhostforce \
|
||||||
|
-device virtio-net-pci,mac=00:00:00:00:00:01,netdev=mynet1,mrg_rxbuf=off \
|
||||||
|
-chardev socket,id=char1,path=$VHOST_SOCK_DIR/dpdkvhostuser1 \
|
||||||
|
-netdev type=vhost-user,id=mynet2,chardev=char1,vhostforce \
|
||||||
|
-device virtio-net-pci,mac=00:00:00:00:00:02,netdev=mynet2,mrg_rxbuf=off \
|
||||||
|
|
||||||
|
Download the DPDK sourcs to VM and build DPDK:::
|
||||||
|
|
||||||
|
$ cd /root/dpdk/
|
||||||
|
$ wget http://dpdk.org/browse/dpdk/snapshot/dpdk-16.07.zip
|
||||||
|
$ unzip dpdk-16.07.zip
|
||||||
|
$ export DPDK_DIR=/root/dpdk/dpdk-16.07
|
||||||
|
$ export DPDK_TARGET=x86_64-native-linuxapp-gcc
|
||||||
|
$ export DPDK_BUILD=$DPDK_DIR/$DPDK_TARGET
|
||||||
|
$ cd $DPDK_DIR
|
||||||
|
$ make install T=$DPDK_TARGET DESTDIR=install
|
||||||
|
|
||||||
|
Build the test-pmd application:::
|
||||||
|
|
||||||
|
$ cd app/test-pmd
|
||||||
|
$ export RTE_SDK=$DPDK_DIR
|
||||||
|
$ export RTE_TARGET=$DPDK_TARGET
|
||||||
|
$ make
|
||||||
|
|
||||||
|
Setup huge pages and DPDK devices using UIO:::
|
||||||
|
|
||||||
|
$ sysctl vm.nr_hugepages=1024
|
||||||
|
$ mkdir -p /dev/hugepages
|
||||||
|
$ mount -t hugetlbfs hugetlbfs /dev/hugepages # only if not already mounted
|
||||||
|
$ modprobe uio
|
||||||
|
$ insmod $DPDK_BUILD/kmod/igb_uio.ko
|
||||||
|
$ $DPDK_DIR/tools/dpdk-devbind.py --status
|
||||||
|
$ $DPDK_DIR/tools/dpdk-devbind.py -b igb_uio 00:03.0 00:04.0
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
vhost ports pci ids can be retrieved using::
|
||||||
|
|
||||||
|
lspci | grep Ethernet
|
||||||
|
|
||||||
|
Testing
|
||||||
|
-------
|
||||||
|
|
||||||
|
Below are few testcases and the list of steps to be followed. Before beginning,
|
||||||
|
ensure a userspace bridge has been created and two DPDK ports added:::
|
||||||
|
|
||||||
|
$ ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
|
||||||
|
$ ovs-vsctl add-port br0 dpdk0 -- set Interface dpdk0 type=dpdk
|
||||||
|
$ ovs-vsctl add-port br0 dpdk1 -- set Interface dpdk1 type=dpdk
|
||||||
|
|
||||||
|
PHY-PHY
|
||||||
|
~~~~~~~
|
||||||
|
|
||||||
|
Add test flows to forward packets betwen DPDK port 0 and port 1:::
|
||||||
|
|
||||||
|
# Clear current flows
|
||||||
|
$ ovs-ofctl del-flows br0
|
||||||
|
|
||||||
|
# Add flows between port 1 (dpdk0) to port 2 (dpdk1)
|
||||||
|
$ ovs-ofctl add-flow br0 in_port=1,action=output:2
|
||||||
|
$ ovs-ofctl add-flow br0 in_port=2,action=output:1
|
||||||
|
|
||||||
|
Transmit traffic into either port. You should see it returned via the other.
|
||||||
|
|
||||||
|
PHY-VM-PHY (vhost loopback)
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Add two ``dpdkvhostuser`` ports to bridge ``br0``:::
|
||||||
|
|
||||||
|
$ ovs-vsctl add-port br0 dpdkvhostuser0 \
|
||||||
|
-- set Interface dpdkvhostuser0 type=dpdkvhostuser
|
||||||
|
$ ovs-vsctl add-port br0 dpdkvhostuser1 \
|
||||||
|
-- set Interface dpdkvhostuser1 type=dpdkvhostuser
|
||||||
|
|
||||||
|
Add test flows to forward packets betwen DPDK devices and VM ports:::
|
||||||
|
|
||||||
|
# Clear current flows
|
||||||
|
$ ovs-ofctl del-flows br0
|
||||||
|
|
||||||
|
# Add flows
|
||||||
|
$ ovs-ofctl add-flow br0 in_port=1,action=output:3
|
||||||
|
$ ovs-ofctl add-flow br0 in_port=3,action=output:1
|
||||||
|
$ ovs-ofctl add-flow br0 in_port=4,action=output:2
|
||||||
|
$ ovs-ofctl add-flow br0 in_port=2,action=output:4
|
||||||
|
|
||||||
|
# Dump flows
|
||||||
|
$ ovs-ofctl dump-flows br0
|
||||||
|
|
||||||
|
Create a VM using the following configuration:
|
||||||
|
|
||||||
|
+----------------------+--------+-----------------+
|
||||||
|
| configuration | values | comments |
|
||||||
|
+----------------------+--------+-----------------+
|
||||||
|
| qemu version | 2.2.0 | n/a |
|
||||||
|
| qemu thread affinity | core 5 | taskset 0x20 |
|
||||||
|
| memory | 4GB | n/a |
|
||||||
|
| cores | 2 | n/a |
|
||||||
|
| Qcow2 image | CentOS7| n/a |
|
||||||
|
| mrg_rxbuf | off | n/a |
|
||||||
|
+----------------------+--------+-----------------+
|
||||||
|
|
||||||
|
You can do this directly with QEMU via the ``qemu-system-x86_64``
|
||||||
|
application:::
|
||||||
|
|
||||||
|
$ export VM_NAME=vhost-vm
|
||||||
|
$ export GUEST_MEM=3072M
|
||||||
|
$ export QCOW2_IMAGE=/root/CentOS7_x86_64.qcow2
|
||||||
|
$ export VHOST_SOCK_DIR=/usr/local/var/run/openvswitch
|
||||||
|
|
||||||
|
$ taskset 0x20 qemu-system-x86_64 -name $VM_NAME -cpu host -enable-kvm \
|
||||||
|
-m $GUEST_MEM -drive file=$QCOW2_IMAGE --nographic -snapshot \
|
||||||
|
-numa node,memdev=mem -mem-prealloc -smp sockets=1,cores=2 \
|
||||||
|
-object memory-backend-file,id=mem,size=$GUEST_MEM,mem-path=/dev/hugepages,share=on \
|
||||||
|
-chardev socket,id=char0,path=$VHOST_SOCK_DIR/dpdkvhostuser0 \
|
||||||
|
-netdev type=vhost-user,id=mynet1,chardev=char0,vhostforce \
|
||||||
|
-device virtio-net-pci,mac=00:00:00:00:00:01,netdev=mynet1,mrg_rxbuf=off \
|
||||||
|
-chardev socket,id=char1,path=$VHOST_SOCK_DIR/dpdkvhostuser1 \
|
||||||
|
-netdev type=vhost-user,id=mynet2,chardev=char1,vhostforce \
|
||||||
|
-device virtio-net-pci,mac=00:00:00:00:00:02,netdev=mynet2,mrg_rxbuf=off
|
||||||
|
|
||||||
|
Alternatively, you can configure the guest using libvirt. Below is an XML
|
||||||
|
configuration for a 'demovm' guest that can be instantiated using `virsh`:::
|
||||||
|
|
||||||
|
<domain type='kvm'>
|
||||||
|
<name>demovm</name>
|
||||||
|
<uuid>4a9b3f53-fa2a-47f3-a757-dd87720d9d1d</uuid>
|
||||||
|
<memory unit='KiB'>4194304</memory>
|
||||||
|
<currentMemory unit='KiB'>4194304</currentMemory>
|
||||||
|
<memoryBacking>
|
||||||
|
<hugepages>
|
||||||
|
<page size='2' unit='M' nodeset='0'/>
|
||||||
|
</hugepages>
|
||||||
|
</memoryBacking>
|
||||||
|
<vcpu placement='static'>2</vcpu>
|
||||||
|
<cputune>
|
||||||
|
<shares>4096</shares>
|
||||||
|
<vcpupin vcpu='0' cpuset='4'/>
|
||||||
|
<vcpupin vcpu='1' cpuset='5'/>
|
||||||
|
<emulatorpin cpuset='4,5'/>
|
||||||
|
</cputune>
|
||||||
|
<os>
|
||||||
|
<type arch='x86_64' machine='pc'>hvm</type>
|
||||||
|
<boot dev='hd'/>
|
||||||
|
</os>
|
||||||
|
<features>
|
||||||
|
<acpi/>
|
||||||
|
<apic/>
|
||||||
|
</features>
|
||||||
|
<cpu mode='host-model'>
|
||||||
|
<model fallback='allow'/>
|
||||||
|
<topology sockets='2' cores='1' threads='1'/>
|
||||||
|
<numa>
|
||||||
|
<cell id='0' cpus='0-1' memory='4194304' unit='KiB' memAccess='shared'/>
|
||||||
|
</numa>
|
||||||
|
</cpu>
|
||||||
|
<on_poweroff>destroy</on_poweroff>
|
||||||
|
<on_reboot>restart</on_reboot>
|
||||||
|
<on_crash>destroy</on_crash>
|
||||||
|
<devices>
|
||||||
|
<emulator>/usr/bin/qemu-kvm</emulator>
|
||||||
|
<disk type='file' device='disk'>
|
||||||
|
<driver name='qemu' type='qcow2' cache='none'/>
|
||||||
|
<source file='/root/CentOS7_x86_64.qcow2'/>
|
||||||
|
<target dev='vda' bus='virtio'/>
|
||||||
|
</disk>
|
||||||
|
<disk type='dir' device='disk'>
|
||||||
|
<driver name='qemu' type='fat'/>
|
||||||
|
<source dir='/usr/src/dpdk-16.07'/>
|
||||||
|
<target dev='vdb' bus='virtio'/>
|
||||||
|
<readonly/>
|
||||||
|
</disk>
|
||||||
|
<interface type='vhostuser'>
|
||||||
|
<mac address='00:00:00:00:00:01'/>
|
||||||
|
<source type='unix' path='/usr/local/var/run/openvswitch/dpdkvhostuser0' mode='client'/>
|
||||||
|
<model type='virtio'/>
|
||||||
|
<driver queues='2'>
|
||||||
|
<host mrg_rxbuf='off'/>
|
||||||
|
</driver>
|
||||||
|
</interface>
|
||||||
|
<interface type='vhostuser'>
|
||||||
|
<mac address='00:00:00:00:00:02'/>
|
||||||
|
<source type='unix' path='/usr/local/var/run/openvswitch/dpdkvhostuser1' mode='client'/>
|
||||||
|
<model type='virtio'/>
|
||||||
|
<driver queues='2'>
|
||||||
|
<host mrg_rxbuf='off'/>
|
||||||
|
</driver>
|
||||||
|
</interface>
|
||||||
|
<serial type='pty'>
|
||||||
|
<target port='0'/>
|
||||||
|
</serial>
|
||||||
|
<console type='pty'>
|
||||||
|
<target type='serial' port='0'/>
|
||||||
|
</console>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
||||||
|
|
||||||
|
Once the guest is configured and booted, configure DPDK packet forwarding
|
||||||
|
within the guest. To accomplish this, DPDK and testpmd application have to
|
||||||
|
be first compiled on the VM as described in **Guest Setup**. Once compiled, run
|
||||||
|
the ``test-pmd`` application:::
|
||||||
|
|
||||||
|
$ cd $DPDK_DIR/app/test-pmd;
|
||||||
|
$ ./testpmd -c 0x3 -n 4 --socket-mem 1024 -- \
|
||||||
|
--burst=64 -i --txqflags=0xf00 --disable-hw-vlan
|
||||||
|
$ set fwd mac retry
|
||||||
|
$ start
|
||||||
|
|
||||||
|
When you finish testing, bind the vNICs back to kernel:::
|
||||||
|
|
||||||
|
$ $DPDK_DIR/tools/dpdk-devbind.py --bind=virtio-pci 0000:00:03.0
|
||||||
|
$ $DPDK_DIR/tools/dpdk-devbind.py --bind=virtio-pci 0000:00:04.0
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
Appropriate PCI IDs to be passed in above example. The PCI IDs can be
|
||||||
|
retrieved like so:::
|
||||||
|
|
||||||
|
$ $DPDK_DIR/tools/dpdk-devbind.py --status
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
More information on the dpdkvhostuser ports can be found in the `advanced
|
||||||
|
installation guide <../../INSTALL.DPDK-ADVANCED.md>`__.
|
||||||
|
|
||||||
|
PHY-VM-PHY (IVSHMEM loopback)
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Refer to the `advanced installation guide <../../INSTALL.DPDK-ADVANCED.md>`__.
|
||||||
|
|
||||||
|
Limitations
|
||||||
|
------------
|
||||||
|
|
||||||
|
- Currently DPDK ports does not use HW offload functionality.
|
||||||
|
- Network Interface Firmware requirements: Each release of DPDK is
|
||||||
|
validated against a specific firmware version for a supported Network
|
||||||
|
Interface. New firmware versions introduce bug fixes, performance
|
||||||
|
improvements and new functionality that DPDK leverages. The validated
|
||||||
|
firmware versions are available as part of the release notes for
|
||||||
|
DPDK. It is recommended that users update Network Interface firmware
|
||||||
|
to match what has been validated for the DPDK release.
|
||||||
|
|
||||||
|
The latest list of validated firmware versions can be found in the `DPDK
|
||||||
|
release notes`_.
|
||||||
|
|
||||||
|
.. _DPDK release notes: http://dpdk.org/doc/guides/rel_notes/release_16.07.html
|
||||||
|
|
||||||
|
Bug Reporting
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Please report problems to bugs@openvswitch.org.
|
@@ -35,7 +35,7 @@ platform, refer to one of these installation guides:
|
|||||||
- `XenServer <INSTALL.XenServer.md>`__
|
- `XenServer <INSTALL.XenServer.md>`__
|
||||||
- `NetBSD <INSTALL.NetBSD.md>`__
|
- `NetBSD <INSTALL.NetBSD.md>`__
|
||||||
- `Windows <INSTALL.Windows.md>`__
|
- `Windows <INSTALL.Windows.md>`__
|
||||||
- `DPDK <INSTALL.DPDK.md>`__
|
- `DPDK <INSTALL.DPDK.rst>`__
|
||||||
|
|
||||||
.. _general-build-reqs:
|
.. _general-build-reqs:
|
||||||
|
|
||||||
|
@@ -74,7 +74,7 @@ docs = \
|
|||||||
INSTALL.Debian.md \
|
INSTALL.Debian.md \
|
||||||
INSTALL.Docker.md \
|
INSTALL.Docker.md \
|
||||||
INSTALL.DPDK-ADVANCED.md \
|
INSTALL.DPDK-ADVANCED.md \
|
||||||
INSTALL.DPDK.md \
|
INSTALL.DPDK.rst \
|
||||||
INSTALL.Fedora.md \
|
INSTALL.Fedora.md \
|
||||||
INSTALL.KVM.md \
|
INSTALL.KVM.md \
|
||||||
INSTALL.Libvirt.md \
|
INSTALL.Libvirt.md \
|
||||||
|
@@ -94,7 +94,7 @@ To use Open vSwitch...
|
|||||||
|
|
||||||
- ...without using a kernel module, read [INSTALL.userspace.md].
|
- ...without using a kernel module, read [INSTALL.userspace.md].
|
||||||
|
|
||||||
- ...with DPDK, read [INSTALL.DPDK.md].
|
- ...with DPDK, read [INSTALL.DPDK.rst].
|
||||||
|
|
||||||
- ...with SELinux, read [INSTALL.SELinux.md].
|
- ...with SELinux, read [INSTALL.SELinux.md].
|
||||||
|
|
||||||
@@ -118,7 +118,7 @@ bugs@openvswitch.org
|
|||||||
[INSTALL.rst]:INSTALL.rst
|
[INSTALL.rst]:INSTALL.rst
|
||||||
[INSTALL.Debian.md]:INSTALL.Debian.md
|
[INSTALL.Debian.md]:INSTALL.Debian.md
|
||||||
[INSTALL.Docker.md]:INSTALL.Docker.md
|
[INSTALL.Docker.md]:INSTALL.Docker.md
|
||||||
[INSTALL.DPDK.md]:INSTALL.DPDK.md
|
[INSTALL.DPDK.rst]:INSTALL.DPDK.rst
|
||||||
[INSTALL.Fedora.md]:INSTALL.Fedora.md
|
[INSTALL.Fedora.md]:INSTALL.Fedora.md
|
||||||
[INSTALL.KVM.md]:INSTALL.KVM.md
|
[INSTALL.KVM.md]:INSTALL.KVM.md
|
||||||
[INSTALL.Libvirt.md]:INSTALL.Libvirt.md
|
[INSTALL.Libvirt.md]:INSTALL.Libvirt.md
|
||||||
|
2
debian/openvswitch-common.docs
vendored
2
debian/openvswitch-common.docs
vendored
@@ -1,3 +1,3 @@
|
|||||||
FAQ.md
|
FAQ.md
|
||||||
INSTALL.DPDK.md
|
INSTALL.DPDK.rst
|
||||||
README-native-tunneling.md
|
README-native-tunneling.md
|
||||||
|
@@ -479,7 +479,7 @@ fi
|
|||||||
%{_mandir}/man8/ovs-parse-backtrace.8*
|
%{_mandir}/man8/ovs-parse-backtrace.8*
|
||||||
%{_mandir}/man8/ovs-testcontroller.8*
|
%{_mandir}/man8/ovs-testcontroller.8*
|
||||||
%doc COPYING DESIGN.md INSTALL.SSL.md NOTICE README.md WHY-OVS.md
|
%doc COPYING DESIGN.md INSTALL.SSL.md NOTICE README.md WHY-OVS.md
|
||||||
%doc FAQ.md NEWS INSTALL.DPDK.md rhel/README.RHEL
|
%doc FAQ.md NEWS INSTALL.DPDK.rst rhel/README.RHEL
|
||||||
/var/lib/openvswitch
|
/var/lib/openvswitch
|
||||||
/var/log/openvswitch
|
/var/log/openvswitch
|
||||||
%ghost %attr(755,root,root) %{_rundir}/openvswitch
|
%ghost %attr(755,root,root) %{_rundir}/openvswitch
|
||||||
|
@@ -248,7 +248,7 @@ exit 0
|
|||||||
/usr/share/openvswitch/vswitch.ovsschema
|
/usr/share/openvswitch/vswitch.ovsschema
|
||||||
/usr/share/openvswitch/vtep.ovsschema
|
/usr/share/openvswitch/vtep.ovsschema
|
||||||
%doc COPYING DESIGN.md INSTALL.SSL.md NOTICE README.md WHY-OVS.md FAQ.md NEWS
|
%doc COPYING DESIGN.md INSTALL.SSL.md NOTICE README.md WHY-OVS.md FAQ.md NEWS
|
||||||
%doc INSTALL.DPDK.md rhel/README.RHEL README-native-tunneling.md
|
%doc INSTALL.DPDK.rst rhel/README.RHEL README-native-tunneling.md
|
||||||
/var/lib/openvswitch
|
/var/lib/openvswitch
|
||||||
/var/log/openvswitch
|
/var/log/openvswitch
|
||||||
|
|
||||||
|
@@ -85,7 +85,7 @@ unavailable or unsuccessful.
|
|||||||
.
|
.
|
||||||
.SS "DPDK Options"
|
.SS "DPDK Options"
|
||||||
For details on initializing the \fBovs\-vswitchd\fR DPDK datapath,
|
For details on initializing the \fBovs\-vswitchd\fR DPDK datapath,
|
||||||
refer to INSTALL.DPDK.md or \fBovs\-vswitchd.conf.db\fR(5) for
|
refer to INSTALL.DPDK.rst or \fBovs\-vswitchd.conf.db\fR(5) for
|
||||||
details.
|
details.
|
||||||
.SS "Daemon Options"
|
.SS "Daemon Options"
|
||||||
.ds DD \
|
.ds DD \
|
||||||
|
Reference in New Issue
Block a user