Add dpdk 2.2.0 debian spec

1. downlod dpdk 2.2.0 debian spec
wget -c https://launchpad.net/ubuntu/+archive/primary/+files/dpdk_2.2.0-0ubuntu8.dsc
wget -c https://launchpad.net/ubuntu/+archive/primary/+files/dpdk_2.2.0.orig.tar.gz
wget -c https://launchpad.net/ubuntu/+archive/primary/+files/dpdk_2.2.0-0ubuntu8.debian.tar.xz
dpkg-source -x dpdk_2.2.0-0ubuntu8.dsc

Change-Id: Icb9aaf51982fa944e2b8a477c2816bf501ba2e03
Signed-off-by: Guo Ruijing <ruijing.guo@intel.com>
This commit is contained in:
Guo Ruijing 2016-08-05 11:00:18 +08:00
parent 2f68823227
commit bc4e8ca6a4
72 changed files with 6336 additions and 0 deletions

View File

@ -0,0 +1,236 @@
dpdk (2.2.0-0ubuntu8) xenial; urgency=medium
* d/p/ubuntu-backport-[36-37] fix virtio issues (LP: #1570195):
- don't let DPDK initialize virtio devices still in use by the kernel
- this avoids conflicts between kernel and dpdk usage of those devices
- an admin now has to unbind/bind devices as on physical hardware
- this is in the dpdk 16.04 release and delta can then be dropped
- d/dpdk-doc.README.Debian update for changes in virtio-pci handling
- d/dpdk.interfaces update for changes in virtio-pci handling
* d/p/ubuntu-backport-38... fix for memory leak (LP: #1570466):
- call vhost_destroy_device on removing vhost user ports to fix memory leak
- this likely is in the dpdk 16.07 release and delta can then be dropped
* d/p/ubuntu-fix-vhost-user-socket-permission.patch fox (LP: #1546565):
- when vhost_user sockets are created they are owner:group of the process
- the DPDK api to create those has no way to specify owner:group
- to fix that without breaking the API and potential workaround code in
consumers of the library like openvswitch 2.6 for example. This patch
adds an EAL commandline option to specify user:group created vhost_user
sockets should have.
-- Christian Ehrhardt <christian.ehrhardt@canonical.com> Mon, 25 Apr 2016 11:42:40 +0200
dpdk (2.2.0-0ubuntu7) xenial; urgency=medium
* Increase max_map_count after setting huge pages (LP: #1507921):
- The default config of 65530 would cause issues as soon as about 64GB or
more are used as 2M huge pages for dpdk.
- Increase this value to base+2*#hugepages to avoid issues on huge systems.
* d/p/ubuntu-backport-[28-32,34-35] backports for stability (LP: #1568838):
- these will be in the 16.04 dpdk release, delta can then be dropped.
- 5 fixes that do not change api/behaviour but fix serious issues.
- 01 f82f705b lpm: fix allocation of an existing object
- 02 f9bd3342 hash: fix multi-process support
- 03 1aadacb5 hash: fix allocation of an existing object
- 04 5d7bfb73 hash: fix race condition at creation
- 05 fe671356 vfio: fix resource leak
- 06 356445f9 port: fix ring writer buffer overflow
- 07 52f7a5ae port: fix burst size mask type
* d/p/ubuntu-backport-33-vhost-user-add-error-handling-for-fd-1023.patch
- this will likely be in dpdk release 16.07 and delta can then be dropped.
- fixes a crash on using fd's >1023 (LP: #1566874)
* d/p/ubuntu-fix-lpm-use-after-free-and-leak.patch fix lpm_free (LP: #1569375)
- the old patches had an error freeing a pointer which had no meta data
- that lead to a crash on any lpm_free call
- folded into the fix that generally covers the lpm allocation and free
weaknesses already (also there this particular mistake was added)
-- Christian Ehrhardt <christian.ehrhardt@canonical.com> Tue, 12 Apr 2016 16:13:47 +0200
dpdk (2.2.0-0ubuntu6) xenial; urgency=medium
* d/dpdk-init fix handling of multiple huge page sizes (LP: #1557532):
- dpdk-init now ensures non-default-hugepage-size mountpoints are
available as well.
- extra mountpoints are only created if requested in dpdk.conf and not yet
available (e.g. by the admin).
* d/dpdk-init fix issues with unassigned devices (LP: #1558485):
- dpdk-init no more checks /sys/.../driver of the device unconditionally
- removed the superfluous tr call in that path
* d/p/ubuntu-fix-lpm-use-after-free-and-leak.patch lpm/lpm6 (LP: #1554009):
- lpm/lpm6 fix use after free on lpm[6]_create
- lpm/lpm6 fix missing frees of rules_tbl substructure
- lpm/lpm6 fix missing free of lpm due to early exit
- make RTE_LOG messages of the failed allocation unique
* d/p/ubuntu-backport-[01-26] backport for stability (LP: #1559981):
- these will be in the following dpdk release and delta can then be dropped
- 26 fixes that do not change api/behaviour but fix serious issues
- 01 d3a274ce app/testpmd: handle SIGINT and SIGTERM
- 02 308df2bf Handle SIGINT and SIGTERM in l3fwd.
- 03 da82ee17 tools: fix unbinding failure handling
- 04 16c1814c tools: support Python 3 in bind script
- 05 bb9f4085 tools: support binding to built-in kernel modules
- 06 6e7caa1a eal/linux: support built-in kernel modules
- 07 86f36ff9 mempool: fix leak when creation fails
- 08 ca67ed28 vhost: fix leak of fds and mmaps
- 09 fa11a8a7 port: fix crash for ring writer nodrop
- 10 04f36690 port: fix crash for ethdev writer nodrop
- 11 c7a4ff80 i40e: fix overflow
- 12 097e920c i40e: fix inverted check for no refcount
- 13 330aa319 i40e: fix VLAN filtering
- 14 9f44dd3d i40e/base: fix missing check for stopped admin queue
- 15 8a880736 i40e/base: fix driver load failure
- 16 7656a546 fm10k: fix VLAN flag in scattered Rx
- 17 c6fb0e55 pcap: fix captured frame length
- 18 6e027237 bonding: fix detach of bonded device
- 19 df3e8ad7 bonding: fix detach of slave devices
- 20 786c990a bonding: copy entire config structure in mode 4
- 21 6698820b bonding: do not ignore multicast in mode 4
- 22 8997a10b bonding: fix active slaves with no primary
- 23 7a7122ed bonding: do not activate slave twice
- 24 2186fff3 bonding: fix crash when no slave device
- 25 c680a4a8 virtio: fix crash in statistics functions
- 26 3b1e3e4e virtio: fix descriptors pointing to the same buffer
* d/p/ubuntu-backport-27-virtio-fix-restart.patch for (LP: #1559981):
- fixing re-initializing the ethdev as openvswitch-dpdk does in the
virtio pmd driver by moving the detection of already being initialized
from virtio_dev_close to virtio_dev_start/stop
- this will be in the following dpdk release and delta can then be dropped
* d/rules build with debuginfo (LP: #1560839):
- exporting CFLAGS for all dpdk build processes
- dh_strip will automatically and create -dbgsym packages accordingly
-- Christian Ehrhardt <christian.ehrhardt@canonical.com> Wed, 23 Mar 2016 10:34:50 +0100
dpdk (2.2.0-0ubuntu5) xenial; urgency=medium
* d/t/test-initscripts fix issues regarding 1G hugepages
- the dep8 was already taking care of 1G hugepages being not supported in
some environments. But it was failing when supported, but not enough
memory available.
-- Christian Ehrhardt <christian.ehrhardt@canonical.com> Wed, 09 Mar 2016 17:19:24 +0000
dpdk (2.2.0-0ubuntu4) xenial; urgency=medium
* harden d/dpdk-init for configuration issues (LP: #1551601):
- detect and warn about bad bus specifications.
- detect and warn about incomplete device specifications.
- detect and warn about non existing pci IDs.
- avoid failing when working with unassigned devices.
- d/t/test-initscripts now testing various misconfigs.
- d/t/test-initscripts now also verifying service status.
* d/dpdk-init d/dpdk.conf now also support 1G hugepages (LP: #1551767):
- detect and warn if 1G pages are not available but configured.
- d/t/test-initscripts now also testing hugepage allocations.
- d/dpdk.conf has an option to drop caches to incease the likeliness of
successful 1G hugepage allocations (default off).
* d/rules replaced uname -m with DEB_HOST_GNU_CPU (LP: #1551796):
* fix testpmd to run without Xen environment (LP: #1551752):
- upstream discussion is slow, but we need a fix now. We can drop this
and change to the upstream solution when it is available.
* avoid errors due to missing modules (LP: #1554397):
- d/dpdk-init gracefully warns about missing modules.
- d/control now suggests linux-image-generic.
- d/dpdk.interfaces has a comment that makes the user aware.
* d/dpdk-init fix failure loading vfio-pci (LP: #1554214):
- d/dpdk-init no more converts "-" to "_" to make vfio-pci work
- d/dpdk.interfaces enhanced comments and updated examples
- d/dpdk-doc.README.debian got extra notes about using some modules
* unify whitespace/tabs in packaging and scripts
- tabs/spaces to just spaces in d/dpdk-init and d/dpdk.init.
- few remaining spaces to tabs in d/rules
* d/t/test-* now satisfy shellcheck
* d/* fix various comments and guides to be more readable
* d/dpdk-init and d/copyright updated copyright information
-- Christian Ehrhardt <christian.ehrhardt@canonical.com> Wed, 09 Mar 2016 08:48:58 +0000
dpdk (2.2.0-0ubuntu3) xenial; urgency=medium
* Guard dep8 tests against non supported platforms (LP: #1551158):
- d/t/control now avoids failing due to "dependencies are unsatisfiable"
when fetching packages. The packages architecture restrictions got added
to avoid that.
- d/t/check-dpdk-supported-arch.sh is called by all DPDK tests to ensure
the platform is supported. If not it skips the test.
-- Christian Ehrhardt <christian.ehrhardt@canonical.com> Mon, 29 Feb 2016 11:03:39 +0000
dpdk (2.2.0-0ubuntu2) xenial; urgency=medium
[ Christian Ehrhardt ]
* fix libdpdk.so library linking (LP: #1547517)
- libdpdk.so now has proper linkage information (was underlinked)
Note: this can be dropped when moving to DPDK 2.3 with linker script
instead of combined shared lib.
- remove reference to extra linkage needed when building against -ldpdk
in dpdk-doc README.
- add dep8 d/t/test-linkage to verify linking dpdk works as expected.
* d/control remove ${shlibs:Depends} on package with no linked binary
avoiding dpkg-gencontrol build warning about unknown ${shlibs:Depends}.
* d/dpdk-doc.README.debian fix path to DPDK build environment variable
helper script in README file.
* Update VCS Info in d/control to include our repositories.
[ James Page ]
* d/*: wrap-and-sort.
* d/control: Trim trailing whitespace.
-- Christian Ehrhardt <christian.ehrhardt@canonical.com> Thu, 25 Feb 2016 16:07:21 +0000
dpdk (2.2.0-0ubuntu1) xenial; urgency=low
* Merge from Upstream to DPDK 2.2
Remaining changes:
- Set soabi for the combined shared library
* Drop changes:
- configuring RTE_LIBNAME to dpdk as it is the upstream default now
- enabled formerly non building components as they build properly in 2.2
- d/p/ubunut-avoid-texlive-fonts-extra, d/control:
Replace use of DejaVuSansMono is no more needed as upstream changed the
font. Thereby we can drop our delta.
- d/p/ubuntu-fix-gcc5-ftbs.patch no more needed with DPDK 2.2
* Added changes
- Disable CONFIG_RTE_NEXT_ABI as required for packaging (git 506f51cc)
- Enable LIBRTE_PMD_PCAP which is useful for some DPDK testcase examples
this adds a build dependency to libpcap-dev
- Fully support DH_VERBOSE for build debugging convenience
- adapt to new make infrastructure of dpdk 2.2
- d/README.debian: convert into d/dpdk-doc.README.debian
- d/dpdk-doc.README.debian: update recommendations about sdk env variables
- d/dpdk-sdk-env.sh: now deployed in /usr/share/dpdk to be opt in
- enable XEN support for dpdk (LP: #1521289).
-- Christian Ehrhardt <christian.ehrhardt@canonical.com> Wed, 17 Feb 2016 09:29:28 +0100
dpdk (2.0.0-0ubuntu3) xenial; urgency=medium
* Only generate HTML documentation, easing backports to 14.04 and
reducing the time to build and size of the -doc package (LP: #1524700).
-- James Page <james.page@ubuntu.com> Thu, 10 Dec 2015 10:23:51 +0000
dpdk (2.0.0-0ubuntu2) xenial; urgency=low
* d/p/ubunut-avoid-texlive-fonts-extra, d/control:
Replace use of DejaVuSansMono by courier and drop dependency on the
texlive-fonts-extra package (which is in universe).
* d/watch added to allow use of uscan to check for upstream releases.
* d/dpdk-init: fix error if bash variables could not be resolved that
appeared as "[: -gt: unexpected operator" (had no functional impact)
* d/dpdk-init:
Replace use of head and cut (in /usr/bin) commands with sed (in /bin)
while also adding /usr/bin to the PATH used on direct /etc/init.d/dpdk
invocation. The PATH is only updated to be on the safe side, there
should be no other commands from /usr/bin used (LP: #1516543).
* d/t/test-mountpoint: add dep8 test to cover the issue of LP #1517075.
* d/dpdk-dev.install: Copy the SDK makefiles into place (LP: #1517075).
-- Stefan Bader <stefan.bader@canonical.com> Tue, 17 Nov 2015 11:50:15 +0100
dpdk (2.0.0-0ubuntu1) wily; urgency=low
* Initial release (LP: #1487538)
-- Stefan Bader <stefan.bader@canonical.com> Mon, 01 Jun 2015 18:46:38 +0200

View File

@ -0,0 +1 @@
9

View File

@ -0,0 +1,81 @@
Source: dpdk
Priority: optional
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Build-Depends: debhelper (>= 9),
dh-python,
dh-systemd (>= 1.5),
doxygen,
graphviz,
inkscape,
libcap-dev,
libpcap-dev,
libxen-dev,
libxenstore3.0,
python,
python-sphinx,
texlive-fonts-recommended,
texlive-latex-extra
Standards-Version: 3.9.6
Section: libs
Homepage: http://www.dpdk.org
Vcs-Original-Git: git://dpdk.org/dpdk
Vcs-Original-Browser: http://www.dpdk.org/browse/dpdk/refs/
Vcs-Git: https://git.launchpad.net/~ubuntu-server/dpdk
Vcs-Browser: https://code.launchpad.net/~ubuntu-server/dpdk/+git/dpdk
Package: dpdk
Section: devel
Architecture: amd64 i386
Depends: libdpdk0 (= ${binary:Version}),
lsb-base (>= 3.2-14),
${misc:Depends},
${python:Depends},
${shlibs:Depends}
Suggests: linux-image-generic
Description: Data Plane Development Kit (runtime)
DPDK is a set of libraries for fast packet processing. Applications run
in user-space and communicate directly with dedicated network interfaces.
This package contains the runtime environment to run DPDK applications.
Package: dpdk-dev
Section: devel
Architecture: amd64 i386
Depends: libdpdk0 (= ${binary:Version}), ${misc:Depends}
Description: Data Plane Development Kit (development files)
DPDK is a set of libraries for fast packet processing. Applications run
in user-space and communicate directly with dedicated network interfaces.
This package contains examples and the upstream build environment. It is
not strictly required in order to build external applications.
Package: dpdk-doc
Section: doc
Architecture: all
Depends: libjs-jquery, libjs-underscore, ${misc:Depends}
Description: Data Plane Development Kit (documentation)
DPDK is a set of libraries for fast packet processing. Applications run
in user-space and communicate directly with dedicated network interfaces.
This package contains the complete set of documentation and guides.
Package: libdpdk0
Architecture: amd64 i386
Multi-Arch: same
Pre-Depends: ${misc:Pre-Depends}
Depends: ${misc:Depends}, ${shlibs:Depends}
Description: Data Plane Development Kit (runtime libraries)
DPDK is a set of libraries for fast packet processing. Applications run
in user-space and communicate directly with dedicated network interfaces.
This package contains the runtime libraries which require at least SSE3
support in the CPU.
Package: libdpdk-dev
Section: libdevel
Architecture: amd64 i386
Multi-Arch: same
Pre-Depends: ${misc:Pre-Depends}
Depends: libdpdk0 (= ${binary:Version}), ${misc:Depends}
Description: Data Plane Development Kit (basic development files)
DPDK is a set of libraries for fast packet processing. Applications run
in user-space and communicate directly with dedicated network interfaces.
This package contains the basic headers and library files required to
build external applications which will also require at least SSE3 support
when running.

View File

@ -0,0 +1,48 @@
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: dpdk
Source: http://dpdk.org
Files: *
Copyright: 2008-2014 Cisco Systems, Inc.
2012-2014 6WIND S.A.
1999-2015 Intel Corporation.
2010-2013 Tilera Corporation.
2012 Mellanox.
2007 VMware, Inc.
2007 Nuova Systems, Inc.
2014 IBM Corporation.
License: BSD+GPLv2+LGPLv2
On Debian systems, the complete text of the BSD License can be
found in "/usr/share/common-licenses/BSD".
.
This package is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
.
This package is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>
.
On Debian systems, the complete text of the GNU General
Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".
Files: debian/*
Copyright: 2015 Canonical Ltd. <stefan.bader@canonical.com>
Copyright: 2015, 2016 Canonical Ltd. <christian.ehrhardt@canonical.com>
License: GPL-3
This program is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License version 3, as published
by the Free Software Foundation.
.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranties of
MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
PURPOSE. See the GNU General Public License for more details.
.
You should have received a copy of the GNU General Public License along
with this program. If not, see <http://www.gnu.org/licenses/>.

View File

@ -0,0 +1 @@
usr/share/dpdk

View File

@ -0,0 +1 @@
debian/dpdk-sdk-env.sh /usr/share/dpdk/

View File

@ -0,0 +1,52 @@
dpdk for Debian
---------------
This package is currently compiled for the lowest possible CPU requirements.
Which still requires at least SSE3 to be supported by the CPU.
dpdk (runtime) / libdpdk0:
For runtime /etc/dpdk/interfaces holds a list of PCI devices to be assigned
to DPDK compatible drivers and /etc/dpdk/dpdk.conf allows one to define the
number of hugepages to be reserved at boot.
The runtime environment is not required to build applications that use
DPDK but if those applications get packaged they should depend on the
runtime.
Since DPDK technically would be able to use all of your compatible card/driver
combination it is required that you take care of blacklisting / whitelisting
network cards to tell dpdk which it has to to initialize (especially true for
virtio-pci as the normal kernel driver is considered compatible).
If you are working with virtio-pci network cards it isn't a hard requirement to
assign them to a dpdk compatible userspace driver like uio_pci_generic. But you
have to at least unbind them from the default kernel driver (virtio-pci) to
avoid bugs by dpdk and the kernel working on them simultaneously. It is
recommended to reassign them to dpdk compatible drivers using
/etc/dpdk/interfaces (just as you would with any physical card).
libdpdk0 contains the shared object needed to run a program in terms of symbol
resolution, but none of the other runtime environment pieces.
dpdk-dev / libdpdk-dev:
The minimum requirement for developing external applications is libdpdk-dev,
which brings the headers and library files.
In dpdk-dev is the upstream makefile environment. Sample applications, which
are shipped in dpdk-doc, are providing makefiles.
Those makefiles need to find the dpdk build system. To do so they need some
environment variables defined:
export RTE_TARGET="$(uname -m)-default-linuxapp-gcc"
export RTE_SDK="/usr/share/dpdk/"
export RTE_INCLUDE="/usr/include/dpdk"
Those can be set by the user to overwrite with a custom path/config. If no
custom environment is used it is recommended to source the file
/usr/share/dpdk/dpdk-sdk-env.sh which comes with dpdk-dev.
If the paths ever change or there will be more/less variables needed to build
against dpdk-dev that file will be adjusted for you.
Alternatively /usr/include/dpdk/rte_config.h has to be pre-included:
CFLAGS += -I/usr/include/dpdk -irte_config.h
-- Christian Ehrhardt <christian.ehrhardt@canonical.com> Thu, 04 Feb 2016 09:16:11 +0100

View File

@ -0,0 +1 @@
usr/share/doc/dpdk

View File

@ -0,0 +1,251 @@
#!/bin/sh
#
# dpdk-init: startup script to initialize a dpdk runtime environment
#
# Copyright 2015-2016 Canonical Ltd.
# Autor: Stefan Bader <stefan.bader@canonical.com>
# Autor: Christian Ehrhardt <christian.ehrhardt@canonical.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 3,
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
set -e
DPDK_BIND="/sbin/dpdk_nic_bind"
DPDK_INTERF="/etc/dpdk/interfaces"
# pagesize supports [G|g]/[M|m]/[K|k]
get_kbytes() {
local unit
local num
unit=$(echo "${1}" | sed 's/[0-9]*//g')
num=$(echo "${1}" | sed 's/[^0-9]*//g')
case ${unit} in
*g | *G)
echo $((num*1024*1024))
;;
*m | *M)
echo $((num*1024))
;;
*k | *K)
echo $((num))
;;
*)
echo $((num/1024))
;;
esac
}
get_default_hpgsz() {
default_hpgsz=$(grep "Hugepagesize:" /proc/meminfo \
| sed 's/^Hugepagesize:\s*//g' | sed 's/\s*kB$//g')
echo "${default_hpgsz}"
}
get_hugetlbfs_mountpoint() {
local requested_hpgsz
local mp_hpgsz
requested_hpgsz=$(get_kbytes "${1}")
grep hugetlbfs /proc/mounts | while read \
mntfrom mntpoint mntfstype mntopt mntdump mntfsck; do
# check if the current muntpoint is of the requested huge page size
case ${mntopt} in
*pagesize=*)
mp_hpgsz=$(echo "${mntopt}" | sed 's/.*pagesize=//g' | sed 's/,.*//g')
mp_hpgsz=$(get_kbytes "${mp_hpgsz}")
;;
*)
mp_hpgsz=$(get_default_hpgsz)
;;
esac
if [ "${requested_hpgsz}" -eq "${mp_hpgsz}" ]; then
echo "${mntpoint}"
return
fi
done
}
_mount_hugetlbfs() {
local MNT="/dev/hugepages"
local MNTOPTS=""
local requested_hpgsz
local default_hpgsz
requested_hpgsz=$(get_kbytes "${1}")
default_hpgsz=$(get_default_hpgsz)
# kernel might not support the requested size
if [ ! -d "/sys/kernel/mm/hugepages/hugepages-${requested_hpgsz}kB" ]; then
echo "WARNING: requested page size of ${requested_hpgsz}kB " \
"not supported by the kernel"
return 0
fi
# special case if this is not the default huge page size
if [ "${requested_hpgsz}" -ne "${default_hpgsz}" ]; then
MNT="${MNT}-${requested_hpgsz}"
MNTOPTS="pagesize=${requested_hpgsz}K"
fi
if [ ! -e "${MNT}" ]; then
mkdir "${MNT}"
if [ $? -ne 0 ]; then
echo "Could not create directory ${MNT}!" >&2
return 1
fi
fi
mount -thugetlbfs hugetlbfs "${MNT}" -o "${MNTOPTS}"
return $?
}
#
# The DPDK library will use the first mounted instance it finds for a given
# page size. so if there is already one for a given size there is no need to
# create another for the same huge page size.
#
mount_hugetlbfs() {
if [ ! -r /etc/dpdk/dpdk.conf ]; then
return 1
fi
. /etc/dpdk/dpdk.conf
# if a page size is requested, there has to be a mountpoint for that size
if [ -n "${NR_2M_PAGES}" -a -z "$(get_hugetlbfs_mountpoint '2M')" ]; then
_mount_hugetlbfs 2M
fi
if [ -n "${NR_1G_PAGES}" -a -z "$(get_hugetlbfs_mountpoint '1G')" ]; then
_mount_hugetlbfs 1G
fi
}
_setup_hugepages() {
MMDIR="/sys/kernel/mm/hugepages/${1}"
PAGES=${2}
if [ "$PAGES" != "" ]; then
if [ "$PAGES" -gt 0 ]; then
if [ -d "$MMDIR" -a -w "$MMDIR/nr_hugepages" ]; then
# increases the chance to allocate enough huge pages
# configurable, since it comes at a perf penality
if [ "$DROPCACHE_BEFORE_HP_ALLOC" = "1" ]; then
echo 3 > /proc/sys/vm/drop_caches
fi
echo "$PAGES" > "$MMDIR/nr_hugepages"
GOTPAGES=$(cat "$MMDIR/nr_hugepages")
if [ "$GOTPAGES" -lt "$PAGES" ]; then
echo "WARNING: could not allocate $PAGES at " \
"$MMDIR/nr_hugepages (only got $GOTPAGES)."
fi
else
echo "WARNING: $MMDIR/nr_hugepages not found/writable"
fi
fi
fi
}
#
# Reserve a certain amount of hugepages (defined in /etc/dpdk.conf)
#
setup_hugepages() {
if [ ! -r /etc/dpdk/dpdk.conf ]; then
return 1
fi
. /etc/dpdk/dpdk.conf
_setup_hugepages "hugepages-2048kB" "$NR_2M_PAGES"
_setup_hugepages "hugepages-1048576kB" "$NR_1G_PAGES"
# dpdk uses 2*#hugepages mappings, increase for huge systems LP #1507921
if [ -d /sys/kernel/mm/hugepages ]; then
max_map_count=$(awk -v pad=65530 '{tot+=$1}END{print tot*2+pad}' \
/sys/kernel/mm/hugepages/hugepages-*/nr_hugepages)
sysctl -q vm.max_map_count="${max_map_count:-65530}"
fi
return 0
}
#
# Allow NICs to be automatically bound to DPDK compatible drivers on boot.
#
bind_interfaces() {
if [ ! -r "$DPDK_INTERF" ]; then
return 0
fi
grep -v '^[ \t]*#' "$DPDK_INTERF" | while read BUS ID MOD; do
if [ "$BUS" = "" -o "$ID" = "" -o "$MOD" = "" ]; then
echo "WARNING: incomplete spec in $DPDK_INTERF" \
" - BUS '$BUS' ID '$ID' MOD '$MOD'"
continue
fi
if [ "$BUS" != "pci" ]; then
echo "WARNING: incompatible bus '$BUS' in $DPDK_INTERF"
continue
fi
SYSFSPATH="/sys/bus/$BUS/devices/$ID"
if [ ! -e "$SYSFSPATH" ]; then
echo "WARNING: invalid pci ID '$ID' in $DPDK_INTERF" \
" - '$SYSFSPATH' does not exist"
continue
fi
if [ -L "$SYSFSPATH/driver" ]; then
CUR=$(readlink "$SYSFSPATH/driver")
CUR=$(basename "$CUR")
else
# device existing, but currently unregistered
CUR=""
fi
if [ "$MOD" != "$CUR" ]; then
modprobe -q "$MOD" || true
# cloud img have no linux-image-extra initially (uip_pci_generic)
# so check if the module is available (loadable/built in)
if [ -e "/sys/bus/pci/drivers/${MOD}" ]; then
echo "Reassigning pci:$ID to $MOD"
$DPDK_BIND -b "$MOD" "$ID"
else
echo "Warning: failed assigning pci:$ID," \
" module $MOD not available"
fi
else
echo "pci:$ID already assigned to $MOD"
fi
done
}
case "$1" in
start)
mount_hugetlbfs
setup_hugepages
bind_interfaces
;;
stop)
;;
reload|force-reload)
setup_hugepages
bind_interfaces
;;
status)
$DPDK_BIND --status
;;
*)
echo "Usage: $0 {start|stop|reload|force-reload|status}"
exit 1
;;
esac

View File

@ -0,0 +1,3 @@
export RTE_TARGET="$(uname -m)-default-linuxapp-gcc"
export RTE_SDK="/usr/share/dpdk/"
export RTE_INCLUDE="/usr/include/dpdk"

View File

@ -0,0 +1,54 @@
#
# The number of 2M hugepages to reserve on system boot
#
# Default is 0
# To e.g. let it reserve 64x 2M Hugepages set:
# NR_2M_PAGES=64
#
# The number of 1G hugepages to reserve on system boot
#
# Default is 0
# To e.g. let it reserve 2x 1G Hugepages set:
# NR_1G_PAGES=2
#
# Dropping slab and pagecache can help to successfully allocate hugepages,
# especially later in the lifecycle of a system.
# This comes at the cost of loosing all slab and pagecache on (re)start
# of the dpdk service - therefore the default is off.
#
# Default is 0
# Set to 1 to enable it
#DROPCACHE_BEFORE_HP_ALLOC=0
# The DPDK library will use the first mounted hugetlbfs.
# The init scripts try to ensure there is at least one default hugetlbfs
# mountpoint on start.
# If you have multiple hugetlbfs mountpoints for a complex (e.g. specific numa
# policies) setup it should be controlled by the admin instead of this init
# script. In that case specific mountpoints can be provided as parameters to
# the DPDK library.
# Hardware may support other granularities of hugepages (like 4M). But the
# larger the hugepages the earlier those should be allocated.
# Note: the dpdk init scripts will report warnings, but not fail if they could
# not allocate the requested amount of hugepages.
# The more or the larger the hugepages to be allocated are, the more it is
# recommended to do the reservation as kernel commandline arguments.
# To do so edit /etc/default/grub: GRUB_CMDLINE_LINUX_DEFAULT
# and add [hugepagesz=xx] hugepages=yy ...
#
# Kernel commandline config:
# hugepagesz sets the size for the next hugepages reservation (default 2M)
# hugepages reserves the given number of hugepages of the size set before
#
# After modifying /etc/default/grub, the command "update-grub" has to be
# run in order to re-generate the grub config files. The new values will
# be used after next reboot.
#
# example:
# GRUB_CMDLINE_LINUX_DEFAULT="... hugepages=16 hugepagesz=1G hugepages=2"
#
# If the system supports it, this will reserve 16x 2M pages and 2x 1G pages.
#

View File

@ -0,0 +1,5 @@
etc/dpdk
lib/dpdk
sbin
usr/bin
usr/lib/dpdk

View File

@ -0,0 +1,57 @@
#!/bin/sh
### BEGIN INIT INFO
# Provides: dpdk
# Required-Start: $local_fs
# Required-Stop: $local_fs
# Default-Start: S
# Default-Stop: 0 1 6
# Short-Description: start dpdk runtime environment
### END INIT INFO
set -e
PATH="/sbin:/bin:/usr/bin"
[ -d /lib/dpdk ] || exit 0
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions
error=0
case "$1" in
start)
log_action_begin_msg "Starting DPDK environment" "dpdk"
output=$(/lib/dpdk/dpdk-init start 2>&1) || error="$?"
if [ ! -z "$output" ]; then
echo "$output" | while read line; do
log_action_cont_msg "$line"
done
fi
log_action_end_msg $error
exit $error
;;
stop)
;;
restart|force-reload)
;;
status)
output=$(/lib/dpdk/dpdk-init --status 2>&1) || error="$?"
if [ ! -z "$output" ]; then
echo "$output" | while read line; do
log_action_cont_msg "$line"
done
fi
log_action_end_msg $error
exit $error
;;
*)
echo "Usage: $0 {start|stop|restart|force-reload|status}"
exit 1
;;
esac
exit 0

View File

@ -0,0 +1,2 @@
debian/dpdk-init lib/dpdk/
debian/dpdk.conf etc/dpdk/

View File

@ -0,0 +1,13 @@
#
# <bus> Currently only "pci" is supported
# <id> Device ID on the specified bus
# <driver> Driver to bind against (vfio-pci or uio_pci_generic)
#
# Be aware that the two dpdk compatible drivers uio_pci_generic and vfio-pci are
# part of linux-image-extra-<VERSION> package.
# This package is not always installed by default - for example in cloud-images.
# So please install it in case you run into missing module issues.
#
# <bus> <id> <driver>
# pci 0000:04:00.0 vfio-pci
# pci 0000:04:00.1 uio_pci_generic

View File

@ -0,0 +1,12 @@
[Unit]
Description=DPDK runtime environment
DefaultDependencies=false
After=network-pre.target local-fs.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/lib/dpdk/dpdk-init start
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1 @@
usr/include

View File

@ -0,0 +1 @@
usr/lib

View File

@ -0,0 +1,580 @@
libdpdk.so.0 libdpdk0 #MINVER#
* Build-Depends-Package: libdpdk-dev
DPDK_2.0@DPDK_2.0 2.2
DPDK_2.1@DPDK_2.1 2.2
DPDK_2.2@DPDK_2.2 2.2
__rte_panic@DPDK_2.0 2.2
_rte_eth_dev_callback_process@DPDK_2.2 2.2
cirbuf_add_buf_head@DPDK_2.0 2.2
cirbuf_add_buf_tail@DPDK_2.0 2.2
cirbuf_add_head@DPDK_2.0 2.2
cirbuf_add_head_safe@DPDK_2.0 2.2
cirbuf_add_tail@DPDK_2.0 2.2
cirbuf_add_tail_safe@DPDK_2.0 2.2
cirbuf_align_left@DPDK_2.0 2.2
cirbuf_align_right@DPDK_2.0 2.2
cirbuf_del_buf_head@DPDK_2.0 2.2
cirbuf_del_buf_tail@DPDK_2.0 2.2
cirbuf_del_head@DPDK_2.0 2.2
cirbuf_del_head_safe@DPDK_2.0 2.2
cirbuf_del_tail@DPDK_2.0 2.2
cirbuf_del_tail_safe@DPDK_2.0 2.2
cirbuf_get_buf_head@DPDK_2.0 2.2
cirbuf_get_buf_tail@DPDK_2.0 2.2
cirbuf_get_head@DPDK_2.0 2.2
cirbuf_get_tail@DPDK_2.0 2.2
cirbuf_init@DPDK_2.0 2.2
cmdline_complete@DPDK_2.0 2.2
cmdline_complete_get_elt_string@DPDK_2.0 2.2
cmdline_complete_get_nb_string@DPDK_2.0 2.2
cmdline_file_new@DPDK_2.0 2.2
cmdline_free@DPDK_2.0 2.2
cmdline_get_help_etheraddr@DPDK_2.0 2.2
cmdline_get_help_ipaddr@DPDK_2.0 2.2
cmdline_get_help_num@DPDK_2.0 2.2
cmdline_get_help_portlist@DPDK_2.0 2.2
cmdline_get_help_string@DPDK_2.0 2.2
cmdline_in@DPDK_2.0 2.2
cmdline_interact@DPDK_2.0 2.2
cmdline_isendoftoken@DPDK_2.0 2.2
cmdline_new@DPDK_2.0 2.2
cmdline_parse@DPDK_2.0 2.2
cmdline_parse_etheraddr@DPDK_2.0 2.2
cmdline_parse_ipaddr@DPDK_2.0 2.2
cmdline_parse_num@DPDK_2.0 2.2
cmdline_parse_portlist@DPDK_2.0 2.2
cmdline_parse_string@DPDK_2.0 2.2
cmdline_poll@DPDK_2.1 2.2
cmdline_printf@DPDK_2.0 2.2
cmdline_quit@DPDK_2.0 2.2
cmdline_set_prompt@DPDK_2.0 2.2
cmdline_stdin_exit@DPDK_2.0 2.2
cmdline_stdin_new@DPDK_2.0 2.2
cmdline_token_etheraddr_ops@DPDK_2.0 2.2
cmdline_token_ipaddr_ops@DPDK_2.0 2.2
cmdline_token_num_ops@DPDK_2.0 2.2
cmdline_token_portlist_ops@DPDK_2.0 2.2
cmdline_token_string_ops@DPDK_2.0 2.2
cmdline_write_char@DPDK_2.0 2.2
devargs_list@DPDK_2.0 2.2
eal_parse_sysfs_value@DPDK_2.0 2.2
eal_timer_source@DPDK_2.0 2.2
eth_dev_null_create@DPDK_2.2 2.2
lcore_config@DPDK_2.0 2.2
pci_device_list@DPDK_2.0 2.2
pci_driver_list@DPDK_2.0 2.2
per_lcore__lcore_id@DPDK_2.0 2.2
per_lcore__rte_errno@DPDK_2.0 2.2
rdline_add_history@DPDK_2.0 2.2
rdline_char_in@DPDK_2.0 2.2
rdline_clear_history@DPDK_2.0 2.2
rdline_get_buffer@DPDK_2.0 2.2
rdline_get_history_item@DPDK_2.0 2.2
rdline_init@DPDK_2.0 2.2
rdline_newline@DPDK_2.0 2.2
rdline_quit@DPDK_2.0 2.2
rdline_redisplay@DPDK_2.0 2.2
rdline_reset@DPDK_2.0 2.2
rdline_restart@DPDK_2.0 2.2
rdline_stop@DPDK_2.0 2.2
rte_acl_add_rules@DPDK_2.0 2.2
rte_acl_build@DPDK_2.0 2.2
rte_acl_classify@DPDK_2.0 2.2
rte_acl_classify_alg@DPDK_2.0 2.2
rte_acl_classify_scalar@DPDK_2.0 2.2
rte_acl_create@DPDK_2.0 2.2
rte_acl_dump@DPDK_2.0 2.2
rte_acl_find_existing@DPDK_2.0 2.2
rte_acl_free@DPDK_2.0 2.2
rte_acl_list_dump@DPDK_2.0 2.2
rte_acl_reset@DPDK_2.0 2.2
rte_acl_reset_rules@DPDK_2.0 2.2
rte_acl_set_ctx_classify@DPDK_2.0 2.2
rte_approx@DPDK_2.0 2.2
rte_calloc@DPDK_2.0 2.2
rte_calloc_socket@DPDK_2.0 2.2
rte_cfgfile_close@DPDK_2.0 2.2
rte_cfgfile_get_entry@DPDK_2.0 2.2
rte_cfgfile_has_entry@DPDK_2.0 2.2
rte_cfgfile_has_section@DPDK_2.0 2.2
rte_cfgfile_load@DPDK_2.0 2.2
rte_cfgfile_num_sections@DPDK_2.0 2.2
rte_cfgfile_section_entries@DPDK_2.0 2.2
rte_cfgfile_section_num_entries@DPDK_2.0 2.2
rte_cfgfile_sections@DPDK_2.0 2.2
rte_cpu_check_supported@DPDK_2.0 2.2
rte_cryptodev_callback_register@DPDK_2.2 2.2
rte_cryptodev_callback_unregister@DPDK_2.2 2.2
rte_cryptodev_close@DPDK_2.2 2.2
rte_cryptodev_configure@DPDK_2.2 2.2
rte_cryptodev_count@DPDK_2.2 2.2
rte_cryptodev_count_devtype@DPDK_2.2 2.2
rte_cryptodev_create_vdev@DPDK_2.2 2.2
rte_cryptodev_get_dev_id@DPDK_2.2 2.2
rte_cryptodev_info_get@DPDK_2.2 2.2
rte_cryptodev_pmd_allocate@DPDK_2.2 2.2
rte_cryptodev_pmd_callback_process@DPDK_2.2 2.2
rte_cryptodev_pmd_driver_register@DPDK_2.2 2.2
rte_cryptodev_pmd_release_device@DPDK_2.2 2.2
rte_cryptodev_pmd_virtual_dev_init@DPDK_2.2 2.2
rte_cryptodev_queue_pair_count@DPDK_2.2 2.2
rte_cryptodev_queue_pair_setup@DPDK_2.2 2.2
rte_cryptodev_queue_pair_start@DPDK_2.2 2.2
rte_cryptodev_queue_pair_stop@DPDK_2.2 2.2
rte_cryptodev_session_create@DPDK_2.2 2.2
rte_cryptodev_session_free@DPDK_2.2 2.2
rte_cryptodev_socket_id@DPDK_2.2 2.2
rte_cryptodev_start@DPDK_2.2 2.2
rte_cryptodev_stats_get@DPDK_2.2 2.2
rte_cryptodev_stats_reset@DPDK_2.2 2.2
rte_cryptodev_stop@DPDK_2.2 2.2
rte_cryptodevs@DPDK_2.2 2.2
rte_ctrlmbuf_init@DPDK_2.0 2.2
rte_cycles_vmware_tsc_map@DPDK_2.0 2.2
rte_delay_us@DPDK_2.0 2.2
rte_distributor_clear_returns@DPDK_2.0 2.2
rte_distributor_create@DPDK_2.0 2.2
rte_distributor_flush@DPDK_2.0 2.2
rte_distributor_get_pkt@DPDK_2.0 2.2
rte_distributor_poll_pkt@DPDK_2.0 2.2
rte_distributor_process@DPDK_2.0 2.2
rte_distributor_request_pkt@DPDK_2.0 2.2
rte_distributor_return_pkt@DPDK_2.0 2.2
rte_distributor_returned_pkts@DPDK_2.0 2.2
rte_dom0_mempool_create@DPDK_2.0 2.2
rte_dump_physmem_layout@DPDK_2.0 2.2
rte_dump_registers@DPDK_2.0 2.2
rte_dump_stack@DPDK_2.0 2.2
rte_dump_tailq@DPDK_2.0 2.2
rte_eal_alarm_cancel@DPDK_2.0 2.2
rte_eal_alarm_set@DPDK_2.0 2.2
rte_eal_dev_init@DPDK_2.0 2.2
rte_eal_devargs_add@DPDK_2.0 2.2
rte_eal_devargs_dump@DPDK_2.0 2.2
rte_eal_devargs_type_count@DPDK_2.0 2.2
rte_eal_driver_register@DPDK_2.0 2.2
rte_eal_driver_unregister@DPDK_2.0 2.2
rte_eal_get_configuration@DPDK_2.0 2.2
rte_eal_get_lcore_state@DPDK_2.0 2.2
rte_eal_get_physmem_layout@DPDK_2.0 2.2
rte_eal_get_physmem_size@DPDK_2.0 2.2
rte_eal_has_hugepages@DPDK_2.0 2.2
rte_eal_init@DPDK_2.0 2.2
rte_eal_iopl_init@DPDK_2.0 2.2
rte_eal_lcore_role@DPDK_2.0 2.2
rte_eal_mp_remote_launch@DPDK_2.0 2.2
rte_eal_mp_wait_lcore@DPDK_2.0 2.2
rte_eal_parse_devargs_str@DPDK_2.0 2.2
rte_eal_pci_detach@DPDK_2.1 2.2
rte_eal_pci_dump@DPDK_2.0 2.2
rte_eal_pci_probe@DPDK_2.0 2.2
rte_eal_pci_probe_one@DPDK_2.0 2.2
rte_eal_pci_read_config@DPDK_2.1 2.2
rte_eal_pci_register@DPDK_2.0 2.2
rte_eal_pci_scan@DPDK_2.0 2.2
rte_eal_pci_unregister@DPDK_2.0 2.2
rte_eal_pci_write_config@DPDK_2.1 2.2
rte_eal_process_type@DPDK_2.0 2.2
rte_eal_remote_launch@DPDK_2.0 2.2
rte_eal_tailq_lookup@DPDK_2.0 2.2
rte_eal_tailq_register@DPDK_2.0 2.2
rte_eal_vdev_init@DPDK_2.0 2.2
rte_eal_vdev_uninit@DPDK_2.0 2.2
rte_eal_wait_lcore@DPDK_2.0 2.2
rte_epoll_ctl@DPDK_2.1 2.2
rte_epoll_wait@DPDK_2.1 2.2
rte_eth_add_rx_callback@DPDK_2.2 2.2
rte_eth_add_tx_callback@DPDK_2.2 2.2
rte_eth_allmulticast_disable@DPDK_2.2 2.2
rte_eth_allmulticast_enable@DPDK_2.2 2.2
rte_eth_allmulticast_get@DPDK_2.2 2.2
rte_eth_bond_8023ad_conf_get@DPDK_2.0 2.2
rte_eth_bond_8023ad_setup@DPDK_2.0 2.2
rte_eth_bond_active_slaves_get@DPDK_2.0 2.2
rte_eth_bond_create@DPDK_2.0 2.2
rte_eth_bond_free@DPDK_2.1 2.2
rte_eth_bond_link_monitoring_set@DPDK_2.0 2.2
rte_eth_bond_mac_address_reset@DPDK_2.0 2.2
rte_eth_bond_mac_address_set@DPDK_2.0 2.2
rte_eth_bond_mode_get@DPDK_2.0 2.2
rte_eth_bond_mode_set@DPDK_2.0 2.2
rte_eth_bond_primary_get@DPDK_2.0 2.2
rte_eth_bond_primary_set@DPDK_2.0 2.2
rte_eth_bond_slave_add@DPDK_2.0 2.2
rte_eth_bond_slave_remove@DPDK_2.0 2.2
rte_eth_bond_slaves_get@DPDK_2.0 2.2
rte_eth_bond_xmit_policy_get@DPDK_2.0 2.2
rte_eth_bond_xmit_policy_set@DPDK_2.0 2.2
rte_eth_copy_pci_info@DPDK_2.2 2.2
rte_eth_dev_allocate@DPDK_2.2 2.2
rte_eth_dev_allocated@DPDK_2.2 2.2
rte_eth_dev_attach@DPDK_2.2 2.2
rte_eth_dev_callback_register@DPDK_2.2 2.2
rte_eth_dev_callback_unregister@DPDK_2.2 2.2
rte_eth_dev_close@DPDK_2.2 2.2
rte_eth_dev_configure@DPDK_2.2 2.2
rte_eth_dev_count@DPDK_2.2 2.2
rte_eth_dev_default_mac_addr_set@DPDK_2.2 2.2
rte_eth_dev_detach@DPDK_2.2 2.2
rte_eth_dev_filter_ctrl@DPDK_2.2 2.2
rte_eth_dev_filter_supported@DPDK_2.2 2.2
rte_eth_dev_flow_ctrl_get@DPDK_2.2 2.2
rte_eth_dev_flow_ctrl_set@DPDK_2.2 2.2
rte_eth_dev_get_dcb_info@DPDK_2.2 2.2
rte_eth_dev_get_eeprom@DPDK_2.2 2.2
rte_eth_dev_get_eeprom_length@DPDK_2.2 2.2
rte_eth_dev_get_mtu@DPDK_2.2 2.2
rte_eth_dev_get_reg_info@DPDK_2.2 2.2
rte_eth_dev_get_reg_length@DPDK_2.2 2.2
rte_eth_dev_get_vlan_offload@DPDK_2.2 2.2
rte_eth_dev_info_get@DPDK_2.2 2.2
rte_eth_dev_is_valid_port@DPDK_2.2 2.2
rte_eth_dev_mac_addr_add@DPDK_2.2 2.2
rte_eth_dev_mac_addr_remove@DPDK_2.2 2.2
rte_eth_dev_priority_flow_ctrl_set@DPDK_2.2 2.2
rte_eth_dev_release_port@DPDK_2.2 2.2
rte_eth_dev_rss_hash_conf_get@DPDK_2.2 2.2
rte_eth_dev_rss_hash_update@DPDK_2.2 2.2
rte_eth_dev_rss_reta_query@DPDK_2.2 2.2
rte_eth_dev_rss_reta_update@DPDK_2.2 2.2
rte_eth_dev_rx_intr_ctl@DPDK_2.2 2.2
rte_eth_dev_rx_intr_ctl_q@DPDK_2.2 2.2
rte_eth_dev_rx_intr_disable@DPDK_2.2 2.2
rte_eth_dev_rx_intr_enable@DPDK_2.2 2.2
rte_eth_dev_rx_queue_start@DPDK_2.2 2.2
rte_eth_dev_rx_queue_stop@DPDK_2.2 2.2
rte_eth_dev_set_eeprom@DPDK_2.2 2.2
rte_eth_dev_set_link_down@DPDK_2.2 2.2
rte_eth_dev_set_link_up@DPDK_2.2 2.2
rte_eth_dev_set_mc_addr_list@DPDK_2.2 2.2
rte_eth_dev_set_mtu@DPDK_2.2 2.2
rte_eth_dev_set_rx_queue_stats_mapping@DPDK_2.2 2.2
rte_eth_dev_set_tx_queue_stats_mapping@DPDK_2.2 2.2
rte_eth_dev_set_vf_rx@DPDK_2.2 2.2
rte_eth_dev_set_vf_rxmode@DPDK_2.2 2.2
rte_eth_dev_set_vf_tx@DPDK_2.2 2.2
rte_eth_dev_set_vf_vlan_filter@DPDK_2.2 2.2
rte_eth_dev_set_vlan_ether_type@DPDK_2.2 2.2
rte_eth_dev_set_vlan_offload@DPDK_2.2 2.2
rte_eth_dev_set_vlan_pvid@DPDK_2.2 2.2
rte_eth_dev_set_vlan_strip_on_queue@DPDK_2.2 2.2
rte_eth_dev_socket_id@DPDK_2.2 2.2
rte_eth_dev_start@DPDK_2.2 2.2
rte_eth_dev_stop@DPDK_2.2 2.2
rte_eth_dev_tx_queue_start@DPDK_2.2 2.2
rte_eth_dev_tx_queue_stop@DPDK_2.2 2.2
rte_eth_dev_uc_all_hash_table_set@DPDK_2.2 2.2
rte_eth_dev_uc_hash_table_set@DPDK_2.2 2.2
rte_eth_dev_udp_tunnel_add@DPDK_2.2 2.2
rte_eth_dev_udp_tunnel_delete@DPDK_2.2 2.2
rte_eth_dev_vlan_filter@DPDK_2.2 2.2
rte_eth_devices@DPDK_2.2 2.2
rte_eth_dma_zone_reserve@DPDK_2.2 2.2
rte_eth_driver_register@DPDK_2.2 2.2
rte_eth_from_ring@DPDK_2.2 2.2
rte_eth_from_rings@DPDK_2.0 2.2
rte_eth_led_off@DPDK_2.2 2.2
rte_eth_led_on@DPDK_2.2 2.2
rte_eth_link_get@DPDK_2.2 2.2
rte_eth_link_get_nowait@DPDK_2.2 2.2
rte_eth_macaddr_get@DPDK_2.2 2.2
rte_eth_mirror_rule_reset@DPDK_2.2 2.2
rte_eth_mirror_rule_set@DPDK_2.2 2.2
rte_eth_promiscuous_disable@DPDK_2.2 2.2
rte_eth_promiscuous_enable@DPDK_2.2 2.2
rte_eth_promiscuous_get@DPDK_2.2 2.2
rte_eth_remove_rx_callback@DPDK_2.2 2.2
rte_eth_remove_tx_callback@DPDK_2.2 2.2
rte_eth_rx_queue_info_get@DPDK_2.2 2.2
rte_eth_rx_queue_setup@DPDK_2.2 2.2
rte_eth_set_queue_rate_limit@DPDK_2.2 2.2
rte_eth_set_vf_rate_limit@DPDK_2.2 2.2
rte_eth_stats_get@DPDK_2.2 2.2
rte_eth_stats_reset@DPDK_2.2 2.2
rte_eth_timesync_adjust_time@DPDK_2.2 2.2
rte_eth_timesync_disable@DPDK_2.2 2.2
rte_eth_timesync_enable@DPDK_2.2 2.2
rte_eth_timesync_read_rx_timestamp@DPDK_2.2 2.2
rte_eth_timesync_read_time@DPDK_2.2 2.2
rte_eth_timesync_read_tx_timestamp@DPDK_2.2 2.2
rte_eth_timesync_write_time@DPDK_2.2 2.2
rte_eth_tx_queue_info_get@DPDK_2.2 2.2
rte_eth_tx_queue_setup@DPDK_2.2 2.2
rte_eth_xstats_get@DPDK_2.2 2.2
rte_eth_xstats_reset@DPDK_2.2 2.2
rte_exit@DPDK_2.0 2.2
rte_fbk_hash_create@DPDK_2.0 2.2
rte_fbk_hash_find_existing@DPDK_2.0 2.2
rte_fbk_hash_free@DPDK_2.0 2.2
rte_free@DPDK_2.0 2.2
rte_get_rx_ol_flag_name@DPDK_2.0 2.2
rte_get_tsc_hz@DPDK_2.0 2.2
rte_get_tx_ol_flag_name@DPDK_2.0 2.2
rte_hash_add_key@DPDK_2.0 2.2
rte_hash_add_key_data@DPDK_2.1 2.2
rte_hash_add_key_with_hash@DPDK_2.0 2.2
rte_hash_add_key_with_hash_data@DPDK_2.1 2.2
rte_hash_create@DPDK_2.0 2.2
rte_hash_del_key@DPDK_2.0 2.2
rte_hash_del_key_with_hash@DPDK_2.0 2.2
rte_hash_find_existing@DPDK_2.0 2.2
rte_hash_free@DPDK_2.0 2.2
rte_hash_hash@DPDK_2.0 2.2
rte_hash_iterate@DPDK_2.1 2.2
rte_hash_lookup@DPDK_2.0 2.2
rte_hash_lookup_bulk@DPDK_2.0 2.2
rte_hash_lookup_bulk_data@DPDK_2.1 2.2
rte_hash_lookup_data@DPDK_2.1 2.2
rte_hash_lookup_with_hash@DPDK_2.0 2.2
rte_hash_lookup_with_hash_data@DPDK_2.1 2.2
rte_hash_reset@DPDK_2.1 2.2
rte_hash_set_cmp_func@DPDK_2.2 2.2
rte_hexdump@DPDK_2.0 2.2
rte_intr_allow_others@DPDK_2.1 2.2
rte_intr_callback_register@DPDK_2.0 2.2
rte_intr_callback_unregister@DPDK_2.0 2.2
rte_intr_cap_multiple@DPDK_2.2 2.2
rte_intr_disable@DPDK_2.0 2.2
rte_intr_dp_is_en@DPDK_2.1 2.2
rte_intr_efd_disable@DPDK_2.1 2.2
rte_intr_efd_enable@DPDK_2.1 2.2
rte_intr_enable@DPDK_2.0 2.2
rte_intr_rx_ctl@DPDK_2.1 2.2
rte_intr_tls_epfd@DPDK_2.1 2.2
rte_ip_frag_free_death_row@DPDK_2.0 2.2
rte_ip_frag_table_create@DPDK_2.0 2.2
rte_ip_frag_table_statistics_dump@DPDK_2.0 2.2
rte_ipv4_frag_reassemble_packet@DPDK_2.0 2.2
rte_ipv4_fragment_packet@DPDK_2.0 2.2
rte_ipv6_frag_reassemble_packet@DPDK_2.0 2.2
rte_ipv6_fragment_packet@DPDK_2.0 2.2
rte_jobstats_context_finish@DPDK_2.0 2.2
rte_jobstats_context_init@DPDK_2.0 2.2
rte_jobstats_context_reset@DPDK_2.0 2.2
rte_jobstats_context_start@DPDK_2.0 2.2
rte_jobstats_finish@DPDK_2.0 2.2
rte_jobstats_init@DPDK_2.0 2.2
rte_jobstats_reset@DPDK_2.0 2.2
rte_jobstats_set_max@DPDK_2.0 2.2
rte_jobstats_set_min@DPDK_2.0 2.2
rte_jobstats_set_period@DPDK_2.0 2.2
rte_jobstats_set_target@DPDK_2.0 2.2
rte_jobstats_set_update_period_function@DPDK_2.0 2.2
rte_jobstats_start@DPDK_2.0 2.2
rte_keepalive_create@DPDK_2.2 2.2
rte_keepalive_dispatch_pings@DPDK_2.2 2.2
rte_keepalive_register_core@DPDK_2.2 2.2
rte_kni_alloc@DPDK_2.0 2.2
rte_kni_close@DPDK_2.0 2.2
rte_kni_get@DPDK_2.0 2.2
rte_kni_get_name@DPDK_2.0 2.2
rte_kni_handle_request@DPDK_2.0 2.2
rte_kni_init@DPDK_2.0 2.2
rte_kni_register_handlers@DPDK_2.0 2.2
rte_kni_release@DPDK_2.0 2.2
rte_kni_rx_burst@DPDK_2.0 2.2
rte_kni_tx_burst@DPDK_2.0 2.2
rte_kni_unregister_handlers@DPDK_2.0 2.2
rte_kvargs_count@DPDK_2.0 2.2
rte_kvargs_free@DPDK_2.0 2.2
rte_kvargs_parse@DPDK_2.0 2.2
rte_kvargs_process@DPDK_2.0 2.2
rte_log@DPDK_2.0 2.2
rte_log_add_in_history@DPDK_2.0 2.2
rte_log_cur_msg_loglevel@DPDK_2.0 2.2
rte_log_cur_msg_logtype@DPDK_2.0 2.2
rte_log_dump_history@DPDK_2.0 2.2
rte_log_set_history@DPDK_2.0 2.2
rte_logs@DPDK_2.0 2.2
rte_lpm6_add@DPDK_2.0 2.2
rte_lpm6_create@DPDK_2.0 2.2
rte_lpm6_delete@DPDK_2.0 2.2
rte_lpm6_delete_all@DPDK_2.0 2.2
rte_lpm6_delete_bulk_func@DPDK_2.0 2.2
rte_lpm6_find_existing@DPDK_2.0 2.2
rte_lpm6_free@DPDK_2.0 2.2
rte_lpm6_is_rule_present@DPDK_2.0 2.2
rte_lpm6_lookup@DPDK_2.0 2.2
rte_lpm6_lookup_bulk_func@DPDK_2.0 2.2
rte_lpm_add@DPDK_2.0 2.2
rte_lpm_create@DPDK_2.0 2.2
rte_lpm_delete@DPDK_2.0 2.2
rte_lpm_delete_all@DPDK_2.0 2.2
rte_lpm_find_existing@DPDK_2.0 2.2
rte_lpm_free@DPDK_2.0 2.2
rte_lpm_is_rule_present@DPDK_2.0 2.2
rte_malloc@DPDK_2.0 2.2
rte_malloc_dump_stats@DPDK_2.0 2.2
rte_malloc_get_socket_stats@DPDK_2.0 2.2
rte_malloc_set_limit@DPDK_2.0 2.2
rte_malloc_socket@DPDK_2.0 2.2
rte_malloc_validate@DPDK_2.0 2.2
rte_malloc_virt2phy@DPDK_2.0 2.2
rte_mbuf_sanity_check@DPDK_2.0 2.2
rte_mem_lock_page@DPDK_2.0 2.2
rte_mem_virt2phy@DPDK_2.0 2.2
rte_memdump@DPDK_2.0 2.2
rte_memory_get_nchannel@DPDK_2.0 2.2
rte_memory_get_nrank@DPDK_2.0 2.2
rte_mempool_audit@DPDK_2.0 2.2
rte_mempool_calc_obj_size@DPDK_2.0 2.2
rte_mempool_count@DPDK_2.0 2.2
rte_mempool_create@DPDK_2.0 2.2
rte_mempool_dump@DPDK_2.0 2.2
rte_mempool_gntalloc_create@DPDK_2.0 2.2
rte_mempool_list_dump@DPDK_2.0 2.2
rte_mempool_lookup@DPDK_2.0 2.2
rte_mempool_obj_iter@DPDK_2.0 2.2
rte_mempool_walk@DPDK_2.0 2.2
rte_mempool_xmem_create@DPDK_2.0 2.2
rte_mempool_xmem_size@DPDK_2.0 2.2
rte_mempool_xmem_usage@DPDK_2.0 2.2
rte_memzone_dump@DPDK_2.0 2.2
rte_memzone_free@DPDK_2.1 2.2
rte_memzone_lookup@DPDK_2.0 2.2
rte_memzone_reserve@DPDK_2.0 2.2
rte_memzone_reserve_aligned@DPDK_2.0 2.2
rte_memzone_reserve_bounded@DPDK_2.0 2.2
rte_memzone_walk@DPDK_2.0 2.2
rte_meter_srtcm_config@DPDK_2.0 2.2
rte_meter_trtcm_config@DPDK_2.0 2.2
rte_openlog_stream@DPDK_2.0 2.2
rte_pipeline_check@DPDK_2.0 2.2
rte_pipeline_create@DPDK_2.0 2.2
rte_pipeline_flush@DPDK_2.0 2.2
rte_pipeline_free@DPDK_2.0 2.2
rte_pipeline_port_in_connect_to_table@DPDK_2.0 2.2
rte_pipeline_port_in_create@DPDK_2.0 2.2
rte_pipeline_port_in_disable@DPDK_2.0 2.2
rte_pipeline_port_in_enable@DPDK_2.0 2.2
rte_pipeline_port_in_stats_read@DPDK_2.1 2.2
rte_pipeline_port_out_create@DPDK_2.0 2.2
rte_pipeline_port_out_packet_insert@DPDK_2.0 2.2
rte_pipeline_port_out_stats_read@DPDK_2.1 2.2
rte_pipeline_run@DPDK_2.0 2.2
rte_pipeline_table_create@DPDK_2.0 2.2
rte_pipeline_table_default_entry_add@DPDK_2.0 2.2
rte_pipeline_table_default_entry_delete@DPDK_2.0 2.2
rte_pipeline_table_entry_add@DPDK_2.0 2.2
rte_pipeline_table_entry_add_bulk@DPDK_2.2 2.2
rte_pipeline_table_entry_delete@DPDK_2.0 2.2
rte_pipeline_table_entry_delete_bulk@DPDK_2.2 2.2
rte_pipeline_table_stats_read@DPDK_2.1 2.2
rte_pktmbuf_dump@DPDK_2.0 2.2
rte_pktmbuf_init@DPDK_2.0 2.2
rte_pktmbuf_offload_pool_create@DPDK_2.2 2.2
rte_pktmbuf_pool_create@DPDK_2.1 2.2
rte_pktmbuf_pool_init@DPDK_2.0 2.2
rte_pmd_af_packet_devinit@DPDK_2.0 2.2
rte_port_ethdev_reader_ops@DPDK_2.0 2.2
rte_port_ethdev_writer_nodrop_ops@DPDK_2.1 2.2
rte_port_ethdev_writer_ops@DPDK_2.0 2.2
rte_port_ring_multi_reader_ops@DPDK_2.2 2.2
rte_port_ring_multi_writer_nodrop_ops@DPDK_2.2 2.2
rte_port_ring_multi_writer_ops@DPDK_2.2 2.2
rte_port_ring_reader_ipv4_frag_ops@DPDK_2.0 2.2
rte_port_ring_reader_ipv6_frag_ops@DPDK_2.1 2.2
rte_port_ring_reader_ops@DPDK_2.0 2.2
rte_port_ring_writer_ipv4_ras_ops@DPDK_2.0 2.2
rte_port_ring_writer_ipv6_ras_ops@DPDK_2.1 2.2
rte_port_ring_writer_nodrop_ops@DPDK_2.1 2.2
rte_port_ring_writer_ops@DPDK_2.0 2.2
rte_port_sched_reader_ops@DPDK_2.0 2.2
rte_port_sched_writer_ops@DPDK_2.0 2.2
rte_port_sink_ops@DPDK_2.0 2.2
rte_port_source_ops@DPDK_2.0 2.2
rte_power_exit@DPDK_2.0 2.2
rte_power_freq_down@DPDK_2.0 2.2
rte_power_freq_max@DPDK_2.0 2.2
rte_power_freq_min@DPDK_2.0 2.2
rte_power_freq_up@DPDK_2.0 2.2
rte_power_freqs@DPDK_2.0 2.2
rte_power_get_env@DPDK_2.0 2.2
rte_power_get_freq@DPDK_2.0 2.2
rte_power_init@DPDK_2.0 2.2
rte_power_set_env@DPDK_2.0 2.2
rte_power_set_freq@DPDK_2.0 2.2
rte_power_unset_env@DPDK_2.0 2.2
rte_realloc@DPDK_2.0 2.2
rte_red_config_init@DPDK_2.0 2.2
rte_red_log2_1_minus_Wq@DPDK_2.0 2.2
rte_red_pow2_frac_inv@DPDK_2.0 2.2
rte_red_rand_seed@DPDK_2.0 2.2
rte_red_rand_val@DPDK_2.0 2.2
rte_red_rt_data_init@DPDK_2.0 2.2
rte_reorder_create@DPDK_2.0 2.2
rte_reorder_drain@DPDK_2.0 2.2
rte_reorder_find_existing@DPDK_2.0 2.2
rte_reorder_free@DPDK_2.0 2.2
rte_reorder_init@DPDK_2.0 2.2
rte_reorder_insert@DPDK_2.0 2.2
rte_reorder_reset@DPDK_2.0 2.2
rte_ring_create@DPDK_2.0 2.2
rte_ring_dump@DPDK_2.0 2.2
rte_ring_free@DPDK_2.2 2.2
rte_ring_get_memsize@DPDK_2.0 2.2
rte_ring_init@DPDK_2.0 2.2
rte_ring_list_dump@DPDK_2.0 2.2
rte_ring_lookup@DPDK_2.0 2.2
rte_ring_set_water_mark@DPDK_2.0 2.2
rte_sched_pipe_config@DPDK_2.0 2.2
rte_sched_port_config@DPDK_2.0 2.2
rte_sched_port_dequeue@DPDK_2.0 2.2
rte_sched_port_enqueue@DPDK_2.0 2.2
rte_sched_port_free@DPDK_2.0 2.2
rte_sched_port_get_memory_footprint@DPDK_2.0 2.2
rte_sched_port_pkt_read_color@DPDK_2.1 2.2
rte_sched_port_pkt_read_tree_path@DPDK_2.1 2.2
rte_sched_port_pkt_write@DPDK_2.1 2.2
rte_sched_queue_read_stats@DPDK_2.0 2.2
rte_sched_subport_config@DPDK_2.0 2.2
rte_sched_subport_read_stats@DPDK_2.0 2.2
rte_set_application_usage_hook@DPDK_2.0 2.2
rte_set_log_level@DPDK_2.0 2.2
rte_set_log_type@DPDK_2.0 2.2
rte_socket_id@DPDK_2.0 2.2
rte_strerror@DPDK_2.0 2.2
rte_strsplit@DPDK_2.0 2.2
rte_sys_gettid@DPDK_2.0 2.2
rte_table_acl_ops@DPDK_2.0 2.2
rte_table_array_ops@DPDK_2.0 2.2
rte_table_hash_ext_ops@DPDK_2.0 2.2
rte_table_hash_key16_ext_dosig_ops@DPDK_2.2 2.2
rte_table_hash_key16_ext_ops@DPDK_2.0 2.2
rte_table_hash_key16_lru_ops@DPDK_2.0 2.2
rte_table_hash_key32_ext_ops@DPDK_2.0 2.2
rte_table_hash_key32_lru_ops@DPDK_2.0 2.2
rte_table_hash_key8_ext_dosig_ops@DPDK_2.0 2.2
rte_table_hash_key8_ext_ops@DPDK_2.0 2.2
rte_table_hash_key8_lru_dosig_ops@DPDK_2.0 2.2
rte_table_hash_key8_lru_ops@DPDK_2.0 2.2
rte_table_hash_lru_ops@DPDK_2.0 2.2
rte_table_lpm_ipv6_ops@DPDK_2.0 2.2
rte_table_lpm_ops@DPDK_2.0 2.2
rte_table_stub_ops@DPDK_2.0 2.2
rte_thread_get_affinity@DPDK_2.0 2.2
rte_thread_set_affinity@DPDK_2.0 2.2
rte_timer_dump_stats@DPDK_2.0 2.2
rte_timer_init@DPDK_2.0 2.2
rte_timer_manage@DPDK_2.0 2.2
rte_timer_pending@DPDK_2.0 2.2
rte_timer_reset@DPDK_2.0 2.2
rte_timer_reset_sync@DPDK_2.0 2.2
rte_timer_stop@DPDK_2.0 2.2
rte_timer_stop_sync@DPDK_2.0 2.2
rte_timer_subsystem_init@DPDK_2.0 2.2
rte_vhost_dequeue_burst@DPDK_2.0 2.2
rte_vhost_driver_callback_register@DPDK_2.0 2.2
rte_vhost_driver_register@DPDK_2.0 2.2
rte_vhost_driver_session_start@DPDK_2.0 2.2
rte_vhost_driver_unregister@DPDK_2.1 2.2
rte_vhost_enable_guest_notification@DPDK_2.0 2.2
rte_vhost_enqueue_burst@DPDK_2.0 2.2
rte_vhost_feature_disable@DPDK_2.0 2.2
rte_vhost_feature_enable@DPDK_2.0 2.2
rte_vhost_feature_get@DPDK_2.0 2.2
rte_vlog@DPDK_2.0 2.2
rte_zmalloc@DPDK_2.0 2.2
rte_zmalloc_socket@DPDK_2.0 2.2
vt100_init@DPDK_2.0 2.2
vt100_parser@DPDK_2.0 2.2

View File

@ -0,0 +1,569 @@
libdpdk.so.0 libdpdk0 #MINVER#
* Build-Depends-Package: libdpdk-dev
DPDK_2.0@DPDK_2.0 2.2
DPDK_2.1@DPDK_2.1 2.2
DPDK_2.2@DPDK_2.2 2.2
__rte_panic@DPDK_2.0 2.2
_rte_eth_dev_callback_process@DPDK_2.2 2.2
cirbuf_add_buf_head@DPDK_2.0 2.2
cirbuf_add_buf_tail@DPDK_2.0 2.2
cirbuf_add_head@DPDK_2.0 2.2
cirbuf_add_head_safe@DPDK_2.0 2.2
cirbuf_add_tail@DPDK_2.0 2.2
cirbuf_add_tail_safe@DPDK_2.0 2.2
cirbuf_align_left@DPDK_2.0 2.2
cirbuf_align_right@DPDK_2.0 2.2
cirbuf_del_buf_head@DPDK_2.0 2.2
cirbuf_del_buf_tail@DPDK_2.0 2.2
cirbuf_del_head@DPDK_2.0 2.2
cirbuf_del_head_safe@DPDK_2.0 2.2
cirbuf_del_tail@DPDK_2.0 2.2
cirbuf_del_tail_safe@DPDK_2.0 2.2
cirbuf_get_buf_head@DPDK_2.0 2.2
cirbuf_get_buf_tail@DPDK_2.0 2.2
cirbuf_get_head@DPDK_2.0 2.2
cirbuf_get_tail@DPDK_2.0 2.2
cirbuf_init@DPDK_2.0 2.2
cmdline_complete@DPDK_2.0 2.2
cmdline_complete_get_elt_string@DPDK_2.0 2.2
cmdline_complete_get_nb_string@DPDK_2.0 2.2
cmdline_file_new@DPDK_2.0 2.2
cmdline_free@DPDK_2.0 2.2
cmdline_get_help_etheraddr@DPDK_2.0 2.2
cmdline_get_help_ipaddr@DPDK_2.0 2.2
cmdline_get_help_num@DPDK_2.0 2.2
cmdline_get_help_portlist@DPDK_2.0 2.2
cmdline_get_help_string@DPDK_2.0 2.2
cmdline_in@DPDK_2.0 2.2
cmdline_interact@DPDK_2.0 2.2
cmdline_isendoftoken@DPDK_2.0 2.2
cmdline_new@DPDK_2.0 2.2
cmdline_parse@DPDK_2.0 2.2
cmdline_parse_etheraddr@DPDK_2.0 2.2
cmdline_parse_ipaddr@DPDK_2.0 2.2
cmdline_parse_num@DPDK_2.0 2.2
cmdline_parse_portlist@DPDK_2.0 2.2
cmdline_parse_string@DPDK_2.0 2.2
cmdline_poll@DPDK_2.1 2.2
cmdline_printf@DPDK_2.0 2.2
cmdline_quit@DPDK_2.0 2.2
cmdline_set_prompt@DPDK_2.0 2.2
cmdline_stdin_exit@DPDK_2.0 2.2
cmdline_stdin_new@DPDK_2.0 2.2
cmdline_token_etheraddr_ops@DPDK_2.0 2.2
cmdline_token_ipaddr_ops@DPDK_2.0 2.2
cmdline_token_num_ops@DPDK_2.0 2.2
cmdline_token_portlist_ops@DPDK_2.0 2.2
cmdline_token_string_ops@DPDK_2.0 2.2
cmdline_write_char@DPDK_2.0 2.2
devargs_list@DPDK_2.0 2.2
eal_parse_sysfs_value@DPDK_2.0 2.2
eal_timer_source@DPDK_2.0 2.2
eth_dev_null_create@DPDK_2.2 2.2
lcore_config@DPDK_2.0 2.2
pci_device_list@DPDK_2.0 2.2
pci_driver_list@DPDK_2.0 2.2
per_lcore__lcore_id@DPDK_2.0 2.2
per_lcore__rte_errno@DPDK_2.0 2.2
rdline_add_history@DPDK_2.0 2.2
rdline_char_in@DPDK_2.0 2.2
rdline_clear_history@DPDK_2.0 2.2
rdline_get_buffer@DPDK_2.0 2.2
rdline_get_history_item@DPDK_2.0 2.2
rdline_init@DPDK_2.0 2.2
rdline_newline@DPDK_2.0 2.2
rdline_quit@DPDK_2.0 2.2
rdline_redisplay@DPDK_2.0 2.2
rdline_reset@DPDK_2.0 2.2
rdline_restart@DPDK_2.0 2.2
rdline_stop@DPDK_2.0 2.2
rte_acl_add_rules@DPDK_2.0 2.2
rte_acl_build@DPDK_2.0 2.2
rte_acl_classify@DPDK_2.0 2.2
rte_acl_classify_alg@DPDK_2.0 2.2
rte_acl_classify_scalar@DPDK_2.0 2.2
rte_acl_create@DPDK_2.0 2.2
rte_acl_dump@DPDK_2.0 2.2
rte_acl_find_existing@DPDK_2.0 2.2
rte_acl_free@DPDK_2.0 2.2
rte_acl_list_dump@DPDK_2.0 2.2
rte_acl_reset@DPDK_2.0 2.2
rte_acl_reset_rules@DPDK_2.0 2.2
rte_acl_set_ctx_classify@DPDK_2.0 2.2
rte_approx@DPDK_2.0 2.2
rte_calloc@DPDK_2.0 2.2
rte_calloc_socket@DPDK_2.0 2.2
rte_cfgfile_close@DPDK_2.0 2.2
rte_cfgfile_get_entry@DPDK_2.0 2.2
rte_cfgfile_has_entry@DPDK_2.0 2.2
rte_cfgfile_has_section@DPDK_2.0 2.2
rte_cfgfile_load@DPDK_2.0 2.2
rte_cfgfile_num_sections@DPDK_2.0 2.2
rte_cfgfile_section_entries@DPDK_2.0 2.2
rte_cfgfile_section_num_entries@DPDK_2.0 2.2
rte_cfgfile_sections@DPDK_2.0 2.2
rte_cpu_check_supported@DPDK_2.0 2.2
rte_cryptodev_callback_register@DPDK_2.2 2.2
rte_cryptodev_callback_unregister@DPDK_2.2 2.2
rte_cryptodev_close@DPDK_2.2 2.2
rte_cryptodev_configure@DPDK_2.2 2.2
rte_cryptodev_count@DPDK_2.2 2.2
rte_cryptodev_count_devtype@DPDK_2.2 2.2
rte_cryptodev_create_vdev@DPDK_2.2 2.2
rte_cryptodev_get_dev_id@DPDK_2.2 2.2
rte_cryptodev_info_get@DPDK_2.2 2.2
rte_cryptodev_pmd_allocate@DPDK_2.2 2.2
rte_cryptodev_pmd_callback_process@DPDK_2.2 2.2
rte_cryptodev_pmd_driver_register@DPDK_2.2 2.2
rte_cryptodev_pmd_release_device@DPDK_2.2 2.2
rte_cryptodev_pmd_virtual_dev_init@DPDK_2.2 2.2
rte_cryptodev_queue_pair_count@DPDK_2.2 2.2
rte_cryptodev_queue_pair_setup@DPDK_2.2 2.2
rte_cryptodev_queue_pair_start@DPDK_2.2 2.2
rte_cryptodev_queue_pair_stop@DPDK_2.2 2.2
rte_cryptodev_session_create@DPDK_2.2 2.2
rte_cryptodev_session_free@DPDK_2.2 2.2
rte_cryptodev_socket_id@DPDK_2.2 2.2
rte_cryptodev_start@DPDK_2.2 2.2
rte_cryptodev_stats_get@DPDK_2.2 2.2
rte_cryptodev_stats_reset@DPDK_2.2 2.2
rte_cryptodev_stop@DPDK_2.2 2.2
rte_cryptodevs@DPDK_2.2 2.2
rte_ctrlmbuf_init@DPDK_2.0 2.2
rte_cycles_vmware_tsc_map@DPDK_2.0 2.2
rte_delay_us@DPDK_2.0 2.2
rte_distributor_clear_returns@DPDK_2.0 2.2
rte_distributor_create@DPDK_2.0 2.2
rte_distributor_flush@DPDK_2.0 2.2
rte_distributor_get_pkt@DPDK_2.0 2.2
rte_distributor_poll_pkt@DPDK_2.0 2.2
rte_distributor_process@DPDK_2.0 2.2
rte_distributor_request_pkt@DPDK_2.0 2.2
rte_distributor_return_pkt@DPDK_2.0 2.2
rte_distributor_returned_pkts@DPDK_2.0 2.2
rte_dom0_mempool_create@DPDK_2.0 2.2
rte_dump_physmem_layout@DPDK_2.0 2.2
rte_dump_registers@DPDK_2.0 2.2
rte_dump_stack@DPDK_2.0 2.2
rte_dump_tailq@DPDK_2.0 2.2
rte_eal_alarm_cancel@DPDK_2.0 2.2
rte_eal_alarm_set@DPDK_2.0 2.2
rte_eal_dev_init@DPDK_2.0 2.2
rte_eal_devargs_add@DPDK_2.0 2.2
rte_eal_devargs_dump@DPDK_2.0 2.2
rte_eal_devargs_type_count@DPDK_2.0 2.2
rte_eal_driver_register@DPDK_2.0 2.2
rte_eal_driver_unregister@DPDK_2.0 2.2
rte_eal_get_configuration@DPDK_2.0 2.2
rte_eal_get_lcore_state@DPDK_2.0 2.2
rte_eal_get_physmem_layout@DPDK_2.0 2.2
rte_eal_get_physmem_size@DPDK_2.0 2.2
rte_eal_has_hugepages@DPDK_2.0 2.2
rte_eal_init@DPDK_2.0 2.2
rte_eal_iopl_init@DPDK_2.0 2.2
rte_eal_lcore_role@DPDK_2.0 2.2
rte_eal_mp_remote_launch@DPDK_2.0 2.2
rte_eal_mp_wait_lcore@DPDK_2.0 2.2
rte_eal_parse_devargs_str@DPDK_2.0 2.2
rte_eal_pci_detach@DPDK_2.1 2.2
rte_eal_pci_dump@DPDK_2.0 2.2
rte_eal_pci_probe@DPDK_2.0 2.2
rte_eal_pci_probe_one@DPDK_2.0 2.2
rte_eal_pci_read_config@DPDK_2.1 2.2
rte_eal_pci_register@DPDK_2.0 2.2
rte_eal_pci_scan@DPDK_2.0 2.2
rte_eal_pci_unregister@DPDK_2.0 2.2
rte_eal_pci_write_config@DPDK_2.1 2.2
rte_eal_process_type@DPDK_2.0 2.2
rte_eal_remote_launch@DPDK_2.0 2.2
rte_eal_tailq_lookup@DPDK_2.0 2.2
rte_eal_tailq_register@DPDK_2.0 2.2
rte_eal_vdev_init@DPDK_2.0 2.2
rte_eal_vdev_uninit@DPDK_2.0 2.2
rte_eal_wait_lcore@DPDK_2.0 2.2
rte_epoll_ctl@DPDK_2.1 2.2
rte_epoll_wait@DPDK_2.1 2.2
rte_eth_add_rx_callback@DPDK_2.2 2.2
rte_eth_add_tx_callback@DPDK_2.2 2.2
rte_eth_allmulticast_disable@DPDK_2.2 2.2
rte_eth_allmulticast_enable@DPDK_2.2 2.2
rte_eth_allmulticast_get@DPDK_2.2 2.2
rte_eth_bond_8023ad_conf_get@DPDK_2.0 2.2
rte_eth_bond_8023ad_setup@DPDK_2.0 2.2
rte_eth_bond_active_slaves_get@DPDK_2.0 2.2
rte_eth_bond_create@DPDK_2.0 2.2
rte_eth_bond_free@DPDK_2.1 2.2
rte_eth_bond_link_monitoring_set@DPDK_2.0 2.2
rte_eth_bond_mac_address_reset@DPDK_2.0 2.2
rte_eth_bond_mac_address_set@DPDK_2.0 2.2
rte_eth_bond_mode_get@DPDK_2.0 2.2
rte_eth_bond_mode_set@DPDK_2.0 2.2
rte_eth_bond_primary_get@DPDK_2.0 2.2
rte_eth_bond_primary_set@DPDK_2.0 2.2
rte_eth_bond_slave_add@DPDK_2.0 2.2
rte_eth_bond_slave_remove@DPDK_2.0 2.2
rte_eth_bond_slaves_get@DPDK_2.0 2.2
rte_eth_bond_xmit_policy_get@DPDK_2.0 2.2
rte_eth_bond_xmit_policy_set@DPDK_2.0 2.2
rte_eth_copy_pci_info@DPDK_2.2 2.2
rte_eth_dev_allocate@DPDK_2.2 2.2
rte_eth_dev_allocated@DPDK_2.2 2.2
rte_eth_dev_attach@DPDK_2.2 2.2
rte_eth_dev_callback_register@DPDK_2.2 2.2
rte_eth_dev_callback_unregister@DPDK_2.2 2.2
rte_eth_dev_close@DPDK_2.2 2.2
rte_eth_dev_configure@DPDK_2.2 2.2
rte_eth_dev_count@DPDK_2.2 2.2
rte_eth_dev_default_mac_addr_set@DPDK_2.2 2.2
rte_eth_dev_detach@DPDK_2.2 2.2
rte_eth_dev_filter_ctrl@DPDK_2.2 2.2
rte_eth_dev_filter_supported@DPDK_2.2 2.2
rte_eth_dev_flow_ctrl_get@DPDK_2.2 2.2
rte_eth_dev_flow_ctrl_set@DPDK_2.2 2.2
rte_eth_dev_get_dcb_info@DPDK_2.2 2.2
rte_eth_dev_get_eeprom@DPDK_2.2 2.2
rte_eth_dev_get_eeprom_length@DPDK_2.2 2.2
rte_eth_dev_get_mtu@DPDK_2.2 2.2
rte_eth_dev_get_reg_info@DPDK_2.2 2.2
rte_eth_dev_get_reg_length@DPDK_2.2 2.2
rte_eth_dev_get_vlan_offload@DPDK_2.2 2.2
rte_eth_dev_info_get@DPDK_2.2 2.2
rte_eth_dev_is_valid_port@DPDK_2.2 2.2
rte_eth_dev_mac_addr_add@DPDK_2.2 2.2
rte_eth_dev_mac_addr_remove@DPDK_2.2 2.2
rte_eth_dev_priority_flow_ctrl_set@DPDK_2.2 2.2
rte_eth_dev_release_port@DPDK_2.2 2.2
rte_eth_dev_rss_hash_conf_get@DPDK_2.2 2.2
rte_eth_dev_rss_hash_update@DPDK_2.2 2.2
rte_eth_dev_rss_reta_query@DPDK_2.2 2.2
rte_eth_dev_rss_reta_update@DPDK_2.2 2.2
rte_eth_dev_rx_intr_ctl@DPDK_2.2 2.2
rte_eth_dev_rx_intr_ctl_q@DPDK_2.2 2.2
rte_eth_dev_rx_intr_disable@DPDK_2.2 2.2
rte_eth_dev_rx_intr_enable@DPDK_2.2 2.2
rte_eth_dev_rx_queue_start@DPDK_2.2 2.2
rte_eth_dev_rx_queue_stop@DPDK_2.2 2.2
rte_eth_dev_set_eeprom@DPDK_2.2 2.2
rte_eth_dev_set_link_down@DPDK_2.2 2.2
rte_eth_dev_set_link_up@DPDK_2.2 2.2
rte_eth_dev_set_mc_addr_list@DPDK_2.2 2.2
rte_eth_dev_set_mtu@DPDK_2.2 2.2
rte_eth_dev_set_rx_queue_stats_mapping@DPDK_2.2 2.2
rte_eth_dev_set_tx_queue_stats_mapping@DPDK_2.2 2.2
rte_eth_dev_set_vf_rx@DPDK_2.2 2.2
rte_eth_dev_set_vf_rxmode@DPDK_2.2 2.2
rte_eth_dev_set_vf_tx@DPDK_2.2 2.2
rte_eth_dev_set_vf_vlan_filter@DPDK_2.2 2.2
rte_eth_dev_set_vlan_ether_type@DPDK_2.2 2.2
rte_eth_dev_set_vlan_offload@DPDK_2.2 2.2
rte_eth_dev_set_vlan_pvid@DPDK_2.2 2.2
rte_eth_dev_set_vlan_strip_on_queue@DPDK_2.2 2.2
rte_eth_dev_socket_id@DPDK_2.2 2.2
rte_eth_dev_start@DPDK_2.2 2.2
rte_eth_dev_stop@DPDK_2.2 2.2
rte_eth_dev_tx_queue_start@DPDK_2.2 2.2
rte_eth_dev_tx_queue_stop@DPDK_2.2 2.2
rte_eth_dev_uc_all_hash_table_set@DPDK_2.2 2.2
rte_eth_dev_uc_hash_table_set@DPDK_2.2 2.2
rte_eth_dev_udp_tunnel_add@DPDK_2.2 2.2
rte_eth_dev_udp_tunnel_delete@DPDK_2.2 2.2
rte_eth_dev_vlan_filter@DPDK_2.2 2.2
rte_eth_devices@DPDK_2.2 2.2
rte_eth_dma_zone_reserve@DPDK_2.2 2.2
rte_eth_driver_register@DPDK_2.2 2.2
rte_eth_from_ring@DPDK_2.2 2.2
rte_eth_from_rings@DPDK_2.0 2.2
rte_eth_led_off@DPDK_2.2 2.2
rte_eth_led_on@DPDK_2.2 2.2
rte_eth_link_get@DPDK_2.2 2.2
rte_eth_link_get_nowait@DPDK_2.2 2.2
rte_eth_macaddr_get@DPDK_2.2 2.2
rte_eth_mirror_rule_reset@DPDK_2.2 2.2
rte_eth_mirror_rule_set@DPDK_2.2 2.2
rte_eth_promiscuous_disable@DPDK_2.2 2.2
rte_eth_promiscuous_enable@DPDK_2.2 2.2
rte_eth_promiscuous_get@DPDK_2.2 2.2
rte_eth_remove_rx_callback@DPDK_2.2 2.2
rte_eth_remove_tx_callback@DPDK_2.2 2.2
rte_eth_rx_queue_info_get@DPDK_2.2 2.2
rte_eth_rx_queue_setup@DPDK_2.2 2.2
rte_eth_set_queue_rate_limit@DPDK_2.2 2.2
rte_eth_set_vf_rate_limit@DPDK_2.2 2.2
rte_eth_stats_get@DPDK_2.2 2.2
rte_eth_stats_reset@DPDK_2.2 2.2
rte_eth_timesync_adjust_time@DPDK_2.2 2.2
rte_eth_timesync_disable@DPDK_2.2 2.2
rte_eth_timesync_enable@DPDK_2.2 2.2
rte_eth_timesync_read_rx_timestamp@DPDK_2.2 2.2
rte_eth_timesync_read_time@DPDK_2.2 2.2
rte_eth_timesync_read_tx_timestamp@DPDK_2.2 2.2
rte_eth_timesync_write_time@DPDK_2.2 2.2
rte_eth_tx_queue_info_get@DPDK_2.2 2.2
rte_eth_tx_queue_setup@DPDK_2.2 2.2
rte_eth_xstats_get@DPDK_2.2 2.2
rte_eth_xstats_reset@DPDK_2.2 2.2
rte_exit@DPDK_2.0 2.2
rte_fbk_hash_create@DPDK_2.0 2.2
rte_fbk_hash_find_existing@DPDK_2.0 2.2
rte_fbk_hash_free@DPDK_2.0 2.2
rte_free@DPDK_2.0 2.2
rte_get_rx_ol_flag_name@DPDK_2.0 2.2
rte_get_tsc_hz@DPDK_2.0 2.2
rte_get_tx_ol_flag_name@DPDK_2.0 2.2
rte_hash_add_key@DPDK_2.0 2.2
rte_hash_add_key_data@DPDK_2.1 2.2
rte_hash_add_key_with_hash@DPDK_2.0 2.2
rte_hash_add_key_with_hash_data@DPDK_2.1 2.2
rte_hash_create@DPDK_2.0 2.2
rte_hash_del_key@DPDK_2.0 2.2
rte_hash_del_key_with_hash@DPDK_2.0 2.2
rte_hash_find_existing@DPDK_2.0 2.2
rte_hash_free@DPDK_2.0 2.2
rte_hash_hash@DPDK_2.0 2.2
rte_hash_iterate@DPDK_2.1 2.2
rte_hash_lookup@DPDK_2.0 2.2
rte_hash_lookup_bulk@DPDK_2.0 2.2
rte_hash_lookup_bulk_data@DPDK_2.1 2.2
rte_hash_lookup_data@DPDK_2.1 2.2
rte_hash_lookup_with_hash@DPDK_2.0 2.2
rte_hash_lookup_with_hash_data@DPDK_2.1 2.2
rte_hash_reset@DPDK_2.1 2.2
rte_hash_set_cmp_func@DPDK_2.2 2.2
rte_hexdump@DPDK_2.0 2.2
rte_intr_allow_others@DPDK_2.1 2.2
rte_intr_callback_register@DPDK_2.0 2.2
rte_intr_callback_unregister@DPDK_2.0 2.2
rte_intr_cap_multiple@DPDK_2.2 2.2
rte_intr_disable@DPDK_2.0 2.2
rte_intr_dp_is_en@DPDK_2.1 2.2
rte_intr_efd_disable@DPDK_2.1 2.2
rte_intr_efd_enable@DPDK_2.1 2.2
rte_intr_enable@DPDK_2.0 2.2
rte_intr_rx_ctl@DPDK_2.1 2.2
rte_intr_tls_epfd@DPDK_2.1 2.2
rte_ip_frag_free_death_row@DPDK_2.0 2.2
rte_ip_frag_table_create@DPDK_2.0 2.2
rte_ip_frag_table_statistics_dump@DPDK_2.0 2.2
rte_ipv4_frag_reassemble_packet@DPDK_2.0 2.2
rte_ipv4_fragment_packet@DPDK_2.0 2.2
rte_ipv6_frag_reassemble_packet@DPDK_2.0 2.2
rte_ipv6_fragment_packet@DPDK_2.0 2.2
rte_jobstats_context_finish@DPDK_2.0 2.2
rte_jobstats_context_init@DPDK_2.0 2.2
rte_jobstats_context_reset@DPDK_2.0 2.2
rte_jobstats_context_start@DPDK_2.0 2.2
rte_jobstats_finish@DPDK_2.0 2.2
rte_jobstats_init@DPDK_2.0 2.2
rte_jobstats_reset@DPDK_2.0 2.2
rte_jobstats_set_max@DPDK_2.0 2.2
rte_jobstats_set_min@DPDK_2.0 2.2
rte_jobstats_set_period@DPDK_2.0 2.2
rte_jobstats_set_target@DPDK_2.0 2.2
rte_jobstats_set_update_period_function@DPDK_2.0 2.2
rte_jobstats_start@DPDK_2.0 2.2
rte_keepalive_create@DPDK_2.2 2.2
rte_keepalive_dispatch_pings@DPDK_2.2 2.2
rte_keepalive_register_core@DPDK_2.2 2.2
rte_kvargs_count@DPDK_2.0 2.2
rte_kvargs_free@DPDK_2.0 2.2
rte_kvargs_parse@DPDK_2.0 2.2
rte_kvargs_process@DPDK_2.0 2.2
rte_log@DPDK_2.0 2.2
rte_log_add_in_history@DPDK_2.0 2.2
rte_log_cur_msg_loglevel@DPDK_2.0 2.2
rte_log_cur_msg_logtype@DPDK_2.0 2.2
rte_log_dump_history@DPDK_2.0 2.2
rte_log_set_history@DPDK_2.0 2.2
rte_logs@DPDK_2.0 2.2
rte_lpm6_add@DPDK_2.0 2.2
rte_lpm6_create@DPDK_2.0 2.2
rte_lpm6_delete@DPDK_2.0 2.2
rte_lpm6_delete_all@DPDK_2.0 2.2
rte_lpm6_delete_bulk_func@DPDK_2.0 2.2
rte_lpm6_find_existing@DPDK_2.0 2.2
rte_lpm6_free@DPDK_2.0 2.2
rte_lpm6_is_rule_present@DPDK_2.0 2.2
rte_lpm6_lookup@DPDK_2.0 2.2
rte_lpm6_lookup_bulk_func@DPDK_2.0 2.2
rte_lpm_add@DPDK_2.0 2.2
rte_lpm_create@DPDK_2.0 2.2
rte_lpm_delete@DPDK_2.0 2.2
rte_lpm_delete_all@DPDK_2.0 2.2
rte_lpm_find_existing@DPDK_2.0 2.2
rte_lpm_free@DPDK_2.0 2.2
rte_lpm_is_rule_present@DPDK_2.0 2.2
rte_malloc@DPDK_2.0 2.2
rte_malloc_dump_stats@DPDK_2.0 2.2
rte_malloc_get_socket_stats@DPDK_2.0 2.2
rte_malloc_set_limit@DPDK_2.0 2.2
rte_malloc_socket@DPDK_2.0 2.2
rte_malloc_validate@DPDK_2.0 2.2
rte_malloc_virt2phy@DPDK_2.0 2.2
rte_mbuf_sanity_check@DPDK_2.0 2.2
rte_mem_lock_page@DPDK_2.0 2.2
rte_mem_virt2phy@DPDK_2.0 2.2
rte_memdump@DPDK_2.0 2.2
rte_memory_get_nchannel@DPDK_2.0 2.2
rte_memory_get_nrank@DPDK_2.0 2.2
rte_mempool_audit@DPDK_2.0 2.2
rte_mempool_calc_obj_size@DPDK_2.0 2.2
rte_mempool_count@DPDK_2.0 2.2
rte_mempool_create@DPDK_2.0 2.2
rte_mempool_dump@DPDK_2.0 2.2
rte_mempool_gntalloc_create@DPDK_2.0 2.2
rte_mempool_list_dump@DPDK_2.0 2.2
rte_mempool_lookup@DPDK_2.0 2.2
rte_mempool_obj_iter@DPDK_2.0 2.2
rte_mempool_walk@DPDK_2.0 2.2
rte_mempool_xmem_create@DPDK_2.0 2.2
rte_mempool_xmem_size@DPDK_2.0 2.2
rte_mempool_xmem_usage@DPDK_2.0 2.2
rte_memzone_dump@DPDK_2.0 2.2
rte_memzone_free@DPDK_2.1 2.2
rte_memzone_lookup@DPDK_2.0 2.2
rte_memzone_reserve@DPDK_2.0 2.2
rte_memzone_reserve_aligned@DPDK_2.0 2.2
rte_memzone_reserve_bounded@DPDK_2.0 2.2
rte_memzone_walk@DPDK_2.0 2.2
rte_meter_srtcm_config@DPDK_2.0 2.2
rte_meter_trtcm_config@DPDK_2.0 2.2
rte_openlog_stream@DPDK_2.0 2.2
rte_pipeline_check@DPDK_2.0 2.2
rte_pipeline_create@DPDK_2.0 2.2
rte_pipeline_flush@DPDK_2.0 2.2
rte_pipeline_free@DPDK_2.0 2.2
rte_pipeline_port_in_connect_to_table@DPDK_2.0 2.2
rte_pipeline_port_in_create@DPDK_2.0 2.2
rte_pipeline_port_in_disable@DPDK_2.0 2.2
rte_pipeline_port_in_enable@DPDK_2.0 2.2
rte_pipeline_port_in_stats_read@DPDK_2.1 2.2
rte_pipeline_port_out_create@DPDK_2.0 2.2
rte_pipeline_port_out_packet_insert@DPDK_2.0 2.2
rte_pipeline_port_out_stats_read@DPDK_2.1 2.2
rte_pipeline_run@DPDK_2.0 2.2
rte_pipeline_table_create@DPDK_2.0 2.2
rte_pipeline_table_default_entry_add@DPDK_2.0 2.2
rte_pipeline_table_default_entry_delete@DPDK_2.0 2.2
rte_pipeline_table_entry_add@DPDK_2.0 2.2
rte_pipeline_table_entry_add_bulk@DPDK_2.2 2.2
rte_pipeline_table_entry_delete@DPDK_2.0 2.2
rte_pipeline_table_entry_delete_bulk@DPDK_2.2 2.2
rte_pipeline_table_stats_read@DPDK_2.1 2.2
rte_pktmbuf_dump@DPDK_2.0 2.2
rte_pktmbuf_init@DPDK_2.0 2.2
rte_pktmbuf_offload_pool_create@DPDK_2.2 2.2
rte_pktmbuf_pool_create@DPDK_2.1 2.2
rte_pktmbuf_pool_init@DPDK_2.0 2.2
rte_pmd_af_packet_devinit@DPDK_2.0 2.2
rte_port_ethdev_reader_ops@DPDK_2.0 2.2
rte_port_ethdev_writer_nodrop_ops@DPDK_2.1 2.2
rte_port_ethdev_writer_ops@DPDK_2.0 2.2
rte_port_ring_multi_reader_ops@DPDK_2.2 2.2
rte_port_ring_multi_writer_nodrop_ops@DPDK_2.2 2.2
rte_port_ring_multi_writer_ops@DPDK_2.2 2.2
rte_port_ring_reader_ipv4_frag_ops@DPDK_2.0 2.2
rte_port_ring_reader_ipv6_frag_ops@DPDK_2.1 2.2
rte_port_ring_reader_ops@DPDK_2.0 2.2
rte_port_ring_writer_ipv4_ras_ops@DPDK_2.0 2.2
rte_port_ring_writer_ipv6_ras_ops@DPDK_2.1 2.2
rte_port_ring_writer_nodrop_ops@DPDK_2.1 2.2
rte_port_ring_writer_ops@DPDK_2.0 2.2
rte_port_sched_reader_ops@DPDK_2.0 2.2
rte_port_sched_writer_ops@DPDK_2.0 2.2
rte_port_sink_ops@DPDK_2.0 2.2
rte_port_source_ops@DPDK_2.0 2.2
rte_power_exit@DPDK_2.0 2.2
rte_power_freq_down@DPDK_2.0 2.2
rte_power_freq_max@DPDK_2.0 2.2
rte_power_freq_min@DPDK_2.0 2.2
rte_power_freq_up@DPDK_2.0 2.2
rte_power_freqs@DPDK_2.0 2.2
rte_power_get_env@DPDK_2.0 2.2
rte_power_get_freq@DPDK_2.0 2.2
rte_power_init@DPDK_2.0 2.2
rte_power_set_env@DPDK_2.0 2.2
rte_power_set_freq@DPDK_2.0 2.2
rte_power_unset_env@DPDK_2.0 2.2
rte_realloc@DPDK_2.0 2.2
rte_red_config_init@DPDK_2.0 2.2
rte_red_log2_1_minus_Wq@DPDK_2.0 2.2
rte_red_pow2_frac_inv@DPDK_2.0 2.2
rte_red_rand_seed@DPDK_2.0 2.2
rte_red_rand_val@DPDK_2.0 2.2
rte_red_rt_data_init@DPDK_2.0 2.2
rte_reorder_create@DPDK_2.0 2.2
rte_reorder_drain@DPDK_2.0 2.2
rte_reorder_find_existing@DPDK_2.0 2.2
rte_reorder_free@DPDK_2.0 2.2
rte_reorder_init@DPDK_2.0 2.2
rte_reorder_insert@DPDK_2.0 2.2
rte_reorder_reset@DPDK_2.0 2.2
rte_ring_create@DPDK_2.0 2.2
rte_ring_dump@DPDK_2.0 2.2
rte_ring_free@DPDK_2.2 2.2
rte_ring_get_memsize@DPDK_2.0 2.2
rte_ring_init@DPDK_2.0 2.2
rte_ring_list_dump@DPDK_2.0 2.2
rte_ring_lookup@DPDK_2.0 2.2
rte_ring_set_water_mark@DPDK_2.0 2.2
rte_sched_pipe_config@DPDK_2.0 2.2
rte_sched_port_config@DPDK_2.0 2.2
rte_sched_port_dequeue@DPDK_2.0 2.2
rte_sched_port_enqueue@DPDK_2.0 2.2
rte_sched_port_free@DPDK_2.0 2.2
rte_sched_port_get_memory_footprint@DPDK_2.0 2.2
rte_sched_port_pkt_read_color@DPDK_2.1 2.2
rte_sched_port_pkt_read_tree_path@DPDK_2.1 2.2
rte_sched_port_pkt_write@DPDK_2.1 2.2
rte_sched_queue_read_stats@DPDK_2.0 2.2
rte_sched_subport_config@DPDK_2.0 2.2
rte_sched_subport_read_stats@DPDK_2.0 2.2
rte_set_application_usage_hook@DPDK_2.0 2.2
rte_set_log_level@DPDK_2.0 2.2
rte_set_log_type@DPDK_2.0 2.2
rte_socket_id@DPDK_2.0 2.2
rte_strerror@DPDK_2.0 2.2
rte_strsplit@DPDK_2.0 2.2
rte_sys_gettid@DPDK_2.0 2.2
rte_table_acl_ops@DPDK_2.0 2.2
rte_table_array_ops@DPDK_2.0 2.2
rte_table_hash_ext_ops@DPDK_2.0 2.2
rte_table_hash_key16_ext_dosig_ops@DPDK_2.2 2.2
rte_table_hash_key16_ext_ops@DPDK_2.0 2.2
rte_table_hash_key16_lru_ops@DPDK_2.0 2.2
rte_table_hash_key32_ext_ops@DPDK_2.0 2.2
rte_table_hash_key32_lru_ops@DPDK_2.0 2.2
rte_table_hash_key8_ext_dosig_ops@DPDK_2.0 2.2
rte_table_hash_key8_ext_ops@DPDK_2.0 2.2
rte_table_hash_key8_lru_dosig_ops@DPDK_2.0 2.2
rte_table_hash_key8_lru_ops@DPDK_2.0 2.2
rte_table_hash_lru_ops@DPDK_2.0 2.2
rte_table_lpm_ipv6_ops@DPDK_2.0 2.2
rte_table_lpm_ops@DPDK_2.0 2.2
rte_table_stub_ops@DPDK_2.0 2.2
rte_thread_get_affinity@DPDK_2.0 2.2
rte_thread_set_affinity@DPDK_2.0 2.2
rte_timer_dump_stats@DPDK_2.0 2.2
rte_timer_init@DPDK_2.0 2.2
rte_timer_manage@DPDK_2.0 2.2
rte_timer_pending@DPDK_2.0 2.2
rte_timer_reset@DPDK_2.0 2.2
rte_timer_reset_sync@DPDK_2.0 2.2
rte_timer_stop@DPDK_2.0 2.2
rte_timer_stop_sync@DPDK_2.0 2.2
rte_timer_subsystem_init@DPDK_2.0 2.2
rte_vhost_dequeue_burst@DPDK_2.0 2.2
rte_vhost_driver_callback_register@DPDK_2.0 2.2
rte_vhost_driver_register@DPDK_2.0 2.2
rte_vhost_driver_session_start@DPDK_2.0 2.2
rte_vhost_driver_unregister@DPDK_2.1 2.2
rte_vhost_enable_guest_notification@DPDK_2.0 2.2
rte_vhost_enqueue_burst@DPDK_2.0 2.2
rte_vhost_feature_disable@DPDK_2.0 2.2
rte_vhost_feature_enable@DPDK_2.0 2.2
rte_vhost_feature_get@DPDK_2.0 2.2
rte_vlog@DPDK_2.0 2.2
rte_zmalloc@DPDK_2.0 2.2
rte_zmalloc_socket@DPDK_2.0 2.2
vt100_init@DPDK_2.0 2.2
vt100_parser@DPDK_2.0 2.2

View File

@ -0,0 +1,44 @@
ubuntu-fix-doc-installpath.patch
ubuntu-combined-shared-lib-abiversion.patch
ubuntu-fix-library-linkage.patch
ubuntu-fix-testpmd-without-xen.patch
ubuntu-fix-lpm-use-after-free-and-leak.patch
ubuntu-backport-01-app-testpmd-handle-SIGINT-and-SIGTERM.patch
ubuntu-backport-02-examples-l3fwd-handle-SIGINT-and-SIGTERM.patch
ubuntu-backport-03-tools-fix-unbinding-failure-handling.patch
ubuntu-backport-04-tools-support-Python-3-in-bind-script.patch
ubuntu-backport-05-tools-support-binding-to-built-in-kernel-modules.patch
ubuntu-backport-06-eal-linux-support-built-in-kernel-modules.patch
ubuntu-backport-07-mempool-fix-leak-when-creation-fails.patch
ubuntu-backport-08-vhost-fix-leak-of-fds-and-mmaps.patch
ubuntu-backport-09-port-fix-crash-for-ring-writer-nodrop.patch
ubuntu-backport-10-port-fix-crash-for-ethdev-writer-nodrop.patch
ubuntu-backport-11-i40e-fix-overflow.patch
ubuntu-backport-12-i40e-fix-inverted-check-for-no-refcount.patch
ubuntu-backport-13-i40e-fix-VLAN-filtering.patch
ubuntu-backport-14-i40e-base-fix-missing-check-for-stopped-admin-queue.patch
ubuntu-backport-15-i40e-base-fix-driver-load-failure.patch
ubuntu-backport-16-fm10k-fix-VLAN-flag-in-scattered-Rx.patch
ubuntu-backport-17-pcap-fix-captured-frame-length.patch
ubuntu-backport-18-bonding-fix-detach-of-bonded-device.patch
ubuntu-backport-19-bonding-fix-detach-of-slave-devices.patch
ubuntu-backport-20-bonding-copy-entire-config-structure-in-mode-4.patch
ubuntu-backport-21-bonding-do-not-ignore-multicast-in-mode-4.patch
ubuntu-backport-22-bonding-fix-active-slaves-with-no-primary.patch
ubuntu-backport-23-bonding-do-not-activate-slave-twice.patch
ubuntu-backport-24-bonding-fix-crash-when-no-slave-device.patch
ubuntu-backport-25-virtio-fix-crash-in-statistics-functions.patch
ubuntu-backport-26-virtio-fix-descriptors-pointing-to-the-same-buffer.patch
ubuntu-backport-27-virtio-fix-restart.patch
ubuntu-backport-28-lpm-fix-allocation-of-an-existing-object.patch
ubuntu-backport-29-hash-fix-multi-process-support.patch
ubuntu-backport-30-hash-fix-allocation-of-an-existing-object.patch
ubuntu-backport-31-hash-fix-race-condition-at-creation.patch
ubuntu-backport-32-eal-fix-resource-leak.patch
ubuntu-backport-33-vhost-user-add-error-handling-for-fd-1023.patch
ubuntu-backport-34-port-fix-ring-writer-buffer-overflow.patch
ubuntu-backport-35-port-fix-burst-size-mask-type.patch
ubuntu-backport-36-pci-identify-devices-not-managed-by-any-kernel-drive.patch
ubuntu-backport-37-pci-ignore-devices-already-managed-in-Linux-when-map.patch
ubuntu-backport-38-dpdk-dev-Memory-leak-when-adding-removing-vhost_user-ports.patch
ubuntu-fix-vhost-user-socket-permission.patch

View File

@ -0,0 +1,146 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-20
From d3a274ce9dee28118b8647e0db72ef0f4b6a6323 Mon Sep 17 00:00:00 2001
From: Zhihong Wang <zhihong.wang@intel.com>
Date: Wed, 30 Dec 2015 16:59:49 -0500
Subject: [PATCH] app/testpmd: handle SIGINT and SIGTERM
Handle SIGINT and SIGTERM in testpmd.
Signed-off-by: Zhihong Wang <zhihong.wang@intel.com>
Acked-by: Michael Qiu <michael.qiu@intel.com>
---
app/test-pmd/cmdline.c | 20 +++++++++++++-------
app/test-pmd/testpmd.c | 39 +++++++++++++++++++++++++++++++++------
app/test-pmd/testpmd.h | 1 +
3 files changed, 47 insertions(+), 13 deletions(-)
Index: dpdk/app/test-pmd/cmdline.c
===================================================================
--- dpdk.orig/app/test-pmd/cmdline.c
+++ dpdk/app/test-pmd/cmdline.c
@@ -90,6 +90,8 @@
#include "testpmd.h"
+static struct cmdline *testpmd_cl;
+
static void cmd_reconfig_device_queue(portid_t id, uint8_t dev, uint8_t queue);
#ifdef RTE_NIC_BYPASS
@@ -9778,17 +9780,21 @@ cmdline_parse_ctx_t main_ctx[] = {
void
prompt(void)
{
- struct cmdline *cl;
-
/* initialize non-constant commands */
cmd_set_fwd_mode_init();
- cl = cmdline_stdin_new(main_ctx, "testpmd> ");
- if (cl == NULL) {
+ testpmd_cl = cmdline_stdin_new(main_ctx, "testpmd> ");
+ if (testpmd_cl == NULL)
return;
- }
- cmdline_interact(cl);
- cmdline_stdin_exit(cl);
+ cmdline_interact(testpmd_cl);
+ cmdline_stdin_exit(testpmd_cl);
+}
+
+void
+prompt_exit(void)
+{
+ if (testpmd_cl != NULL)
+ cmdline_quit(testpmd_cl);
}
static void
Index: dpdk/app/test-pmd/testpmd.c
===================================================================
--- dpdk.orig/app/test-pmd/testpmd.c
+++ dpdk/app/test-pmd/testpmd.c
@@ -1569,13 +1569,16 @@ pmd_test_exit(void)
if (test_done == 0)
stop_packet_forwarding();
- FOREACH_PORT(pt_id, ports) {
- printf("Stopping port %d...", pt_id);
- fflush(stdout);
- rte_eth_dev_close(pt_id);
- printf("done\n");
+ if (ports != NULL) {
+ no_link_check = 1;
+ FOREACH_PORT(pt_id, ports) {
+ printf("\nShutting down port %d...\n", pt_id);
+ fflush(stdout);
+ stop_port(pt_id);
+ close_port(pt_id);
+ }
}
- printf("bye...\n");
+ printf("\nBye...\n");
}
typedef void (*cmd_func_t)(void);
@@ -1983,12 +1986,35 @@ init_port(void)
ports[pid].enabled = 1;
}
+static void
+force_quit(void)
+{
+ pmd_test_exit();
+ prompt_exit();
+}
+
+static void
+signal_handler(int signum)
+{
+ if (signum == SIGINT || signum == SIGTERM) {
+ printf("\nSignal %d received, preparing to exit...\n",
+ signum);
+ force_quit();
+ /* exit with the expected status */
+ signal(signum, SIG_DFL);
+ kill(getpid(), signum);
+ }
+}
+
int
main(int argc, char** argv)
{
int diag;
uint8_t port_id;
+ signal(SIGINT, signal_handler);
+ signal(SIGTERM, signal_handler);
+
diag = rte_eal_init(argc, argv);
if (diag < 0)
rte_panic("Cannot init EAL\n");
@@ -2040,6 +2066,7 @@ main(int argc, char** argv)
start_packet_forwarding(0);
printf("Press enter to exit\n");
rc = read(0, &c, 1);
+ pmd_test_exit();
if (rc < 0)
return 1;
}
Index: dpdk/app/test-pmd/testpmd.h
===================================================================
--- dpdk.orig/app/test-pmd/testpmd.h
+++ dpdk/app/test-pmd/testpmd.h
@@ -462,6 +462,7 @@ unsigned int parse_item_list(char* str,
unsigned int *parsed_items, int check_unique_values);
void launch_args_parse(int argc, char** argv);
void prompt(void);
+void prompt_exit(void);
void nic_stats_display(portid_t port_id);
void nic_stats_clear(portid_t port_id);
void nic_xstats_display(portid_t port_id);

View File

@ -0,0 +1,134 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-20
From 308df2bfba3d238fc1d2d16cc10c84681803b408 Mon Sep 17 00:00:00 2001
From: Zhihong Wang <zhihong.wang@intel.com>
Date: Wed, 30 Dec 2015 16:59:51 -0500
Subject: [PATCH] examples/l3fwd: handle SIGINT and SIGTERM
Handle SIGINT and SIGTERM in l3fwd.
Signed-off-by: Zhihong Wang <zhihong.wang@intel.com>
Acked-by: Michael Qiu <michael.qiu@intel.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
---
examples/l3fwd/main.c | 46 ++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 42 insertions(+), 4 deletions(-)
diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
index 5b0c2dd..21a5782 100644
--- a/examples/l3fwd/main.c
+++ b/examples/l3fwd/main.c
@@ -41,6 +41,8 @@
#include <stdarg.h>
#include <errno.h>
#include <getopt.h>
+#include <signal.h>
+#include <stdbool.h>
#include <rte_common.h>
#include <rte_vect.h>
@@ -75,6 +77,8 @@
#include <cmdline_parse.h>
#include <cmdline_parse_etheraddr.h>
+static volatile bool force_quit;
+
#define APP_LOOKUP_EXACT_MATCH 0
#define APP_LOOKUP_LPM 1
#define DO_RFC_1812_CHECKS
@@ -1553,7 +1557,7 @@ main_loop(__attribute__((unused)) void *dummy)
portid, queueid);
}
- while (1) {
+ while (!force_quit) {
cur_tsc = rte_rdtsc();
@@ -1781,6 +1785,8 @@ main_loop(__attribute__((unused)) void *dummy)
}
}
+
+ return 0;
}
static int
@@ -2516,8 +2522,12 @@ check_all_ports_link_status(uint8_t port_num, uint32_t port_mask)
printf("\nChecking link status");
fflush(stdout);
for (count = 0; count <= MAX_CHECK_TIME; count++) {
+ if (force_quit)
+ return;
all_ports_up = 1;
for (portid = 0; portid < port_num; portid++) {
+ if (force_quit)
+ return;
if ((port_mask & (1 << portid)) == 0)
continue;
memset(&link, 0, sizeof(link));
@@ -2559,6 +2569,16 @@ check_all_ports_link_status(uint8_t port_num, uint32_t port_mask)
}
}
+static void
+signal_handler(int signum)
+{
+ if (signum == SIGINT || signum == SIGTERM) {
+ printf("\n\nSignal %d received, preparing to exit...\n",
+ signum);
+ force_quit = true;
+ }
+}
+
int
main(int argc, char **argv)
{
@@ -2579,6 +2599,10 @@ main(int argc, char **argv)
argc -= ret;
argv += ret;
+ force_quit = false;
+ signal(SIGINT, signal_handler);
+ signal(SIGTERM, signal_handler);
+
/* pre-init dst MACs for all ports to 02:00:00:00:00:xx */
for (portid = 0; portid < RTE_MAX_ETHPORTS; portid++) {
dest_eth_addr[portid] = ETHER_LOCAL_ADMIN_ADDR + ((uint64_t)portid << 40);
@@ -2733,12 +2757,26 @@ main(int argc, char **argv)
check_all_ports_link_status((uint8_t)nb_ports, enabled_port_mask);
+ ret = 0;
/* launch per-lcore init on every lcore */
rte_eal_mp_remote_launch(main_loop, NULL, CALL_MASTER);
RTE_LCORE_FOREACH_SLAVE(lcore_id) {
- if (rte_eal_wait_lcore(lcore_id) < 0)
- return -1;
+ if (rte_eal_wait_lcore(lcore_id) < 0) {
+ ret = -1;
+ break;
+ }
}
- return 0;
+ /* stop ports */
+ for (portid = 0; portid < nb_ports; portid++) {
+ if ((enabled_port_mask & (1 << portid)) == 0)
+ continue;
+ printf("Closing port %d...", portid);
+ rte_eth_dev_stop(portid);
+ rte_eth_dev_close(portid);
+ printf(" Done\n");
+ }
+ printf("Bye...\n");
+
+ return ret;
}
--
2.7.3

View File

@ -0,0 +1,35 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-20
From da82ee17e6ea99bf2931383ac33b0caccaaaefce Mon Sep 17 00:00:00 2001
From: Jeff Shaw <jeffrey.b.shaw@intel.com>
Date: Mon, 8 Feb 2016 16:33:46 -0800
Subject: [PATCH] tools: fix unbinding failure handling
We should call sys.exit(), not divide sys by exit().
Signed-off-by: Jeff Shaw <jeffrey.b.shaw@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---
tools/dpdk_nic_bind.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/dpdk_nic_bind.py b/tools/dpdk_nic_bind.py
index f02454e..a1923c5 100755
--- a/tools/dpdk_nic_bind.py
+++ b/tools/dpdk_nic_bind.py
@@ -317,7 +317,7 @@ def unbind_one(dev_id, force):
f = open(filename, "a")
except:
print "Error: unbind failed for %s - Cannot open %s" % (dev_id, filename)
- sys/exit(1)
+ sys.exit(1)
f.write(dev_id)
f.close()
--
2.7.3

View File

@ -0,0 +1,259 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-20
From 16c1814c802c205f6d3c32e3d3d10de9f87e7f22 Mon Sep 17 00:00:00 2001
From: Dawid Jurczak <dawid_jurek@vp.pl>
Date: Wed, 27 Jan 2016 20:59:44 +0100
Subject: [PATCH] tools: support Python 3 in bind script
This patch fixes syntax errors during binding ethernet device
on systems where Python 3 is default.
Backward compatibility with Python 2 is preserved.
Signed-off-by: Dawid Jurczak <dawid_jurek@vp.pl>
---
tools/dpdk_nic_bind.py | 74 +++++++++++++++++++++++++-------------------------
1 file changed, 37 insertions(+), 37 deletions(-)
diff --git a/tools/dpdk_nic_bind.py b/tools/dpdk_nic_bind.py
index a1923c5..dfefdae 100755
--- a/tools/dpdk_nic_bind.py
+++ b/tools/dpdk_nic_bind.py
@@ -54,7 +54,7 @@ args = []
def usage():
'''Print usage information for the program'''
argv0 = basename(sys.argv[0])
- print """
+ print ("""
Usage:
------
@@ -110,7 +110,7 @@ To unbind 0000:01:00.0 from using any driver
To bind 0000:02:00.0 and 0000:02:00.1 to the ixgbe kernel driver
%(argv0)s -b ixgbe 02:00.0 02:00.1
- """ % locals() # replace items from local variables
+ """ % locals()) # replace items from local variables
# This is roughly compatible with check_output function in subprocess module
# which is only available in python 2.7.
@@ -156,7 +156,7 @@ def check_modules():
'''Checks that igb_uio is loaded'''
global dpdk_drivers
- fd = file("/proc/modules")
+ fd = open("/proc/modules", 'r')
loaded_mods = fd.readlines()
fd.close()
@@ -176,10 +176,10 @@ def check_modules():
# check if we have at least one loaded module
if True not in [mod["Found"] for mod in mods] and b_flag is not None:
if b_flag in dpdk_drivers:
- print "Error - no supported modules(DPDK driver) are loaded"
+ print ("Error - no supported modules(DPDK driver) are loaded")
sys.exit(1)
else:
- print "Warning - no supported modules(DPDK driver) are loaded"
+ print ("Warning - no supported modules(DPDK driver) are loaded")
# change DPDK driver list to only contain drivers that are loaded
dpdk_drivers = [mod["Name"] for mod in mods if mod["Found"]]
@@ -198,7 +198,7 @@ def get_pci_device_details(dev_id):
for line in extra_info:
if len(line) == 0:
continue
- name, value = line.split("\t", 1)
+ name, value = line.decode().split("\t", 1)
name = name.strip(":") + "_str"
device[name] = value
# check for a unix interface name
@@ -234,7 +234,7 @@ def get_nic_details():
dev["Device"] = int(dev["Device"],16)
devices[dev["Slot"]] = dict(dev) # use dict to make copy of dev
else:
- name, value = dev_line.split("\t", 1)
+ name, value = dev_line.decode().split("\t", 1)
dev[name.rstrip(":")] = value
# check what is the interface if any for an ssh connection if
@@ -243,17 +243,17 @@ def get_nic_details():
route = check_output(["ip", "-o", "route"])
# filter out all lines for 169.254 routes
route = "\n".join(filter(lambda ln: not ln.startswith("169.254"),
- route.splitlines()))
+ route.decode().splitlines()))
rt_info = route.split()
- for i in xrange(len(rt_info) - 1):
+ for i in range(len(rt_info) - 1):
if rt_info[i] == "dev":
ssh_if.append(rt_info[i+1])
# based on the basic info, get extended text details
for d in devices.keys():
# get additional info and add it to existing data
- devices[d] = dict(devices[d].items() +
- get_pci_device_details(d).items())
+ devices[d] = devices[d].copy()
+ devices[d].update(get_pci_device_details(d).items())
for _if in ssh_if:
if _if in devices[d]["Interface"].split(","):
@@ -293,22 +293,22 @@ def dev_id_from_dev_name(dev_name):
if dev_name in devices[d]["Interface"].split(","):
return devices[d]["Slot"]
# if nothing else matches - error
- print "Unknown device: %s. " \
- "Please specify device in \"bus:slot.func\" format" % dev_name
+ print ("Unknown device: %s. " \
+ "Please specify device in \"bus:slot.func\" format" % dev_name)
sys.exit(1)
def unbind_one(dev_id, force):
'''Unbind the device identified by "dev_id" from its current driver'''
dev = devices[dev_id]
if not has_driver(dev_id):
- print "%s %s %s is not currently managed by any driver\n" % \
- (dev["Slot"], dev["Device_str"], dev["Interface"])
+ print ("%s %s %s is not currently managed by any driver\n" % \
+ (dev["Slot"], dev["Device_str"], dev["Interface"]))
return
# prevent us disconnecting ourselves
if dev["Ssh_if"] and not force:
- print "Routing table indicates that interface %s is active" \
- ". Skipping unbind" % (dev_id)
+ print ("Routing table indicates that interface %s is active" \
+ ". Skipping unbind" % (dev_id))
return
# write to /sys to unbind
@@ -316,7 +316,7 @@ def unbind_one(dev_id, force):
try:
f = open(filename, "a")
except:
- print "Error: unbind failed for %s - Cannot open %s" % (dev_id, filename)
+ print ("Error: unbind failed for %s - Cannot open %s" % (dev_id, filename))
sys.exit(1)
f.write(dev_id)
f.close()
@@ -329,14 +329,14 @@ def bind_one(dev_id, driver, force):
# prevent disconnection of our ssh session
if dev["Ssh_if"] and not force:
- print "Routing table indicates that interface %s is active" \
- ". Not modifying" % (dev_id)
+ print ("Routing table indicates that interface %s is active" \
+ ". Not modifying" % (dev_id))
return
# unbind any existing drivers we don't want
if has_driver(dev_id):
if dev["Driver_str"] == driver:
- print "%s already bound to driver %s, skipping\n" % (dev_id, driver)
+ print ("%s already bound to driver %s, skipping\n" % (dev_id, driver))
return
else:
saved_driver = dev["Driver_str"]
@@ -349,14 +349,14 @@ def bind_one(dev_id, driver, force):
try:
f = open(filename, "w")
except:
- print "Error: bind failed for %s - Cannot open %s" % (dev_id, filename)
+ print ("Error: bind failed for %s - Cannot open %s" % (dev_id, filename))
return
try:
f.write("%04x %04x" % (dev["Vendor"], dev["Device"]))
f.close()
except:
- print "Error: bind failed for %s - Cannot write new PCI ID to " \
- "driver %s" % (dev_id, driver)
+ print ("Error: bind failed for %s - Cannot write new PCI ID to " \
+ "driver %s" % (dev_id, driver))
return
# do the bind by writing to /sys
@@ -364,7 +364,7 @@ def bind_one(dev_id, driver, force):
try:
f = open(filename, "a")
except:
- print "Error: bind failed for %s - Cannot open %s" % (dev_id, filename)
+ print ("Error: bind failed for %s - Cannot open %s" % (dev_id, filename))
if saved_driver is not None: # restore any previous driver
bind_one(dev_id, saved_driver, force)
return
@@ -378,7 +378,7 @@ def bind_one(dev_id, driver, force):
tmp = get_pci_device_details(dev_id)
if "Driver_str" in tmp and tmp["Driver_str"] == driver:
return
- print "Error: bind failed for %s - Cannot bind to driver %s" % (dev_id, driver)
+ print ("Error: bind failed for %s - Cannot bind to driver %s" % (dev_id, driver))
if saved_driver is not None: # restore any previous driver
bind_one(dev_id, saved_driver, force)
return
@@ -423,8 +423,8 @@ def display_devices(title, dev_list, extra_params = None):
%()s fields in it for replacement by the named fields in each device's
dictionary.'''
strings = [] # this holds the strings to print. We sort before printing
- print "\n%s" % title
- print "="*len(title)
+ print ("\n%s" % title)
+ print ("="*len(title))
if len(dev_list) == 0:
strings.append("<none>")
else:
@@ -436,7 +436,7 @@ def display_devices(title, dev_list, extra_params = None):
strings.append("%s '%s'" % (dev["Slot"], dev["Device_str"]))
# sort before printing, so that the entries appear in PCI order
strings.sort()
- print "\n".join(strings) # print one per line
+ print ("\n".join(strings)) # print one per line
def show_status():
'''Function called when the script is passed the "--status" option. Displays
@@ -480,9 +480,9 @@ def parse_args():
opts, args = getopt.getopt(sys.argv[1:], "b:us",
["help", "usage", "status", "force",
"bind=", "unbind"])
- except getopt.GetoptError, error:
- print str(error)
- print "Run '%s --usage' for further information" % sys.argv[0]
+ except (getopt.GetoptError, error):
+ print (str(error))
+ print ("Run '%s --usage' for further information" % sys.argv[0])
sys.exit(1)
for opt, arg in opts:
@@ -495,7 +495,7 @@ def parse_args():
force_flag = True
if opt == "-b" or opt == "-u" or opt == "--bind" or opt == "--unbind":
if b_flag is not None:
- print "Error - Only one bind or unbind may be specified\n"
+ print ("Error - Only one bind or unbind may be specified\n")
sys.exit(1)
if opt == "-u" or opt == "--unbind":
b_flag = "none"
@@ -510,13 +510,13 @@ def do_arg_actions():
global args
if b_flag is None and not status_flag:
- print "Error: No action specified for devices. Please give a -b or -u option"
- print "Run '%s --usage' for further information" % sys.argv[0]
+ print ("Error: No action specified for devices. Please give a -b or -u option")
+ print ("Run '%s --usage' for further information" % sys.argv[0])
sys.exit(1)
if b_flag is not None and len(args) == 0:
- print "Error: No devices specified."
- print "Run '%s --usage' for further information" % sys.argv[0]
+ print ("Error: No devices specified.")
+ print ("Run '%s --usage' for further information" % sys.argv[0])
sys.exit(1)
if b_flag == "none" or b_flag == "None":
--
2.7.3

View File

@ -0,0 +1,75 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-20
From bb9f408550d13af6c1da104b0d9d9b9837f69bde Mon Sep 17 00:00:00 2001
From: Kamil Rytarowski <kamil.rytarowski@caviumnetworks.com>
Date: Thu, 28 Jan 2016 14:13:53 +0100
Subject: [PATCH] tools: support binding to built-in kernel modules
Currently dpdk_nic_bind.py detects Linux kernel modules via reading
/proc/modules. Built-in ones aren't listed there and therefore they are
not being found by the script.
Add support for checking built-in modules with parsing the sysfs files.
This commit obsoletes the /proc/modules parsing approach.
Signed-off-by: Kamil Rytarowski <kamil.rytarowski@caviumnetworks.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
---
tools/dpdk_nic_bind.py | 30 ++++++++++++++++++++----------
1 file changed, 20 insertions(+), 10 deletions(-)
diff --git a/tools/dpdk_nic_bind.py b/tools/dpdk_nic_bind.py
index dfefdae..14c5311 100755
--- a/tools/dpdk_nic_bind.py
+++ b/tools/dpdk_nic_bind.py
@@ -156,22 +156,32 @@ def check_modules():
'''Checks that igb_uio is loaded'''
global dpdk_drivers
- fd = open("/proc/modules", 'r')
- loaded_mods = fd.readlines()
- fd.close()
-
# list of supported modules
mods = [{"Name" : driver, "Found" : False} for driver in dpdk_drivers]
# first check if module is loaded
- for line in loaded_mods:
+ try:
+ # Get list of sysfs modules (both built-in and dynamically loaded)
+ sysfs_path = '/sys/module/'
+
+ # Get the list of directories in sysfs_path
+ sysfs_mods = [os.path.join(sysfs_path, o) for o
+ in os.listdir(sysfs_path)
+ if os.path.isdir(os.path.join(sysfs_path, o))]
+
+ # Extract the last element of '/sys/module/abc' in the array
+ sysfs_mods = [a.split('/')[-1] for a in sysfs_mods]
+
+ # special case for vfio_pci (module is named vfio-pci,
+ # but its .ko is named vfio_pci)
+ sysfs_mods = map(lambda a:
+ a if a != 'vfio_pci' else 'vfio-pci', sysfs_mods)
+
for mod in mods:
- if line.startswith(mod["Name"]):
- mod["Found"] = True
- # special case for vfio_pci (module is named vfio-pci,
- # but its .ko is named vfio_pci)
- elif line.replace("_", "-").startswith(mod["Name"]):
+ if mod["Name"] in sysfs_mods:
mod["Found"] = True
+ except:
+ pass
# check if we have at least one loaded module
if True not in [mod["Found"] for mod in mods] and b_flag is not None:
--
2.7.3

View File

@ -0,0 +1,89 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-20
From 6e7caa1ad9d597fed0a49468af25ae6e68b8c443 Mon Sep 17 00:00:00 2001
From: Kamil Rytarowski <kamil.rytarowski@caviumnetworks.com>
Date: Thu, 28 Jan 2016 14:13:54 +0100
Subject: [PATCH] eal/linux: support built-in kernel modules
Currently rte_eal_check_module() detects Linux kernel modules via reading
/proc/modules. Built-in ones aren't listed there and therefore they are not
being found.
Add support for checking built-in modules with parsing the sysfs files
This commit obsoletes the /proc/modules parsing approach.
Signed-off-by: Kamil Rytarowski <kamil.rytarowski@caviumnetworks.com>
Acked-by: David Marchand <david.marchand@6wind.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
---
lib/librte_eal/linuxapp/eal/eal.c | 35 +++++++++++++++++++++--------------
1 file changed, 21 insertions(+), 14 deletions(-)
diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c
index 635ec36..4d3e0de 100644
--- a/lib/librte_eal/linuxapp/eal/eal.c
+++ b/lib/librte_eal/linuxapp/eal/eal.c
@@ -49,6 +49,7 @@
#include <errno.h>
#include <sys/mman.h>
#include <sys/queue.h>
+#include <sys/stat.h>
#if defined(RTE_ARCH_X86_64) || defined(RTE_ARCH_I686)
#include <sys/io.h>
#endif
@@ -901,27 +902,33 @@ int rte_eal_has_hugepages(void)
int
rte_eal_check_module(const char *module_name)
{
- char mod_name[30]; /* Any module names can be longer than 30 bytes? */
- int ret = 0;
+ char sysfs_mod_name[PATH_MAX];
+ struct stat st;
int n;
if (NULL == module_name)
return -1;
- FILE *fd = fopen("/proc/modules", "r");
- if (NULL == fd) {
- RTE_LOG(ERR, EAL, "Open /proc/modules failed!"
- " error %i (%s)\n", errno, strerror(errno));
+ /* Check if there is sysfs mounted */
+ if (stat("/sys/module", &st) != 0) {
+ RTE_LOG(DEBUG, EAL, "sysfs is not mounted! error %i (%s)\n",
+ errno, strerror(errno));
return -1;
}
- while (!feof(fd)) {
- n = fscanf(fd, "%29s %*[^\n]", mod_name);
- if ((n == 1) && !strcmp(mod_name, module_name)) {
- ret = 1;
- break;
- }
+
+ /* A module might be built-in, therefore try sysfs */
+ n = snprintf(sysfs_mod_name, PATH_MAX, "/sys/module/%s", module_name);
+ if (n < 0 || n > PATH_MAX) {
+ RTE_LOG(DEBUG, EAL, "Could not format module path\n");
+ return -1;
}
- fclose(fd);
- return ret;
+ if (stat(sysfs_mod_name, &st) != 0) {
+ RTE_LOG(DEBUG, EAL, "Module %s not found! error %i (%s)\n",
+ sysfs_mod_name, errno, strerror(errno));
+ return 0;
+ }
+
+ /* Module has been found */
+ return 1;
}
--
2.7.3

View File

@ -0,0 +1,95 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-20
From 86f36ff9578b5f3d697c8fcf6072dcb70e2b246f Mon Sep 17 00:00:00 2001
From: Olivier Matz <olivier.matz@6wind.com>
Date: Tue, 16 Feb 2016 15:40:10 +0100
Subject: [PATCH] mempool: fix leak when creation fails
Since commits ff909fe21f and 4e32101f9b, it is now possible to free
memzones and rings.
The rte_mempool_create() should be modified to take advantage of this
and not leak memory when an allocation fails.
Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
---
lib/librte_mempool/rte_mempool.c | 28 +++++++++++++---------------
1 file changed, 13 insertions(+), 15 deletions(-)
diff --git a/lib/librte_mempool/rte_mempool.c b/lib/librte_mempool/rte_mempool.c
index aff5f6d..f8781e1 100644
--- a/lib/librte_mempool/rte_mempool.c
+++ b/lib/librte_mempool/rte_mempool.c
@@ -438,8 +438,8 @@ rte_mempool_xmem_create(const char *name, unsigned n, unsigned elt_size,
char rg_name[RTE_RING_NAMESIZE];
struct rte_mempool_list *mempool_list;
struct rte_mempool *mp = NULL;
- struct rte_tailq_entry *te;
- struct rte_ring *r;
+ struct rte_tailq_entry *te = NULL;
+ struct rte_ring *r = NULL;
const struct rte_memzone *mz;
size_t mempool_size;
int mz_flags = RTE_MEMZONE_1GB|RTE_MEMZONE_SIZE_HINT_ONLY;
@@ -511,7 +511,7 @@ rte_mempool_xmem_create(const char *name, unsigned n, unsigned elt_size,
snprintf(rg_name, sizeof(rg_name), RTE_MEMPOOL_MZ_FORMAT, name);
r = rte_ring_create(rg_name, rte_align32pow2(n+1), socket_id, rg_flags);
if (r == NULL)
- goto exit;
+ goto exit_unlock;
/*
* reserve a memory zone for this mempool: private data is
@@ -536,7 +536,7 @@ rte_mempool_xmem_create(const char *name, unsigned n, unsigned elt_size,
te = rte_zmalloc("MEMPOOL_TAILQ_ENTRY", sizeof(*te), 0);
if (te == NULL) {
RTE_LOG(ERR, MEMPOOL, "Cannot allocate tailq entry!\n");
- goto exit;
+ goto exit_unlock;
}
/*
@@ -561,15 +561,8 @@ rte_mempool_xmem_create(const char *name, unsigned n, unsigned elt_size,
snprintf(mz_name, sizeof(mz_name), RTE_MEMPOOL_MZ_FORMAT, name);
mz = rte_memzone_reserve(mz_name, mempool_size, socket_id, mz_flags);
-
- /*
- * no more memory: in this case we loose previously reserved
- * space for the ring as we cannot free it
- */
- if (mz == NULL) {
- rte_free(te);
- goto exit;
- }
+ if (mz == NULL)
+ goto exit_unlock;
if (rte_eal_has_hugepages()) {
startaddr = (void*)mz->addr;
@@ -633,11 +626,16 @@ rte_mempool_xmem_create(const char *name, unsigned n, unsigned elt_size,
rte_rwlock_write_lock(RTE_EAL_TAILQ_RWLOCK);
TAILQ_INSERT_TAIL(mempool_list, te, next);
rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK);
-
-exit:
rte_rwlock_write_unlock(RTE_EAL_MEMPOOL_RWLOCK);
return mp;
+
+exit_unlock:
+ rte_rwlock_write_unlock(RTE_EAL_MEMPOOL_RWLOCK);
+ rte_ring_free(r);
+ rte_free(te);
+
+ return NULL;
}
/* Return the number of entries in the mempool */
--
2.7.3

View File

@ -0,0 +1,154 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-20
From ca67ed289a76f38d6c4a4021985a36eaf1d77e28 Mon Sep 17 00:00:00 2001
From: Rich Lane <rich.lane@bigswitch.com>
Date: Wed, 10 Feb 2016 10:40:55 -0800
Subject: [PATCH] vhost: fix leak of fds and mmaps
The common vhost code only supported a single mmap per device. vhost-user
worked around this by saving the address/length/fd of each mmap after the end
of the rte_virtio_memory struct. This only works if the vhost-user code frees
dev->mem, since the common code is unaware of the extra info. The
VHOST_USER_RESET_OWNER message is one situation where the common code frees
dev->mem and leaks the fds and mappings. This happens every time I shut down a
VM.
The new code calls back into the implementation (vhost-user or vhost-cuse) to
clean up these resources.
The vhost-cuse changes are only compile tested.
Signed-off-by: Rich Lane <rich.lane@bigswitch.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
---
lib/librte_vhost/vhost-net.h | 6 ++++++
lib/librte_vhost/vhost_cuse/virtio-net-cdev.c | 12 ++++++++++++
lib/librte_vhost/vhost_user/vhost-net-user.c | 1 -
lib/librte_vhost/vhost_user/virtio-net-user.c | 25 ++++++++++---------------
lib/librte_vhost/vhost_user/virtio-net-user.h | 1 -
lib/librte_vhost/virtio-net.c | 8 +-------
6 files changed, 29 insertions(+), 24 deletions(-)
Index: dpdk/lib/librte_vhost/vhost-net.h
===================================================================
--- dpdk.orig/lib/librte_vhost/vhost-net.h
+++ dpdk/lib/librte_vhost/vhost-net.h
@@ -115,4 +115,10 @@ struct vhost_net_device_ops {
struct vhost_net_device_ops const *get_virtio_net_callbacks(void);
+
+/*
+ * Backend-specific cleanup. Defined by vhost-cuse and vhost-user.
+ */
+void vhost_backend_cleanup(struct virtio_net *dev);
+
#endif /* _VHOST_NET_CDEV_H_ */
Index: dpdk/lib/librte_vhost/vhost_cuse/virtio-net-cdev.c
===================================================================
--- dpdk.orig/lib/librte_vhost/vhost_cuse/virtio-net-cdev.c
+++ dpdk/lib/librte_vhost/vhost_cuse/virtio-net-cdev.c
@@ -421,3 +421,15 @@ int cuse_set_backend(struct vhost_device
return ops->set_backend(ctx, file);
}
+
+void
+vhost_backend_cleanup(struct virtio_net *dev)
+{
+ /* Unmap QEMU memory file if mapped. */
+ if (dev->mem) {
+ munmap((void *)(uintptr_t)dev->mem->mapped_address,
+ (size_t)dev->mem->mapped_size);
+ free(dev->mem);
+ dev->mem = NULL;
+ }
+}
Index: dpdk/lib/librte_vhost/vhost_user/vhost-net-user.c
===================================================================
--- dpdk.orig/lib/librte_vhost/vhost_user/vhost-net-user.c
+++ dpdk/lib/librte_vhost/vhost_user/vhost-net-user.c
@@ -347,7 +347,6 @@ vserver_message_handler(int connfd, void
close(connfd);
*remove = 1;
free(cfd_ctx);
- user_destroy_device(ctx);
ops->destroy_device(ctx);
return;
Index: dpdk/lib/librte_vhost/vhost_user/virtio-net-user.c
===================================================================
--- dpdk.orig/lib/librte_vhost/vhost_user/virtio-net-user.c
+++ dpdk/lib/librte_vhost/vhost_user/virtio-net-user.c
@@ -88,6 +88,16 @@ free_mem_region(struct virtio_net *dev)
}
}
+void
+vhost_backend_cleanup(struct virtio_net *dev)
+{
+ if (dev->mem) {
+ free_mem_region(dev);
+ free(dev->mem);
+ dev->mem = NULL;
+ }
+}
+
int
user_set_mem_table(struct vhost_device_ctx ctx, struct VhostUserMsg *pmsg)
{
@@ -339,21 +349,6 @@ user_set_vring_enable(struct vhost_devic
}
void
-user_destroy_device(struct vhost_device_ctx ctx)
-{
- struct virtio_net *dev = get_device(ctx);
-
- if (dev && (dev->flags & VIRTIO_DEV_RUNNING))
- notify_ops->destroy_device(dev);
-
- if (dev && dev->mem) {
- free_mem_region(dev);
- free(dev->mem);
- dev->mem = NULL;
- }
-}
-
-void
user_set_protocol_features(struct vhost_device_ctx ctx,
uint64_t protocol_features)
{
Index: dpdk/lib/librte_vhost/vhost_user/virtio-net-user.h
===================================================================
--- dpdk.orig/lib/librte_vhost/vhost_user/virtio-net-user.h
+++ dpdk/lib/librte_vhost/vhost_user/virtio-net-user.h
@@ -55,5 +55,4 @@ int user_get_vring_base(struct vhost_dev
int user_set_vring_enable(struct vhost_device_ctx ctx,
struct vhost_vring_state *state);
-void user_destroy_device(struct vhost_device_ctx);
#endif
Index: dpdk/lib/librte_vhost/virtio-net.c
===================================================================
--- dpdk.orig/lib/librte_vhost/virtio-net.c
+++ dpdk/lib/librte_vhost/virtio-net.c
@@ -199,13 +199,7 @@ cleanup_device(struct virtio_net *dev, i
{
uint32_t i;
- /* Unmap QEMU memory file if mapped. */
- if (dev->mem) {
- munmap((void *)(uintptr_t)dev->mem->mapped_address,
- (size_t)dev->mem->mapped_size);
- free(dev->mem);
- dev->mem = NULL;
- }
+ vhost_backend_cleanup(dev);
for (i = 0; i < dev->virt_qp_nb; i++) {
cleanup_vq(dev->virtqueue[i * VIRTIO_QNUM + VIRTIO_RXQ], destroy);

View File

@ -0,0 +1,80 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-20
From fa11a8a7251e14eca0a4190128732386f13551bd Mon Sep 17 00:00:00 2001
From: Jasvinder Singh <jasvinder.singh@intel.com>
Date: Wed, 2 Mar 2016 21:19:58 +0000
Subject: [PATCH] port: fix crash for ring writer nodrop
Error log:
[APP] Initializing PIPELINE0 ...
pipeline> [APP] Initializing PIPELINE1 ...
[PIPELINE1] Pass-through
[APP] Initializing PIPELINE2 ...
[PIPELINE2] Pass-through
Segmentation fault (core dumped)
Fixes: 5f4cd47309d6 ("port: add ring writer nodrop")
Fixes: d58f69c54172 ("port: add ring multi reader or writer")
Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
---
lib/librte_port/rte_port_ring.c | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/lib/librte_port/rte_port_ring.c b/lib/librte_port/rte_port_ring.c
index 755dfc1..b847fea 100644
--- a/lib/librte_port/rte_port_ring.c
+++ b/lib/librte_port/rte_port_ring.c
@@ -520,16 +520,20 @@ send_burst_nodrop(struct rte_port_ring_writer_nodrop *p)
p->tx_buf_count);
/* We sent all the packets in a first try */
- if (nb_tx >= p->tx_buf_count)
+ if (nb_tx >= p->tx_buf_count) {
+ p->tx_buf_count = 0;
return;
+ }
for (i = 0; i < p->n_retries; i++) {
nb_tx += rte_ring_sp_enqueue_burst(p->ring,
(void **) (p->tx_buf + nb_tx), p->tx_buf_count - nb_tx);
/* We sent all the packets in more than one try */
- if (nb_tx >= p->tx_buf_count)
+ if (nb_tx >= p->tx_buf_count) {
+ p->tx_buf_count = 0;
return;
+ }
}
/* We didn't send the packets in maximum allowed attempts */
@@ -549,16 +553,20 @@ send_burst_mp_nodrop(struct rte_port_ring_writer_nodrop *p)
p->tx_buf_count);
/* We sent all the packets in a first try */
- if (nb_tx >= p->tx_buf_count)
+ if (nb_tx >= p->tx_buf_count) {
+ p->tx_buf_count = 0;
return;
+ }
for (i = 0; i < p->n_retries; i++) {
nb_tx += rte_ring_mp_enqueue_burst(p->ring,
(void **) (p->tx_buf + nb_tx), p->tx_buf_count - nb_tx);
/* We sent all the packets in more than one try */
- if (nb_tx >= p->tx_buf_count)
+ if (nb_tx >= p->tx_buf_count) {
+ p->tx_buf_count = 0;
return;
+ }
}
/* We didn't send the packets in maximum allowed attempts */
--
2.7.3

View File

@ -0,0 +1,55 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-20
From 04f366906ab395c8047bebfc1ddea244dfcb40f5 Mon Sep 17 00:00:00 2001
From: Jasvinder Singh <jasvinder.singh@intel.com>
Date: Wed, 2 Mar 2016 21:19:29 +0000
Subject: [PATCH] port: fix crash for ethdev writer nodrop
Error log:
[APP] Initializing PIPELINE0 ...
pipeline> [APP] Initializing PIPELINE1 ...
[PIPELINE1] Pass-through
Segmentation fault (core dumped)
Fixes: 304c8091e90a ("port: add ethdev writer nodrop")
Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
Acked-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
---
lib/librte_port/rte_port_ethdev.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/lib/librte_port/rte_port_ethdev.c b/lib/librte_port/rte_port_ethdev.c
index 1f0c81c..1c34602 100644
--- a/lib/librte_port/rte_port_ethdev.c
+++ b/lib/librte_port/rte_port_ethdev.c
@@ -390,16 +390,20 @@ send_burst_nodrop(struct rte_port_ethdev_writer_nodrop *p)
p->tx_buf_count);
/* We sent all the packets in a first try */
- if (nb_tx >= p->tx_buf_count)
+ if (nb_tx >= p->tx_buf_count) {
+ p->tx_buf_count = 0;
return;
+ }
for (i = 0; i < p->n_retries; i++) {
nb_tx += rte_eth_tx_burst(p->port_id, p->queue_id,
p->tx_buf + nb_tx, p->tx_buf_count - nb_tx);
/* We sent all the packets in more than one try */
- if (nb_tx >= p->tx_buf_count)
+ if (nb_tx >= p->tx_buf_count) {
+ p->tx_buf_count = 0;
return;
+ }
}
/* We didn't send the packets in maximum allowed attempts */
--
2.7.3

View File

@ -0,0 +1,45 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-20
From c7a4ff80722e9237a4c504106d21ba5ca27d8df2 Mon Sep 17 00:00:00 2001
From: Helin Zhang <helin.zhang@intel.com>
Date: Sat, 12 Mar 2016 00:50:58 +0800
Subject: [PATCH] i40e: fix overflow
The array 'ptype_table' was defined in depth of 'UINT8_MAX' which
is 255, while the querying index could be from 0 to 255. The issue
can be fixed with expanding the array to one more element.
Fixes: 9571ea028489 ("i40e: replace some offload flags with unified packet type")
Signed-off-by: Helin Zhang <helin.zhang@intel.com>
Acked-by: Wenzhuo Lu <wenzhuo.lu@intel.com>
---
drivers/net/i40e/i40e_rxtx.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
Index: dpdk/drivers/net/i40e/i40e_rxtx.c
===================================================================
--- dpdk.orig/drivers/net/i40e/i40e_rxtx.c
+++ dpdk/drivers/net/i40e/i40e_rxtx.c
@@ -198,7 +198,7 @@ i40e_get_iee15888_flags(struct rte_mbuf
static inline uint32_t
i40e_rxd_pkt_type_mapping(uint8_t ptype)
{
- static const uint32_t ptype_table[UINT8_MAX] __rte_cache_aligned = {
+ static const uint32_t type_table[UINT8_MAX + 1] __rte_cache_aligned = {
/* L2 types */
/* [0] reserved */
[1] = RTE_PTYPE_L2_ETHER,
@@ -724,7 +724,7 @@ i40e_rxd_pkt_type_mapping(uint8_t ptype)
/* All others reserved */
};
- return ptype_table[ptype];
+ return type_table[ptype];
}
#define I40E_RX_DESC_EXT_STATUS_FLEXBH_MASK 0x03

View File

@ -0,0 +1,36 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-20
From 097e920c32bf19cf918cc071525f33b0abdeebaf Mon Sep 17 00:00:00 2001
From: Rich Lane <rich.lane@bigswitch.com>
Date: Wed, 23 Dec 2015 00:08:00 -0800
Subject: [PATCH] i40e: fix inverted check for no refcount
The no-refcount path was being taken without the application opting
in to it.
Fixes: 4861cde46116 ("i40e: new poll mode driver")
Reported-by: Mike Stolarchuk <mike.stolarchuk@bigswitch.com>
Signed-off-by: Rich Lane <rich.lane@bigswitch.com>
Acked-by: Helin Zhang <helin.zhang@intel.com>
---
drivers/net/i40e/i40e_rxtx.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Index: dpdk/drivers/net/i40e/i40e_rxtx.c
===================================================================
--- dpdk.orig/drivers/net/i40e/i40e_rxtx.c
+++ dpdk/drivers/net/i40e/i40e_rxtx.c
@@ -1762,7 +1762,7 @@ i40e_tx_free_bufs(struct i40e_tx_queue *
for (i = 0; i < txq->tx_rs_thresh; i++)
rte_prefetch0((txep + i)->mbuf);
- if (!(txq->txq_flags & (uint32_t)ETH_TXQ_FLAGS_NOREFCOUNT)) {
+ if (txq->txq_flags & (uint32_t)ETH_TXQ_FLAGS_NOREFCOUNT) {
for (i = 0; i < txq->tx_rs_thresh; ++i, ++txep) {
rte_mempool_put(txep->mbuf->pool, txep->mbuf);
txep->mbuf = NULL;

View File

@ -0,0 +1,150 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-20
From 330aa319382aec9ea595f9ebcb9a3c44647ad66c Mon Sep 17 00:00:00 2001
From: Julien Meunier <julien.meunier@6wind.com>
Date: Thu, 4 Feb 2016 12:02:16 +0100
Subject: [PATCH] i40e: fix VLAN filtering
VLAN filtering was always performed, even if hw_vlan_filter was
disabled. During device initialization, default filter
RTE_MACVLAN_PERFECT_MATCH was applied. In this situation, all incoming
VLAN frames were dropped by the card (increase of the register RUPP - Rx
Unsupported Protocol).
In order to restore default behavior, if HW VLAN filtering is activated,
set a filter to match MAC and VLAN. If not, set a filter to only match
MAC.
Fixes: 4861cde46116 ("i40e: new poll mode driver")
Fixes: 912b595146d6 ("i40e: mac vlan filter")
Signed-off-by: Julien Meunier <julien.meunier@6wind.com>
Acked-by: Helin Zhang <helin.zhang@intel.com>
---
drivers/net/i40e/i40e_ethdev.c | 73 ++++++++++++++++++++++++++++++++++++++++--
drivers/net/i40e/i40e_ethdev.h | 1 +
2 files changed, 72 insertions(+), 2 deletions(-)
Index: dpdk/drivers/net/i40e/i40e_ethdev.c
===================================================================
--- dpdk.orig/drivers/net/i40e/i40e_ethdev.c
+++ dpdk/drivers/net/i40e/i40e_ethdev.c
@@ -2332,6 +2332,13 @@ i40e_vlan_offload_set(struct rte_eth_dev
struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
struct i40e_vsi *vsi = pf->main_vsi;
+ if (mask & ETH_VLAN_FILTER_MASK) {
+ if (dev->data->dev_conf.rxmode.hw_vlan_filter)
+ i40e_vsi_config_vlan_filter(vsi, TRUE);
+ else
+ i40e_vsi_config_vlan_filter(vsi, FALSE);
+ }
+
if (mask & ETH_VLAN_STRIP_MASK) {
/* Enable or disable VLAN stripping */
if (dev->data->dev_conf.rxmode.hw_vlan_strip)
@@ -2583,7 +2590,10 @@ i40e_macaddr_add(struct rte_eth_dev *dev
}
(void)rte_memcpy(&mac_filter.mac_addr, mac_addr, ETHER_ADDR_LEN);
- mac_filter.filter_type = RTE_MACVLAN_PERFECT_MATCH;
+ if (dev->data->dev_conf.rxmode.hw_vlan_filter)
+ mac_filter.filter_type = RTE_MACVLAN_PERFECT_MATCH;
+ else
+ mac_filter.filter_type = RTE_MAC_PERFECT_MATCH;
if (pool == 0)
vsi = pf->main_vsi;
@@ -4156,6 +4166,63 @@ fail_mem:
return NULL;
}
+/* Configure vlan filter on or off */
+int
+i40e_vsi_config_vlan_filter(struct i40e_vsi *vsi, bool on)
+{
+ int i, num;
+ struct i40e_mac_filter *f;
+ struct i40e_mac_filter_info *mac_filter;
+ enum rte_mac_filter_type desired_filter;
+ int ret = I40E_SUCCESS;
+
+ if (on) {
+ /* Filter to match MAC and VLAN */
+ desired_filter = RTE_MACVLAN_PERFECT_MATCH;
+ } else {
+ /* Filter to match only MAC */
+ desired_filter = RTE_MAC_PERFECT_MATCH;
+ }
+
+ num = vsi->mac_num;
+
+ mac_filter = rte_zmalloc("mac_filter_info_data",
+ num * sizeof(*mac_filter), 0);
+ if (mac_filter == NULL) {
+ PMD_DRV_LOG(ERR, "failed to allocate memory");
+ return I40E_ERR_NO_MEMORY;
+ }
+
+ i = 0;
+
+ /* Remove all existing mac */
+ TAILQ_FOREACH(f, &vsi->mac_list, next) {
+ mac_filter[i] = f->mac_info;
+ ret = i40e_vsi_delete_mac(vsi, &f->mac_info.mac_addr);
+ if (ret) {
+ PMD_DRV_LOG(ERR, "Update VSI failed to %s vlan filter",
+ on ? "enable" : "disable");
+ goto DONE;
+ }
+ i++;
+ }
+
+ /* Override with new filter */
+ for (i = 0; i < num; i++) {
+ mac_filter[i].filter_type = desired_filter;
+ ret = i40e_vsi_add_mac(vsi, &mac_filter[i]);
+ if (ret) {
+ PMD_DRV_LOG(ERR, "Update VSI failed to %s vlan filter",
+ on ? "enable" : "disable");
+ goto DONE;
+ }
+ }
+
+DONE:
+ rte_free(mac_filter);
+ return ret;
+}
+
/* Configure vlan stripping on or off */
int
i40e_vsi_config_vlan_stripping(struct i40e_vsi *vsi, bool on)
@@ -4203,9 +4270,11 @@ i40e_dev_init_vlan(struct rte_eth_dev *d
{
struct rte_eth_dev_data *data = dev->data;
int ret;
+ int mask = 0;
/* Apply vlan offload setting */
- i40e_vlan_offload_set(dev, ETH_VLAN_STRIP_MASK);
+ mask = ETH_VLAN_STRIP_MASK | ETH_VLAN_FILTER_MASK;
+ i40e_vlan_offload_set(dev, mask);
/* Apply double-vlan setting, not implemented yet */
Index: dpdk/drivers/net/i40e/i40e_ethdev.h
===================================================================
--- dpdk.orig/drivers/net/i40e/i40e_ethdev.h
+++ dpdk/drivers/net/i40e/i40e_ethdev.h
@@ -551,6 +551,7 @@ void i40e_vsi_queues_unbind_intr(struct
int i40e_vsi_vlan_pvid_set(struct i40e_vsi *vsi,
struct i40e_vsi_vlan_pvid_info *info);
int i40e_vsi_config_vlan_stripping(struct i40e_vsi *vsi, bool on);
+int i40e_vsi_config_vlan_filter(struct i40e_vsi *vsi, bool on);
uint64_t i40e_config_hena(uint64_t flags);
uint64_t i40e_parse_hena(uint64_t flags);
enum i40e_status_code i40e_fdir_setup_tx_resources(struct i40e_pf *pf);

View File

@ -0,0 +1,55 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-20
From 9f44dd3d8ad447c7f797a9564d30a15e5ab7f72b Mon Sep 17 00:00:00 2001
From: Helin Zhang <helin.zhang@intel.com>
Date: Tue, 8 Mar 2016 16:14:14 +0800
Subject: [PATCH] i40e/base: fix missing check for stopped admin queue
It's possible that while waiting for the spinlock, another
entity (that owns the spinlock) has shut down the admin queue.
If it then attempts to use the queue, it will panic.
It adds a check for this condition on the receive side. This
matches an existing check on the send queue side.
Fixes: 8db9e2a1b232 ("i40e: base driver")
Signed-off-by: Helin Zhang <helin.zhang@intel.com>
Acked-by: Jingjing Wu <jingjing.wu@intel.com>
Acked-by: Remy Horton <remy.horton@intel.com>
---
drivers/net/i40e/base/i40e_adminq.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/drivers/net/i40e/base/i40e_adminq.c b/drivers/net/i40e/base/i40e_adminq.c
index 998582c..e1a162e 100644
--- a/drivers/net/i40e/base/i40e_adminq.c
+++ b/drivers/net/i40e/base/i40e_adminq.c
@@ -1035,6 +1035,13 @@ enum i40e_status_code i40e_clean_arq_element(struct i40e_hw *hw,
/* take the lock before we start messing with the ring */
i40e_acquire_spinlock(&hw->aq.arq_spinlock);
+ if (hw->aq.arq.count == 0) {
+ i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE,
+ "AQRX: Admin queue not initialized.\n");
+ ret_code = I40E_ERR_QUEUE_EMPTY;
+ goto clean_arq_element_err;
+ }
+
/* set next_to_use to head */
#ifdef PF_DRIVER
#ifdef INTEGRATED_VF
@@ -1113,6 +1120,7 @@ clean_arq_element_out:
/* Set pending if needed, unlock and return */
if (pending != NULL)
*pending = (ntc > ntu ? hw->aq.arq.count : 0) + (ntu - ntc);
+clean_arq_element_err:
i40e_release_spinlock(&hw->aq.arq_spinlock);
#ifdef PF_DRIVER
--
2.7.3

View File

@ -0,0 +1,44 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-20
From 8a8807369ffafef90c410279b4b2645d2d7a7483 Mon Sep 17 00:00:00 2001
From: Helin Zhang <helin.zhang@intel.com>
Date: Tue, 8 Mar 2016 16:14:28 +0800
Subject: [PATCH] i40e/base: fix driver load failure
Fix the driver load failure with linking with some
PHY types, as the amount of time it takes for the
GLGEN_RSTAT_DEVSTATE to be set increases greatly on those PHY
types, which can lead to a timeout.
Fixes: 9aeefed05538 ("i40e/base: support ESS")
Signed-off-by: Helin Zhang <helin.zhang@intel.com>
Acked-by: Jingjing Wu <jingjing.wu@intel.com>
Acked-by: Remy Horton <remy.horton@intel.com>
---
drivers/net/i40e/base/i40e_common.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
Index: dpdk/drivers/net/i40e/base/i40e_common.c
===================================================================
--- dpdk.orig/drivers/net/i40e/base/i40e_common.c
+++ dpdk/drivers/net/i40e/base/i40e_common.c
@@ -1303,11 +1303,11 @@ enum i40e_status_code i40e_pf_reset(stru
grst_del = (rd32(hw, I40E_GLGEN_RSTCTL) &
I40E_GLGEN_RSTCTL_GRSTDEL_MASK) >>
I40E_GLGEN_RSTCTL_GRSTDEL_SHIFT;
-#ifdef I40E_ESS_SUPPORT
+
/* It can take upto 15 secs for GRST steady state */
grst_del = grst_del * 20; /* bump it to 16 secs max to be safe */
-#endif
- for (cnt = 0; cnt < grst_del + 10; cnt++) {
+
+ for (cnt = 0; cnt < grst_del; cnt++) {
reg = rd32(hw, I40E_GLGEN_RSTAT);
if (!(reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK))
break;

View File

@ -0,0 +1,38 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-20
From 7656a546c0609f3205558a5d48352c82607d38d3 Mon Sep 17 00:00:00 2001
From: Xiao Wang <xiao.w.wang@intel.com>
Date: Fri, 18 Dec 2015 11:09:18 +0800
Subject: [PATCH] fm10k: fix VLAN flag in scattered Rx
In fm10k_recv_scattered_pkts function, a packet is stored in a linked list,
offload flags such as PKT_RX_VLAN_PKT should be set in the first segment.
Fixes: 6b59a3bc82b1 ("fm10k: fix VLAN in Rx mbuf")
Signed-off-by: Wang Xiao W <xiao.w.wang@intel.com>
Acked-by: Shaopeng He <shaopeng.he@intel.com>
---
drivers/net/fm10k/fm10k_rxtx.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/fm10k/fm10k_rxtx.c b/drivers/net/fm10k/fm10k_rxtx.c
index e958865..de31cad 100644
--- a/drivers/net/fm10k/fm10k_rxtx.c
+++ b/drivers/net/fm10k/fm10k_rxtx.c
@@ -305,7 +305,7 @@ fm10k_recv_scattered_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
* So, always PKT_RX_VLAN_PKT flag is set and vlan_tci
* is valid for each RX packet's mbuf.
*/
- mbuf->ol_flags |= PKT_RX_VLAN_PKT;
+ first_seg->ol_flags |= PKT_RX_VLAN_PKT;
first_seg->vlan_tci = desc.w.vlan;
/* Prefetch data of first segment, if configured to do so. */
--
2.7.3

View File

@ -0,0 +1,64 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-20
From c6fb0e55585206a89f6db396de860e6e844cad06 Mon Sep 17 00:00:00 2001
From: Dror Birkman <dror.birkman@lightcyber.com>
Date: Thu, 28 Jan 2016 13:09:50 +0200
Subject: [PATCH] pcap: fix captured frame length
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The actual captured length is header.caplen, whereas header.len is
the original length on the wire.
Fixes: 4c173302c307 ("pcap: add new driver")
Signed-off-by: Dror Birkman <dror.birkman@lightcyber.com>
Acked-by: Nicolás Pernas Maradei <nicolas.pernas.maradei@emutex.com>
---
drivers/net/pcap/rte_eth_pcap.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c
index f9230eb..1d121f8 100644
--- a/drivers/net/pcap/rte_eth_pcap.c
+++ b/drivers/net/pcap/rte_eth_pcap.c
@@ -220,25 +220,25 @@ eth_pcap_rx(void *queue,
buf_size = (uint16_t)(rte_pktmbuf_data_room_size(pcap_q->mb_pool) -
RTE_PKTMBUF_HEADROOM);
- if (header.len <= buf_size) {
+ if (header.caplen <= buf_size) {
/* pcap packet will fit in the mbuf, go ahead and copy */
rte_memcpy(rte_pktmbuf_mtod(mbuf, void *), packet,
- header.len);
- mbuf->data_len = (uint16_t)header.len;
+ header.caplen);
+ mbuf->data_len = (uint16_t)header.caplen;
} else {
/* Try read jumbo frame into multi mbufs. */
if (unlikely(eth_pcap_rx_jumbo(pcap_q->mb_pool,
mbuf,
packet,
- header.len) == -1))
+ header.caplen) == -1))
break;
}
- mbuf->pkt_len = (uint16_t)header.len;
+ mbuf->pkt_len = (uint16_t)header.caplen;
mbuf->port = pcap_q->in_port;
bufs[num_rx] = mbuf;
num_rx++;
- rx_bytes += header.len;
+ rx_bytes += header.caplen;
}
pcap_q->rx_pkts += num_rx;
pcap_q->rx_bytes += rx_bytes;
--
2.7.3

View File

@ -0,0 +1,56 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-20
From 6e02723754fb2b341701ac438486b2dfea98b523 Mon Sep 17 00:00:00 2001
From: Bernard Iremonger <bernard.iremonger@intel.com>
Date: Wed, 10 Feb 2016 10:13:44 +0000
Subject: [PATCH] bonding: fix detach of bonded device
Check that the bonded device has no slaves before detaching it.
Fixes: 8d30fe7fa737 ("bonding: support port hotplug")
Signed-off-by: Bernard Iremonger <bernard.iremonger@intel.com>
Acked-by: Declan Doherty <declan.doherty@intel.com>
---
drivers/net/bonding/rte_eth_bond_api.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/net/bonding/rte_eth_bond_api.c b/drivers/net/bonding/rte_eth_bond_api.c
index 8a000c8..484a6f3 100644
--- a/drivers/net/bonding/rte_eth_bond_api.c
+++ b/drivers/net/bonding/rte_eth_bond_api.c
@@ -1,7 +1,7 @@
/*-
* BSD LICENSE
*
- * Copyright(c) 2010-2015 Intel Corporation. All rights reserved.
+ * Copyright(c) 2010-2016 Intel Corporation. All rights reserved.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -277,6 +277,7 @@ int
rte_eth_bond_free(const char *name)
{
struct rte_eth_dev *eth_dev = NULL;
+ struct bond_dev_private *internals;
/* now free all data allocation - for eth_dev structure,
* dummy pci driver and internal (private) data
@@ -287,6 +288,10 @@ rte_eth_bond_free(const char *name)
if (eth_dev == NULL)
return -ENODEV;
+ internals = eth_dev->data->dev_private;
+ if (internals->slave_count != 0)
+ return -EBUSY;
+
if (eth_dev->data->dev_started == 1) {
bond_ethdev_stop(eth_dev);
bond_ethdev_close(eth_dev);
--
2.7.3

View File

@ -0,0 +1,150 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-20
From df3e8ad73f4c92b4eb8f49ff33271d4a09e6a04a Mon Sep 17 00:00:00 2001
From: Bernard Iremonger <bernard.iremonger@intel.com>
Date: Wed, 10 Feb 2016 10:13:45 +0000
Subject: [PATCH] bonding: fix detach of slave devices
Ensure that a bonded slave device is not detached,
until it is removed from the bonded device.
Fixes: 2efb58cbab6e ("bond: new link bonding library")
Fixes: a45b288ef21a ("bond: support link status polling")
Fixes: 494adb7f63f2 ("ethdev: add device fields from PCI layer")
Fixes: b1fb53a39d88 ("ethdev: remove some PCI specific handling")
Signed-off-by: Bernard Iremonger <bernard.iremonger@intel.com>
Acked-by: Declan Doherty <declan.doherty@intel.com>
---
drivers/net/bonding/rte_eth_bond_api.c | 33 +++++++++++----------------------
lib/librte_ether/rte_ethdev.c | 8 ++++++--
lib/librte_ether/rte_ethdev.h | 2 ++
3 files changed, 19 insertions(+), 24 deletions(-)
Index: dpdk/drivers/net/bonding/rte_eth_bond_api.c
===================================================================
--- dpdk.orig/drivers/net/bonding/rte_eth_bond_api.c
+++ dpdk/drivers/net/bonding/rte_eth_bond_api.c
@@ -314,38 +314,23 @@ __eth_bond_slave_add_lock_free(uint8_t b
{
struct rte_eth_dev *bonded_eth_dev, *slave_eth_dev;
struct bond_dev_private *internals;
- struct bond_dev_private *temp_internals;
struct rte_eth_link link_props;
struct rte_eth_dev_info dev_info;
- int i, j;
-
if (valid_slave_port_id(slave_port_id) != 0)
return -1;
bonded_eth_dev = &rte_eth_devices[bonded_port_id];
internals = bonded_eth_dev->data->dev_private;
- /* Verify that new slave device is not already a slave of another
- * bonded device */
- for (i = rte_eth_dev_count()-1; i >= 0; i--) {
- if (check_for_bonded_ethdev(&rte_eth_devices[i]) == 0) {
- temp_internals = rte_eth_devices[i].data->dev_private;
-
- for (j = 0; j < temp_internals->slave_count; j++) {
- /* Device already a slave of a bonded device */
- if (temp_internals->slaves[j].port_id == slave_port_id) {
- RTE_BOND_LOG(ERR, "Slave port %d is already a slave",
- slave_port_id);
- return -1;
- }
- }
- }
- }
-
slave_eth_dev = &rte_eth_devices[slave_port_id];
+ if (slave_eth_dev->data->dev_flags & RTE_ETH_DEV_BONDED_SLAVE) {
+ RTE_BOND_LOG(ERR, "Slave device is already a slave of a bonded device");
+ return -1;
+ }
/* Add slave details to bonded device */
+ slave_eth_dev->data->dev_flags |= RTE_ETH_DEV_BONDED_SLAVE;
slave_add(internals, slave_eth_dev);
rte_eth_dev_info_get(slave_port_id, &dev_info);
@@ -385,6 +370,7 @@ __eth_bond_slave_add_lock_free(uint8_t b
if (internals->link_props_set) {
if (link_properties_valid(&(bonded_eth_dev->data->dev_link),
&(slave_eth_dev->data->dev_link))) {
+ slave_eth_dev->data->dev_flags &= (~RTE_ETH_DEV_BONDED_SLAVE);
RTE_BOND_LOG(ERR,
"Slave port %d link speed/duplex not supported",
slave_port_id);
@@ -416,6 +402,7 @@ __eth_bond_slave_add_lock_free(uint8_t b
if (bonded_eth_dev->data->dev_started) {
if (slave_configure(bonded_eth_dev, slave_eth_dev) != 0) {
+ slave_eth_dev->data->dev_flags &= (~RTE_ETH_DEV_BONDED_SLAVE);
RTE_BOND_LOG(ERR, "rte_bond_slaves_configure: port=%d",
slave_port_id);
return -1;
@@ -468,7 +455,7 @@ __eth_bond_slave_remove_lock_free(uint8_
{
struct rte_eth_dev *bonded_eth_dev;
struct bond_dev_private *internals;
-
+ struct rte_eth_dev *slave_eth_dev;
int i, slave_idx;
if (valid_slave_port_id(slave_port_id) != 0)
@@ -508,7 +495,9 @@ __eth_bond_slave_remove_lock_free(uint8_
mac_address_set(&rte_eth_devices[slave_port_id],
&(internals->slaves[slave_idx].persisted_mac_addr));
- slave_remove(internals, &rte_eth_devices[slave_port_id]);
+ slave_eth_dev = &rte_eth_devices[slave_port_id];
+ slave_remove(internals, slave_eth_dev);
+ slave_eth_dev->data->dev_flags &= (~RTE_ETH_DEV_BONDED_SLAVE);
/* first slave in the active list will be the primary by default,
* otherwise use first device in list */
Index: dpdk/lib/librte_ether/rte_ethdev.c
===================================================================
--- dpdk.orig/lib/librte_ether/rte_ethdev.c
+++ dpdk/lib/librte_ether/rte_ethdev.c
@@ -1,7 +1,7 @@
/*-
* BSD LICENSE
*
- * Copyright(c) 2010-2015 Intel Corporation. All rights reserved.
+ * Copyright(c) 2010-2016 Intel Corporation. All rights reserved.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -498,7 +498,11 @@ rte_eth_dev_is_detachable(uint8_t port_i
return -ENOTSUP;
}
dev_flags = rte_eth_devices[port_id].data->dev_flags;
- return !(dev_flags & RTE_ETH_DEV_DETACHABLE);
+ if ((dev_flags & RTE_ETH_DEV_DETACHABLE) &&
+ (!(dev_flags & RTE_ETH_DEV_BONDED_SLAVE)))
+ return 0;
+ else
+ return 1;
}
/* attach the new physical device, then store port_id of the device */
Index: dpdk/lib/librte_ether/rte_ethdev.h
===================================================================
--- dpdk.orig/lib/librte_ether/rte_ethdev.h
+++ dpdk/lib/librte_ether/rte_ethdev.h
@@ -1616,6 +1616,8 @@ struct rte_eth_dev_data {
#define RTE_ETH_DEV_DETACHABLE 0x0001
/** Device supports link state interrupt */
#define RTE_ETH_DEV_INTR_LSC 0x0002
+/** Device is a bonded slave */
+#define RTE_ETH_DEV_BONDED_SLAVE 0x0004
/**
* @internal

View File

@ -0,0 +1,40 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-20
From 786c990a11e6e6592dfdee02840877070aa3a79a Mon Sep 17 00:00:00 2001
From: Eric Kinzie <ekinzie@brocade.com>
Date: Tue, 1 Mar 2016 09:31:59 -0800
Subject: [PATCH] bonding: copy entire config structure in mode 4
Copy all needed fields from the mode8023ad_private structure in
bond_mode_8023ad_conf_get(). This help ensure that a subsequent call
to rte_eth_bond_8023ad_setup() is not passed uninitialized data that
would result in either incorrect behavior or a failed sanity check.
Fixes: 46fb43683679 ("bond: add mode 4")
Signed-off-by: Eric Kinzie <ekinzie@brocade.com>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Declan Doherty <declan.doherty@intel.com>
---
drivers/net/bonding/rte_eth_bond_8023ad.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.c b/drivers/net/bonding/rte_eth_bond_8023ad.c
index b3b30f6..1b7e93a 100644
--- a/drivers/net/bonding/rte_eth_bond_8023ad.c
+++ b/drivers/net/bonding/rte_eth_bond_8023ad.c
@@ -1019,6 +1019,7 @@ bond_mode_8023ad_conf_get(struct rte_eth_dev *dev,
conf->aggregate_wait_timeout_ms = mode4->aggregate_wait_timeout / ms_ticks;
conf->tx_period_ms = mode4->tx_period_timeout / ms_ticks;
conf->update_timeout_ms = mode4->update_timeout_us / 1000;
+ conf->rx_marker_period_ms = mode4->rx_marker_timeout / ms_ticks;
}
void
--
2.7.3

View File

@ -0,0 +1,59 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-20
From 6698820b5f6d955b6af2b916e1074db236d4f5a2 Mon Sep 17 00:00:00 2001
From: Eric Kinzie <ekinzie@brocade.com>
Date: Tue, 1 Mar 2016 09:32:00 -0800
Subject: [PATCH] bonding: do not ignore multicast in mode 4
The bonding PMD in mode 4 puts all enslaved interfaces into promiscuous
mode in order to receive LACPDUs and must filter unwanted packets
after the traffic has been "collected". Allow broadcast and multicast
through so that ARP and IPv6 neighbor discovery continue to work.
Fixes: 46fb43683679 ("bond: add mode 4")
Signed-off-by: Eric Kinzie <ekinzie@brocade.com>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Declan Doherty <declan.doherty@intel.com>
---
app/test/test_link_bonding_mode4.c | 7 +++++--
drivers/net/bonding/rte_eth_bond_pmd.c | 1 +
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/app/test/test_link_bonding_mode4.c b/app/test/test_link_bonding_mode4.c
index 713368d..31640cd 100644
--- a/app/test/test_link_bonding_mode4.c
+++ b/app/test/test_link_bonding_mode4.c
@@ -747,8 +747,11 @@ test_mode4_rx(void)
rte_eth_macaddr_get(test_params.bonded_port_id, &bonded_mac);
ether_addr_copy(&bonded_mac, &dst_mac);
- /* Assert that dst address is not bonding address */
- dst_mac.addr_bytes[0]++;
+ /* Assert that dst address is not bonding address. Do not set the
+ * least significant bit of the zero byte as this would create a
+ * multicast address.
+ */
+ dst_mac.addr_bytes[0] += 2;
/* First try with promiscuous mode enabled.
* Add 2 packets to each slave. First with bonding MAC address, second with
diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c
index b63c886..011150a 100644
--- a/drivers/net/bonding/rte_eth_bond_pmd.c
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
@@ -171,6 +171,7 @@ bond_ethdev_rx_burst_8023ad(void *queue, struct rte_mbuf **bufs,
* mode and packet address does not match. */
if (unlikely(hdr->ether_type == ether_type_slow_be ||
!collecting || (!promisc &&
+ !is_multicast_ether_addr(&hdr->d_addr) &&
!is_same_ether_addr(&bond_mac, &hdr->d_addr)))) {
if (hdr->ether_type == ether_type_slow_be) {
--
2.7.3

View File

@ -0,0 +1,49 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-20
From 8997a10bfcad789d000debaac4cd85cd3db57997 Mon Sep 17 00:00:00 2001
From: Eric Kinzie <ekinzie@brocade.com>
Date: Tue, 1 Mar 2016 09:32:01 -0800
Subject: [PATCH] bonding: fix active slaves with no primary
If the link state of a slave is "up" when added, it is added to the list
of active slaves but, even if it is the only slave, is not selected as
the primary interface. Generally, handling of link state interrupts
selects an interface to be primary, but only if the active count is zero.
This change avoids the situation where there are active slaves but
no primary.
Fixes: 2efb58cbab6e ("bond: new link bonding library")
Signed-off-by: Eric Kinzie <ekinzie@brocade.com>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Declan Doherty <declan.doherty@intel.com>
---
drivers/net/bonding/rte_eth_bond_api.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/net/bonding/rte_eth_bond_api.c b/drivers/net/bonding/rte_eth_bond_api.c
index a0995ec..5292ae1 100644
--- a/drivers/net/bonding/rte_eth_bond_api.c
+++ b/drivers/net/bonding/rte_eth_bond_api.c
@@ -419,8 +419,13 @@ __eth_bond_slave_add_lock_free(uint8_t bonded_port_id, uint8_t slave_port_id)
if (bonded_eth_dev->data->dev_started) {
rte_eth_link_get_nowait(slave_port_id, &link_props);
- if (link_props.link_status == 1)
+ if (link_props.link_status == 1) {
+ if (internals->active_slave_count == 0 &&
+ !internals->user_defined_primary_port)
+ bond_ethdev_primary_set(internals,
+ slave_port_id);
activate_slave(bonded_eth_dev, slave_port_id);
+ }
}
return 0;
--
2.7.3

View File

@ -0,0 +1,47 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-20
From 7a7122edf1c8d63e516d1b2c2eff6fa9b54e0f82 Mon Sep 17 00:00:00 2001
From: Eric Kinzie <ekinzie@brocade.com>
Date: Tue, 1 Mar 2016 09:32:02 -0800
Subject: [PATCH] bonding: do not activate slave twice
The current code for detecting link during slave addition can cause a
slave interface to be activated twice -- once during slave_configure()
and again at the end of __eth_bond_slave_add_lock_free(). This will
either cause the active slave count to be incorrect or will cause the
802.3ad activation function to panic. Ensure that the interface is not
activated more than once.
Fixes: 46fb43683679 ("bond: add mode 4")
Signed-off-by: Eric Kinzie <ekinzie@brocade.com>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Declan Doherty <declan.doherty@intel.com>
---
drivers/net/bonding/rte_eth_bond_api.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/net/bonding/rte_eth_bond_api.c b/drivers/net/bonding/rte_eth_bond_api.c
index 5292ae1..c6c0ed8 100644
--- a/drivers/net/bonding/rte_eth_bond_api.c
+++ b/drivers/net/bonding/rte_eth_bond_api.c
@@ -424,7 +424,11 @@ __eth_bond_slave_add_lock_free(uint8_t bonded_port_id, uint8_t slave_port_id)
!internals->user_defined_primary_port)
bond_ethdev_primary_set(internals,
slave_port_id);
- activate_slave(bonded_eth_dev, slave_port_id);
+
+ if (find_slave_by_id(internals->active_slaves,
+ internals->active_slave_count,
+ slave_port_id) == internals->active_slave_count)
+ activate_slave(bonded_eth_dev, slave_port_id);
}
}
return 0;
--
2.7.3

View File

@ -0,0 +1,42 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-20
From 2186fff3675d4e774cecc8f918c05063e0367d28 Mon Sep 17 00:00:00 2001
From: Bernard Iremonger <bernard.iremonger@intel.com>
Date: Mon, 7 Mar 2016 11:40:40 +0000
Subject: [PATCH] bonding: fix crash when no slave device
If a bonded device is created when there are no slave devices
there is a loop in bond_ethdev_promiscuous_enable() which results
in a segmentation fault.
The solution is to initialise the current_primary_port to an
invalid port value when the bonded port is created.
Fixes: 2efb58cbab6e ("bond: new link bonding library")
Signed-off-by: Bernard Iremonger <bernard.iremonger@intel.com>
Acked-by: Ferruh Yigit <ferruh.yigit@intel.com>
---
drivers/net/bonding/rte_eth_bond_api.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/bonding/rte_eth_bond_api.c b/drivers/net/bonding/rte_eth_bond_api.c
index c6c0ed8..3fca764 100644
--- a/drivers/net/bonding/rte_eth_bond_api.c
+++ b/drivers/net/bonding/rte_eth_bond_api.c
@@ -231,7 +231,7 @@ rte_eth_bond_create(const char *name, uint8_t mode, uint8_t socket_id)
internals->port_id = eth_dev->data->port_id;
internals->mode = BONDING_MODE_INVALID;
- internals->current_primary_port = 0;
+ internals->current_primary_port = RTE_MAX_ETHPORTS + 1;
internals->balance_xmit_policy = BALANCE_XMIT_POLICY_LAYER2;
internals->xmit_hash = xmit_l2_hash;
internals->user_defined_mac = 0;
--
2.7.3

View File

@ -0,0 +1,53 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-23
From c680a4a88c4312068f60937a7ba51eac8211c9a6 Mon Sep 17 00:00:00 2001
From: Bernard Iremonger <bernard.iremonger@intel.com>
Date: Wed, 23 Dec 2015 09:45:19 +0000
Subject: [PATCH] virtio: fix crash in statistics functions
This initialisation of nb_rx_queues and nb_tx_queues has been removed
from eth_virtio_dev_init.
The nb_rx_queues and nb_tx_queues were being initialised in
eth_virtio_dev_init before the tx_queues and rx_queues arrays were
allocated.
The arrays are allocated when the ethdev port is configured and the
nb_tx_queues and nb_rx_queues are initialised.
If any of the following functions were called before the ethdev
port was configured there was a segmentation fault because
rx_queues and tx_queues were NULL:
rte_eth_stats_get
rte_eth_stats_reset
rte_eth_xstats_get
rte_eth_xstats_reset
Fixes: 823ad647950a ("virtio: support multiple queues")
Signed-off-by: Bernard Iremonger <bernard.iremonger@intel.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
---
drivers/net/virtio/virtio_ethdev.c | 3 ---
1 file changed, 3 deletions(-)
Index: dpdk/drivers/net/virtio/virtio_ethdev.c
===================================================================
--- dpdk.orig/drivers/net/virtio/virtio_ethdev.c
+++ dpdk/drivers/net/virtio/virtio_ethdev.c
@@ -1378,9 +1378,6 @@ eth_virtio_dev_init(struct rte_eth_dev *
hw->max_tx_queues = 1;
}
- eth_dev->data->nb_rx_queues = hw->max_rx_queues;
- eth_dev->data->nb_tx_queues = hw->max_tx_queues;
-
PMD_INIT_LOG(DEBUG, "hw->max_rx_queues=%d hw->max_tx_queues=%d",
hw->max_rx_queues, hw->max_tx_queues);
PMD_INIT_LOG(DEBUG, "port %d vendorID=0x%x deviceID=0x%x",

View File

@ -0,0 +1,37 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559981
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-23
From 3b1e3e4e362453df8cecbc6d481444be8b84326e Mon Sep 17 00:00:00 2001
From: Huawei Xie <huawei.xie@intel.com>
Date: Fri, 11 Dec 2015 00:07:32 +0800
Subject: [PATCH] virtio: fix descriptors pointing to the same buffer
The virtio_net_hdr desc all pointed to the same buffer. It doesn't cause
issue because in the simple TX mode we don't use the header. This patch
makes the header desc point to different buffer.
Fixes: b4ae9c505f2e ("virtio: optimize ring layout")
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Acked-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
---
drivers/net/virtio/virtio_rxtx.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Index: dpdk/drivers/net/virtio/virtio_rxtx.c
===================================================================
--- dpdk.orig/drivers/net/virtio/virtio_rxtx.c
+++ dpdk/drivers/net/virtio/virtio_rxtx.c
@@ -352,7 +352,7 @@ virtio_dev_vring_start(struct virtqueue
vq->vq_ring.desc[i + mid_idx].next = i;
vq->vq_ring.desc[i + mid_idx].addr =
vq->virtio_net_hdr_mem +
- mid_idx * vq->hw->vtnet_hdr_size;
+ i * vq->hw->vtnet_hdr_size;
vq->vq_ring.desc[i + mid_idx].len =
vq->hw->vtnet_hdr_size;
vq->vq_ring.desc[i + mid_idx].flags =

View File

@ -0,0 +1,72 @@
Description: backport of dpdk 16.04-rc1 fix for LP: #1559912
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-03-23
From 9a0615af7746485d73d10561cc0743bc2fcd4bf7 Mon Sep 17 00:00:00 2001
From: Jianfeng Tan <jianfeng.tan@intel.com>
Date: Mon, 11 Jan 2016 14:16:13 +0800
Subject: [PATCH] virtio: fix restart
Fix the issue that virtio device cannot be started after stopped.
The field, hw->started, should be changed by virtio_dev_start/stop instead
of virtio_dev_close.
Fixes: a85786dc816f ("virtio: fix states handling during initialization")
Reported-by: Pavel Fedin <p.fedin@samsung.com>
Signed-off-by: Jianfeng Tan <jianfeng.tan@intel.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
Tested-by: Pavel Fedin <p.fedin@samsung.com>
---
drivers/net/virtio/virtio_ethdev.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
Index: dpdk/drivers/net/virtio/virtio_ethdev.c
===================================================================
--- dpdk.orig/drivers/net/virtio/virtio_ethdev.c
+++ dpdk/drivers/net/virtio/virtio_ethdev.c
@@ -490,11 +490,13 @@ virtio_dev_close(struct rte_eth_dev *dev
PMD_INIT_LOG(DEBUG, "virtio_dev_close");
+ if (hw->started == 1)
+ virtio_dev_stop(dev);
+
/* reset the NIC */
if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
vtpci_irq_config(hw, VIRTIO_MSI_NO_VECTOR);
vtpci_reset(hw);
- hw->started = 0;
virtio_dev_free_mbufs(dev);
virtio_free_queues(dev);
}
@@ -1405,10 +1407,9 @@ eth_virtio_dev_uninit(struct rte_eth_dev
if (rte_eal_process_type() == RTE_PROC_SECONDARY)
return -EPERM;
- if (hw->started == 1) {
- virtio_dev_stop(eth_dev);
- virtio_dev_close(eth_dev);
- }
+ /* Close it anyway since there's no way to know if closed */
+ virtio_dev_close(eth_dev);
+
pci_dev = eth_dev->pci_dev;
eth_dev->dev_ops = NULL;
@@ -1609,9 +1610,12 @@ static void
virtio_dev_stop(struct rte_eth_dev *dev)
{
struct rte_eth_link link;
+ struct virtio_hw *hw = dev->data->dev_private;
PMD_INIT_LOG(DEBUG, "stop");
+ hw->started = 0;
+
if (dev->data->dev_conf.intr_conf.lsc)
rte_intr_disable(&dev->pci_dev->intr_handle);

View File

@ -0,0 +1,79 @@
Description: backport of dpdk 16.04-rc fix for LP: #1568838
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-04-11
From f82f705b635d31a63446a16bc4526dbebf293c5a Mon Sep 17 00:00:00 2001
From: Olivier Matz <olivier.matz@6wind.com>
Date: Wed, 6 Apr 2016 15:27:58 +0200
Subject: [PATCH] lpm: fix allocation of an existing object
Change rte_lpm*_create() functions to return NULL and set rte_errno to
EEXIST when the object name already exists. This is the behavior
described in the API documentation in the header file.
These functions were returning a pointer to the existing object in that
case, but it is a problem as the caller did not know if the object had
to be freed or not.
Doing this change also makes the lpm API more consistent with the other
APIs (mempool, rings, ...).
Fixes: 916e4f4f4e ("memory: fix for multi process support")
Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
---
app/test/test_lpm6.c | 2 +-
lib/librte_lpm/rte_lpm.c | 10 ++++++++--
lib/librte_lpm/rte_lpm6.c | 5 ++++-
4 files changed, 22 insertions(+), 4 deletions(-)
Index: dpdk/app/test/test_lpm6.c
===================================================================
--- dpdk.orig/app/test/test_lpm6.c
+++ dpdk/app/test/test_lpm6.c
@@ -222,7 +222,7 @@ test1(void)
/* rte_lpm6_create: lpm name == LPM2 */
lpm3 = rte_lpm6_create("LPM1", SOCKET_ID_ANY, &config);
- TEST_LPM_ASSERT(lpm3 == lpm1);
+ TEST_LPM_ASSERT(lpm3 == NULL);
rte_lpm6_free(lpm1);
rte_lpm6_free(lpm2);
Index: dpdk/lib/librte_lpm/rte_lpm.c
===================================================================
--- dpdk.orig/lib/librte_lpm/rte_lpm.c
+++ dpdk/lib/librte_lpm/rte_lpm.c
@@ -181,8 +181,11 @@ rte_lpm_create(const char *name, int soc
if (strncmp(name, lpm->name, RTE_LPM_NAMESIZE) == 0)
break;
}
- if (te != NULL)
+ lpm = NULL;
+ if (te != NULL) {
+ rte_errno = EEXIST;
goto exit;
+ }
/* allocate tailq entry */
te = rte_zmalloc("LPM_TAILQ_ENTRY", sizeof(*te), 0);
Index: dpdk/lib/librte_lpm/rte_lpm6.c
===================================================================
--- dpdk.orig/lib/librte_lpm/rte_lpm6.c
+++ dpdk/lib/librte_lpm/rte_lpm6.c
@@ -182,8 +182,11 @@ rte_lpm6_create(const char *name, int so
if (strncmp(name, lpm->name, RTE_LPM6_NAMESIZE) == 0)
break;
}
- if (te != NULL)
+ lpm = NULL;
+ if (te != NULL) {
+ rte_errno = EEXIST;
goto exit;
+ }
/* allocate tailq entry */
te = rte_zmalloc("LPM6_TAILQ_ENTRY", sizeof(*te), 0);

View File

@ -0,0 +1,260 @@
Description: backport of dpdk 16.04-rc fix for LP: #1568838
Minimal modification to adapt to the not yet existing unified RTE_ARCH_X86
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-04-11
From f9bd3342114a9db436f71b12ac424aff224482cb Mon Sep 17 00:00:00 2001
From: Pablo de Lara <pablo.de.lara.guarch@intel.com>
Date: Fri, 1 Apr 2016 16:03:49 +0100
Subject: [PATCH] hash: fix multi-process support
Hash library used a function pointer to choose a different
key compare function, depending on the key size.
As a result, multiple processes could not use the same hash table,
as the function addresses vary from one process to another.
Instead, a jump table is used, so each process has its own
function addresses, accessing this table with an index stored
in the hash table (note that using a custom key compare function
is not supported in multi-process mode).
Fixes: 48a399119619 ("hash: replace with cuckoo hash implementation")
Signed-off-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---
doc/guides/prog_guide/hash_lib.rst | 8 +++
doc/guides/rel_notes/release_16_04.rst | 8 +++
lib/librte_hash/rte_cuckoo_hash.c | 107 +++++++++++++++++++++++++++------
3 files changed, 104 insertions(+), 19 deletions(-)
Index: dpdk/doc/guides/prog_guide/hash_lib.rst
===================================================================
--- dpdk.orig/doc/guides/prog_guide/hash_lib.rst
+++ dpdk/doc/guides/prog_guide/hash_lib.rst
@@ -87,6 +87,14 @@ or stored in the hash table itself.
The example hash tables in the L2/L3 Forwarding sample applications defines which port to forward a packet to based on a packet flow identified by the five-tuple lookup.
However, this table could also be used for more sophisticated features and provide many other functions and actions that could be performed on the packets and flows.
+Multi-process support
+---------------------
+
+The hash library can be used in a multi-process environment, minding that only lookups are thread-safe.
+The only function that can only be used in single-process mode is rte_hash_set_cmp_func(), which sets up
+a custom compare function, which is assigned to a function pointer (therefore, it is not supported in
+multi-process mode).
+
Implementation Details
----------------------
Index: dpdk/lib/librte_hash/rte_cuckoo_hash.c
===================================================================
--- dpdk.orig/lib/librte_hash/rte_cuckoo_hash.c
+++ dpdk/lib/librte_hash/rte_cuckoo_hash.c
@@ -102,6 +102,64 @@ EAL_REGISTER_TAILQ(rte_hash_tailq)
#define LCORE_CACHE_SIZE 8
+#if defined(RTE_ARCH_X86_64) || defined(RTE_ARCH_I686) ||\
+ defined(RTE_ARCH_X86_X32) || defined(RTE_ARCH_ARM64)
+/*
+ * All different options to select a key compare function,
+ * based on the key size and custom function.
+ */
+enum cmp_jump_table_case {
+ KEY_CUSTOM = 0,
+ KEY_16_BYTES,
+ KEY_32_BYTES,
+ KEY_48_BYTES,
+ KEY_64_BYTES,
+ KEY_80_BYTES,
+ KEY_96_BYTES,
+ KEY_112_BYTES,
+ KEY_128_BYTES,
+ KEY_OTHER_BYTES,
+ NUM_KEY_CMP_CASES,
+};
+
+/*
+ * Table storing all different key compare functions
+ * (multi-process supported)
+ */
+const rte_hash_cmp_eq_t cmp_jump_table[NUM_KEY_CMP_CASES] = {
+ NULL,
+ rte_hash_k16_cmp_eq,
+ rte_hash_k32_cmp_eq,
+ rte_hash_k48_cmp_eq,
+ rte_hash_k64_cmp_eq,
+ rte_hash_k80_cmp_eq,
+ rte_hash_k96_cmp_eq,
+ rte_hash_k112_cmp_eq,
+ rte_hash_k128_cmp_eq,
+ memcmp
+};
+#else
+/*
+ * All different options to select a key compare function,
+ * based on the key size and custom function.
+ */
+enum cmp_jump_table_case {
+ KEY_CUSTOM = 0,
+ KEY_OTHER_BYTES,
+ NUM_KEY_CMP_CASES,
+};
+
+/*
+ * Table storing all different key compare functions
+ * (multi-process supported)
+ */
+const rte_hash_cmp_eq_t cmp_jump_table[NUM_KEY_CMP_CASES] = {
+ NULL,
+ memcmp
+};
+
+#endif
+
struct lcore_cache {
unsigned len; /**< Cache len */
void *objs[LCORE_CACHE_SIZE]; /**< Cache objects */
@@ -115,7 +173,10 @@ struct rte_hash {
uint32_t key_len; /**< Length of hash key. */
rte_hash_function hash_func; /**< Function used to calculate hash. */
uint32_t hash_func_init_val; /**< Init value used by hash_func. */
- rte_hash_cmp_eq_t rte_hash_cmp_eq; /**< Function used to compare keys. */
+ rte_hash_cmp_eq_t rte_hash_custom_cmp_eq;
+ /**< Custom function used to compare keys. */
+ enum cmp_jump_table_case cmp_jump_table_idx;
+ /**< Indicates which compare function to use. */
uint32_t bucket_bitmask; /**< Bitmask for getting bucket index
from hash signature. */
uint32_t key_entry_size; /**< Size of each key entry. */
@@ -187,7 +248,16 @@ rte_hash_find_existing(const char *name)
void rte_hash_set_cmp_func(struct rte_hash *h, rte_hash_cmp_eq_t func)
{
- h->rte_hash_cmp_eq = func;
+ h->rte_hash_custom_cmp_eq = func;
+}
+
+static inline int
+rte_hash_cmp_eq(const void *key1, const void *key2, const struct rte_hash *h)
+{
+ if (h->cmp_jump_table_idx == KEY_CUSTOM)
+ return h->rte_hash_custom_cmp_eq(key1, key2, h->key_len);
+ else
+ return cmp_jump_table[h->cmp_jump_table_idx](key1, key2, h->key_len);
}
struct rte_hash *
@@ -292,35 +362,35 @@ rte_hash_create(const struct rte_hash_pa
/* Select function to compare keys */
switch (params->key_len) {
case 16:
- h->rte_hash_cmp_eq = rte_hash_k16_cmp_eq;
+ h->cmp_jump_table_idx = KEY_16_BYTES;
break;
case 32:
- h->rte_hash_cmp_eq = rte_hash_k32_cmp_eq;
+ h->cmp_jump_table_idx = KEY_32_BYTES;
break;
case 48:
- h->rte_hash_cmp_eq = rte_hash_k48_cmp_eq;
+ h->cmp_jump_table_idx = KEY_48_BYTES;
break;
case 64:
- h->rte_hash_cmp_eq = rte_hash_k64_cmp_eq;
+ h->cmp_jump_table_idx = KEY_64_BYTES;
break;
case 80:
- h->rte_hash_cmp_eq = rte_hash_k80_cmp_eq;
+ h->cmp_jump_table_idx = KEY_80_BYTES;
break;
case 96:
- h->rte_hash_cmp_eq = rte_hash_k96_cmp_eq;
+ h->cmp_jump_table_idx = KEY_96_BYTES;
break;
case 112:
- h->rte_hash_cmp_eq = rte_hash_k112_cmp_eq;
+ h->cmp_jump_table_idx = KEY_112_BYTES;
break;
case 128:
- h->rte_hash_cmp_eq = rte_hash_k128_cmp_eq;
+ h->cmp_jump_table_idx = KEY_128_BYTES;
break;
default:
/* If key is not multiple of 16, use generic memcmp */
- h->rte_hash_cmp_eq = memcmp;
+ h->cmp_jump_table_idx = KEY_OTHER_BYTES;
}
#else
- h->rte_hash_cmp_eq = memcmp;
+ h->cmp_jump_table_idx = KEY_OTHER_BYTES;
#endif
snprintf(ring_name, sizeof(ring_name), "HT_%s", params->name);
@@ -594,7 +664,7 @@ __rte_hash_add_key_with_hash(const struc
prim_bkt->signatures[i].alt == alt_hash) {
k = (struct rte_hash_key *) ((char *)keys +
prim_bkt->key_idx[i] * h->key_entry_size);
- if (h->rte_hash_cmp_eq(key, k->key, h->key_len) == 0) {
+ if (rte_hash_cmp_eq(key, k->key, h) == 0) {
/* Enqueue index of free slot back in the ring. */
enqueue_slot_back(h, cached_free_slots, slot_id);
/* Update data */
@@ -614,7 +684,7 @@ __rte_hash_add_key_with_hash(const struc
sec_bkt->signatures[i].current == alt_hash) {
k = (struct rte_hash_key *) ((char *)keys +
sec_bkt->key_idx[i] * h->key_entry_size);
- if (h->rte_hash_cmp_eq(key, k->key, h->key_len) == 0) {
+ if (rte_hash_cmp_eq(key, k->key, h) == 0) {
/* Enqueue index of free slot back in the ring. */
enqueue_slot_back(h, cached_free_slots, slot_id);
/* Update data */
@@ -725,7 +795,7 @@ __rte_hash_lookup_with_hash(const struct
bkt->signatures[i].sig != NULL_SIGNATURE) {
k = (struct rte_hash_key *) ((char *)keys +
bkt->key_idx[i] * h->key_entry_size);
- if (h->rte_hash_cmp_eq(key, k->key, h->key_len) == 0) {
+ if (rte_hash_cmp_eq(key, k->key, h) == 0) {
if (data != NULL)
*data = k->pdata;
/*
@@ -748,7 +818,7 @@ __rte_hash_lookup_with_hash(const struct
bkt->signatures[i].alt == sig) {
k = (struct rte_hash_key *) ((char *)keys +
bkt->key_idx[i] * h->key_entry_size);
- if (h->rte_hash_cmp_eq(key, k->key, h->key_len) == 0) {
+ if (rte_hash_cmp_eq(key, k->key, h) == 0) {
if (data != NULL)
*data = k->pdata;
/*
@@ -840,7 +910,7 @@ __rte_hash_del_key_with_hash(const struc
bkt->signatures[i].sig != NULL_SIGNATURE) {
k = (struct rte_hash_key *) ((char *)keys +
bkt->key_idx[i] * h->key_entry_size);
- if (h->rte_hash_cmp_eq(key, k->key, h->key_len) == 0) {
+ if (rte_hash_cmp_eq(key, k->key, h) == 0) {
remove_entry(h, bkt, i);
/*
@@ -863,7 +933,7 @@ __rte_hash_del_key_with_hash(const struc
bkt->signatures[i].sig != NULL_SIGNATURE) {
k = (struct rte_hash_key *) ((char *)keys +
bkt->key_idx[i] * h->key_entry_size);
- if (h->rte_hash_cmp_eq(key, k->key, h->key_len) == 0) {
+ if (rte_hash_cmp_eq(key, k->key, h) == 0) {
remove_entry(h, bkt, i);
/*
@@ -980,7 +1050,7 @@ lookup_stage3(unsigned idx, const struct
unsigned hit;
unsigned key_idx;
- hit = !h->rte_hash_cmp_eq(key_slot->key, keys[idx], h->key_len);
+ hit = !rte_hash_cmp_eq(key_slot->key, keys[idx], h);
if (data != NULL)
data[idx] = key_slot->pdata;

View File

@ -0,0 +1,177 @@
Description: backport of dpdk 16.04-rc fix for LP: #1568838
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-04-11
From 1aadacb5b0ed29ea8f84eaa3ef6802663671be98 Mon Sep 17 00:00:00 2001
From: Olivier Matz <olivier.matz@6wind.com>
Date: Wed, 6 Apr 2016 15:27:59 +0200
Subject: [PATCH] hash: fix allocation of an existing object
Change rte_hash*_create() functions to return NULL and set rte_errno to
EEXIST when the object name already exists. This is the behavior
described in the API documentation in the header file.
These functions were returning a pointer to the existing object in that
case, but it is a problem as the caller did not know if the object had
to be freed or not.
Doing this change also makes the hash API more consistent with the other
APIs (mempool, rings, ...).
Fixes: 916e4f4f4e ("memory: fix for multi process support")
Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
---
app/test/test_hash.c | 65 ++++++++++++----------------------
doc/guides/rel_notes/release_16_04.rst | 9 +++++
lib/librte_hash/rte_cuckoo_hash.c | 6 ++--
lib/librte_hash/rte_fbk_hash.c | 5 ++-
4 files changed, 40 insertions(+), 45 deletions(-)
Index: dpdk/app/test/test_hash.c
===================================================================
--- dpdk.orig/app/test/test_hash.c
+++ dpdk/app/test/test_hash.c
@@ -805,15 +805,11 @@ fbk_hash_unit_test(void)
RETURN_IF_ERROR_FBK(handle == NULL, "fbk hash creation should have succeeded");
tmp = rte_fbk_hash_create(&invalid_params_same_name_2);
- RETURN_IF_ERROR_FBK(tmp == NULL, "fbk hash creation should have succeeded");
- if (tmp != handle) {
- printf("ERROR line %d: hashes should have been the same\n", __LINE__);
- rte_fbk_hash_free(handle);
- rte_fbk_hash_free(tmp);
- return -1;
- }
+ if (tmp != NULL)
+ rte_fbk_hash_free(tmp);
+ RETURN_IF_ERROR_FBK(tmp != NULL, "fbk hash creation should have failed");
- /* we are not freeing tmp or handle here because we need a hash list
+ /* we are not freeing handle here because we need a hash list
* to be not empty for the next test */
/* create a hash in non-empty list - good for coverage */
@@ -988,7 +984,7 @@ static int test_fbk_hash_find_existing(v
*/
static int test_hash_creation_with_bad_parameters(void)
{
- struct rte_hash *handle;
+ struct rte_hash *handle, *tmp;
struct rte_hash_parameters params;
handle = rte_hash_create(NULL);
@@ -1038,7 +1034,23 @@ static int test_hash_creation_with_bad_p
return -1;
}
+ /* test with same name should fail */
+ memcpy(&params, &ut_params, sizeof(params));
+ params.name = "same_name";
+ handle = rte_hash_create(&params);
+ if (handle == NULL) {
+ printf("Cannot create first hash table with 'same_name'\n");
+ return -1;
+ }
+ tmp = rte_hash_create(&params);
+ if (tmp != NULL) {
+ printf("Creation of hash table with same name should fail\n");
+ rte_hash_free(handle);
+ rte_hash_free(tmp);
+ return -1;
+ }
rte_hash_free(handle);
+
printf("# Test successful. No more errors expected\n");
return 0;
@@ -1051,12 +1063,12 @@ static int test_hash_creation_with_bad_p
static int
test_hash_creation_with_good_parameters(void)
{
- struct rte_hash *handle, *tmp;
+ struct rte_hash *handle;
struct rte_hash_parameters params;
/* create with null hash function - should choose DEFAULT_HASH_FUNC */
memcpy(&params, &ut_params, sizeof(params));
- params.name = "same_name";
+ params.name = "name";
params.hash_func = NULL;
handle = rte_hash_create(&params);
if (handle == NULL) {
@@ -1064,37 +1076,6 @@ test_hash_creation_with_good_parameters(
return -1;
}
- /* this test is trying to create a hash with the same name as previous one.
- * this should return a pointer to the hash we previously created.
- * the previous hash isn't freed exactly for the purpose of it being in
- * the hash list.
- */
- memcpy(&params, &ut_params, sizeof(params));
- params.name = "same_name";
- tmp = rte_hash_create(&params);
-
- /* check if the returned handle is actually equal to the previous hash */
- if (handle != tmp) {
- rte_hash_free(handle);
- rte_hash_free(tmp);
- printf("Creating hash with existing name was successful\n");
- return -1;
- }
-
- /* try creating hash when there already are hashes in the list.
- * the previous hash is not freed to have a non-empty hash list.
- * the other hash that's in the list is still pointed to by "handle" var.
- */
- memcpy(&params, &ut_params, sizeof(params));
- params.name = "different_name";
- tmp = rte_hash_create(&params);
- if (tmp == NULL) {
- rte_hash_free(handle);
- printf("Creating hash with valid parameters failed\n");
- return -1;
- }
-
- rte_hash_free(tmp);
rte_hash_free(handle);
return 0;
Index: dpdk/lib/librte_hash/rte_cuckoo_hash.c
===================================================================
--- dpdk.orig/lib/librte_hash/rte_cuckoo_hash.c
+++ dpdk/lib/librte_hash/rte_cuckoo_hash.c
@@ -300,8 +300,10 @@ rte_hash_create(const struct rte_hash_pa
/* Guarantee there's no existing */
h = rte_hash_find_existing(params->name);
- if (h != NULL)
- return h;
+ if (h != NULL) {
+ rte_errno = EEXIST;
+ return NULL;
+ }
te = rte_zmalloc("HASH_TAILQ_ENTRY", sizeof(*te), 0);
if (te == NULL) {
Index: dpdk/lib/librte_hash/rte_fbk_hash.c
===================================================================
--- dpdk.orig/lib/librte_hash/rte_fbk_hash.c
+++ dpdk/lib/librte_hash/rte_fbk_hash.c
@@ -140,8 +140,11 @@ rte_fbk_hash_create(const struct rte_fbk
if (strncmp(params->name, ht->name, RTE_FBK_HASH_NAMESIZE) == 0)
break;
}
- if (te != NULL)
+ ht = NULL;
+ if (te != NULL) {
+ rte_errno = EEXIST;
goto exit;
+ }
te = rte_zmalloc("FBK_HASH_TAILQ_ENTRY", sizeof(*te), 0);
if (te == NULL) {

View File

@ -0,0 +1,160 @@
Description: backport of dpdk 16.04-rc fix for LP: #1568838
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-04-11
From 5d7bfb7337e917c8d97b43a75264789b01b6cfce Mon Sep 17 00:00:00 2001
From: Olivier Matz <olivier.matz@6wind.com>
Date: Wed, 6 Apr 2016 15:28:00 +0200
Subject: [PATCH] hash: fix race condition at creation
To avoid a race condition while creating a new hash object, the
list has to be locked before the lookup, and released only once the
new object is added in the list.
As the lock is held by the rte_ring_create(), move its creation at the
beginning of the function and only take the lock after the ring is
created to avoid a deadlock.
Fixes: 48a3991196 ("hash: replace with cuckoo hash implementation")
Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
Acked-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
---
lib/librte_hash/rte_cuckoo_hash.c | 70 ++++++++++++++++++++++-----------------
1 file changed, 40 insertions(+), 30 deletions(-)
Index: dpdk/lib/librte_hash/rte_cuckoo_hash.c
===================================================================
--- dpdk.orig/lib/librte_hash/rte_cuckoo_hash.c
+++ dpdk/lib/librte_hash/rte_cuckoo_hash.c
@@ -296,19 +296,48 @@ rte_hash_create(const struct rte_hash_pa
if (params->extra_flag & RTE_HASH_EXTRA_FLAGS_TRANS_MEM_SUPPORT)
hw_trans_mem_support = 1;
+ /* Store all keys and leave the first entry as a dummy entry for lookup_bulk */
+ if (hw_trans_mem_support)
+ /*
+ * Increase number of slots by total number of indices
+ * that can be stored in the lcore caches
+ * except for the first cache
+ */
+ num_key_slots = params->entries + (RTE_MAX_LCORE - 1) *
+ LCORE_CACHE_SIZE + 1;
+ else
+ num_key_slots = params->entries + 1;
+
+ snprintf(ring_name, sizeof(ring_name), "HT_%s", params->name);
+ r = rte_ring_create(ring_name, rte_align32pow2(num_key_slots),
+ params->socket_id, 0);
+ if (r == NULL) {
+ RTE_LOG(ERR, HASH, "memory allocation failed\n");
+ goto err;
+ }
+
snprintf(hash_name, sizeof(hash_name), "HT_%s", params->name);
- /* Guarantee there's no existing */
- h = rte_hash_find_existing(params->name);
- if (h != NULL) {
+ rte_rwlock_write_lock(RTE_EAL_TAILQ_RWLOCK);
+
+ /* guarantee there's no existing: this is normally already checked
+ * by ring creation above */
+ TAILQ_FOREACH(te, hash_list, next) {
+ h = (struct rte_hash *) te->data;
+ if (strncmp(params->name, h->name, RTE_HASH_NAMESIZE) == 0)
+ break;
+ }
+ h = NULL;
+ if (te != NULL) {
rte_errno = EEXIST;
- return NULL;
+ te = NULL;
+ goto err_unlock;
}
te = rte_zmalloc("HASH_TAILQ_ENTRY", sizeof(*te), 0);
if (te == NULL) {
RTE_LOG(ERR, HASH, "tailq entry allocation failed\n");
- goto err;
+ goto err_unlock;
}
h = (struct rte_hash *)rte_zmalloc_socket(hash_name, sizeof(struct rte_hash),
@@ -316,7 +345,7 @@ rte_hash_create(const struct rte_hash_pa
if (h == NULL) {
RTE_LOG(ERR, HASH, "memory allocation failed\n");
- goto err;
+ goto err_unlock;
}
const uint32_t num_buckets = rte_align32pow2(params->entries)
@@ -328,23 +357,10 @@ rte_hash_create(const struct rte_hash_pa
if (buckets == NULL) {
RTE_LOG(ERR, HASH, "memory allocation failed\n");
- goto err;
+ goto err_unlock;
}
const uint32_t key_entry_size = sizeof(struct rte_hash_key) + params->key_len;
-
- /* Store all keys and leave the first entry as a dummy entry for lookup_bulk */
- if (hw_trans_mem_support)
- /*
- * Increase number of slots by total number of indices
- * that can be stored in the lcore caches
- * except for the first cache
- */
- num_key_slots = params->entries + (RTE_MAX_LCORE - 1) *
- LCORE_CACHE_SIZE + 1;
- else
- num_key_slots = params->entries + 1;
-
const uint64_t key_tbl_size = (uint64_t) key_entry_size * num_key_slots;
k = rte_zmalloc_socket(NULL, key_tbl_size,
@@ -352,7 +368,7 @@ rte_hash_create(const struct rte_hash_pa
if (k == NULL) {
RTE_LOG(ERR, HASH, "memory allocation failed\n");
- goto err;
+ goto err_unlock;
}
/*
@@ -395,14 +411,6 @@ rte_hash_create(const struct rte_hash_pa
h->cmp_jump_table_idx = KEY_OTHER_BYTES;
#endif
- snprintf(ring_name, sizeof(ring_name), "HT_%s", params->name);
- r = rte_ring_create(ring_name, rte_align32pow2(num_key_slots),
- params->socket_id, 0);
- if (r == NULL) {
- RTE_LOG(ERR, HASH, "memory allocation failed\n");
- goto err;
- }
-
if (hw_trans_mem_support) {
h->local_free_slots = rte_zmalloc_socket(NULL,
sizeof(struct lcore_cache) * RTE_MAX_LCORE,
@@ -429,13 +437,15 @@ rte_hash_create(const struct rte_hash_pa
for (i = 1; i < params->entries + 1; i++)
rte_ring_sp_enqueue(r, (void *)((uintptr_t) i));
- rte_rwlock_write_lock(RTE_EAL_TAILQ_RWLOCK);
te->data = (void *) h;
TAILQ_INSERT_TAIL(hash_list, te, next);
rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK);
return h;
+err_unlock:
+ rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK);
err:
+ rte_ring_free(r);
rte_free(te);
rte_free(h);
rte_free(buckets);

View File

@ -0,0 +1,36 @@
Description: backport of dpdk 16.04-rc fix for LP: #1568838
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-04-11
From fe671356ed0d9b349bd257b8fcb30adf7da103e1 Mon Sep 17 00:00:00 2001
From: Daniel Mrzyglod <danielx.t.mrzyglod@intel.com>
Date: Mon, 11 Apr 2016 11:46:54 +0200
Subject: [PATCH] vfio: fix resource leak
Coverity ID 13289: Resource leak:
The system resource will not be reclaimed and reused,
reducing the future availability of the resource.
In pci_vfio_get_group_fd: Leak of memory or pointers to system resources
Fixes: ff0b67d1c868 ("vfio: DMA mapping")
Signed-off-by: Daniel Mrzyglod <danielx.t.mrzyglod@intel.com>
Acked-by: Anatoly Burakov <anatoly.burakov@intel.com>
---
lib/librte_eal/linuxapp/eal/eal_pci_vfio.c | 1 +
1 file changed, 1 insertion(+)
Index: dpdk/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c
===================================================================
--- dpdk.orig/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c
+++ dpdk/lib/librte_eal/linuxapp/eal/eal_pci_vfio.c
@@ -448,6 +448,7 @@ pci_vfio_get_group_fd(int iommu_group_no
/* if the fd is valid, create a new group for it */
if (vfio_cfg.vfio_group_idx == VFIO_MAX_GROUPS) {
RTE_LOG(ERR, EAL, "Maximum number of VFIO groups reached!\n");
+ close(vfio_group_fd);
return -1;
}
vfio_cfg.vfio_groups[vfio_cfg.vfio_group_idx].group_no = iommu_group_no;

View File

@ -0,0 +1,141 @@
Description: backport of dpdk fix for LP: #1566874
Forwarded: n/a (already discussed upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-04-11
Extended by Christian Ehrhardt <christian.ehrhardt@canonical.com>
Close fd on vserver->listenfd (Part of the upstream discussion)
Original:
From: Patrik Andersson <patrik.r.andersson@ericsson.com>
Protect against DPDK crash when allocation of listen fd >= 1023.
For events on fd:s >1023, the current implementation will trigger
an abort due to access outside of allocated bit mask.
Corrections would include:
* Match fdset_add() signature in fd_man.c to fd_man.h
* Handling of return codes from fdset_add()
* Addition of check of fd number in fdset_add_fd()
The rationale behind the suggested code change is that,
fdset_event_dispatch() could attempt access outside of the FD_SET
bitmask if there is an event on a file descriptor that in turn
looks up a virtio file descriptor with a value > 1023.
Such an attempt will lead to an abort() and a restart of any
vswitch using DPDK.
A discussion topic exist in the ovs-discuss mailing list that can
provide a little more background:
http://openvswitch.org/pipermail/discuss/2016-February/020243.html
Signed-off-by: Patrik Andersson <patrik.r.andersson@ericsson.com>
---
fd_man.c | 11 ++++++-----
vhost-net-user.c | 23 +++++++++++++++++++++--
2 files changed, 27 insertions(+), 7 deletions(-)
Index: dpdk/lib/librte_vhost/vhost_user/fd_man.c
===================================================================
--- dpdk.orig/lib/librte_vhost/vhost_user/fd_man.c
+++ dpdk/lib/librte_vhost/vhost_user/fd_man.c
@@ -71,20 +71,22 @@ fdset_find_free_slot(struct fdset *pfdse
return fdset_find_fd(pfdset, -1);
}
-static void
+static int
fdset_add_fd(struct fdset *pfdset, int idx, int fd,
fd_cb rcb, fd_cb wcb, void *dat)
{
struct fdentry *pfdentry;
- if (pfdset == NULL || idx >= MAX_FDS)
- return;
+ if (pfdset == NULL || idx >= MAX_FDS || fd >= FD_SETSIZE)
+ return -1;
pfdentry = &pfdset->fd[idx];
pfdentry->fd = fd;
pfdentry->rcb = rcb;
pfdentry->wcb = wcb;
pfdentry->dat = dat;
+
+ return 0;
}
/**
@@ -150,12 +152,11 @@ fdset_add(struct fdset *pfdset, int fd,
/* Find a free slot in the list. */
i = fdset_find_free_slot(pfdset);
- if (i == -1) {
+ if (i == -1 || fdset_add_fd(pfdset, i, fd, rcb, wcb, dat) < 0) {
pthread_mutex_unlock(&pfdset->fd_mutex);
return -2;
}
- fdset_add_fd(pfdset, i, fd, rcb, wcb, dat);
pfdset->num++;
pthread_mutex_unlock(&pfdset->fd_mutex);
Index: dpdk/lib/librte_vhost/vhost_user/vhost-net-user.c
===================================================================
--- dpdk.orig/lib/librte_vhost/vhost_user/vhost-net-user.c
+++ dpdk/lib/librte_vhost/vhost_user/vhost-net-user.c
@@ -288,6 +288,7 @@ vserver_new_vq_conn(int fd, void *dat, _
int fh;
struct vhost_device_ctx vdev_ctx = { (pid_t)0, 0 };
unsigned int size;
+ int ret;
conn_fd = accept(fd, NULL, NULL);
RTE_LOG(INFO, VHOST_CONFIG,
@@ -317,8 +318,15 @@ vserver_new_vq_conn(int fd, void *dat, _
ctx->vserver = vserver;
ctx->fh = fh;
- fdset_add(&g_vhost_server.fdset,
+ ret = fdset_add(&g_vhost_server.fdset,
conn_fd, vserver_message_handler, NULL, ctx);
+ if (ret < 0) {
+ free(ctx);
+ close(conn_fd);
+ RTE_LOG(ERR, VHOST_CONFIG,
+ "failed to add fd %d into vhost server fdset\n",
+ conn_fd);
+ }
}
/* callback when there is message on the connfd */
@@ -447,6 +455,7 @@ int
rte_vhost_driver_register(const char *path)
{
struct vhost_server *vserver;
+ int ret;
pthread_mutex_lock(&g_vhost_server.server_mutex);
if (ops == NULL)
@@ -474,8 +483,18 @@ rte_vhost_driver_register(const char *pa
vserver->path = strdup(path);
- fdset_add(&g_vhost_server.fdset, vserver->listenfd,
+ ret = fdset_add(&g_vhost_server.fdset, vserver->listenfd,
vserver_new_vq_conn, NULL, vserver);
+ if (ret < 0) {
+ pthread_mutex_unlock(&g_vhost_server.server_mutex);
+ RTE_LOG(ERR, VHOST_CONFIG,
+ "failed to add listen fd %d to vhost server fdset\n",
+ vserver->listenfd);
+ close(vserver->listenfd);
+ free(vserver->path);
+ free(vserver);
+ return -1;
+ }
g_vhost_server.server[g_vhost_server.vserver_cnt++] = vserver;
pthread_mutex_unlock(&g_vhost_server.server_mutex);

View File

@ -0,0 +1,54 @@
Description: backport of dpdk 16.04-rc fix for LP: #1568838
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-04-12
From 356445f97a28b66bce9e7300e21fdcfa7def55c9 Mon Sep 17 00:00:00 2001
From: Jasvinder Singh <jasvinder.singh@intel.com>
Date: Mon, 11 Apr 2016 18:55:37 +0100
Subject: [PATCH] port: fix ring writer buffer overflow
Fixes the buffer overflow that occurs due to following;
1. When the input packet burst does not meet the conditions: (a) being
contiguous (first n bits set in pkts_mask, all the other bits cleared)
and (b) containing a full burst, i.e. at least tx_burst_sz packets
(n >= tx_burst_size). This is the slow(er) code path taken when local
variable expr != 0.
2. There are some packets already in the buffer.
3. The number of packets in the incoming burst (i.e. popcount(pkts_mask))
plus the number of packets already in the buffer exceeds the buffer size
(RTE_PORT_IN_BURST_SIZE_MAX, i.e. 64).
Fixes: bf6931b242f7 ("port: ring")
Fixes: 5f4cd47309d6 ("port: add ring writer nodrop")
Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
Acked-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
---
lib/librte_port/rte_port_ring.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
Index: dpdk/lib/librte_port/rte_port_ring.c
===================================================================
--- dpdk.orig/lib/librte_port/rte_port_ring.c
+++ dpdk/lib/librte_port/rte_port_ring.c
@@ -179,7 +179,7 @@ rte_port_ring_reader_stats_read(void *po
struct rte_port_ring_writer {
struct rte_port_out_stats stats;
- struct rte_mbuf *tx_buf[RTE_PORT_IN_BURST_SIZE_MAX];
+ struct rte_mbuf *tx_buf[2 * RTE_PORT_IN_BURST_SIZE_MAX];
struct rte_ring *ring;
uint32_t tx_burst_sz;
uint32_t tx_buf_count;
@@ -447,7 +447,7 @@ rte_port_ring_writer_stats_read(void *po
struct rte_port_ring_writer_nodrop {
struct rte_port_out_stats stats;
- struct rte_mbuf *tx_buf[RTE_PORT_IN_BURST_SIZE_MAX];
+ struct rte_mbuf *tx_buf[2 * RTE_PORT_IN_BURST_SIZE_MAX];
struct rte_ring *ring;
uint32_t tx_burst_sz;
uint32_t tx_buf_count;

View File

@ -0,0 +1,84 @@
Description: backport of dpdk 16.04-rc fix for LP: #1568838
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-04-12
From 52f7a5aeb190427232ba0289ec156e91ae68d3e6 Mon Sep 17 00:00:00 2001
From: Jasvinder Singh <jasvinder.singh@intel.com>
Date: Mon, 11 Apr 2016 18:54:46 +0100
Subject: [PATCH] port: fix burst size mask type
Fixes the variable bsz_mask type from uint32_t to uint64_t
Fixes: 4d97e8b565cc ("port: ethdev")
Fixes: 304c8091e90a ("port: add ethdev writer nodrop")
Fixes: 8dceb6aa6ecf ("port: hierarchical scheduler")
Fixes: 3e5966837a09 ("port: new Tx burst implementation of ring writer")
Fixes: 5f4cd47309d6 ("port: add ring writer nodrop")
Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
Acked-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
---
lib/librte_port/rte_port_ethdev.c | 4 ++--
lib/librte_port/rte_port_ring.c | 4 ++--
lib/librte_port/rte_port_sched.c | 2 +-
3 files changed, 5 insertions(+), 5 deletions(-)
Index: dpdk/lib/librte_port/rte_port_ethdev.c
===================================================================
--- dpdk.orig/lib/librte_port/rte_port_ethdev.c
+++ dpdk/lib/librte_port/rte_port_ethdev.c
@@ -229,7 +229,7 @@ rte_port_ethdev_writer_tx_bulk(void *por
{
struct rte_port_ethdev_writer *p =
(struct rte_port_ethdev_writer *) port;
- uint32_t bsz_mask = p->bsz_mask;
+ uint64_t bsz_mask = p->bsz_mask;
uint32_t tx_buf_count = p->tx_buf_count;
uint64_t expr = (pkts_mask & (pkts_mask + 1)) |
((pkts_mask & bsz_mask) ^ bsz_mask);
@@ -436,7 +436,7 @@ rte_port_ethdev_writer_nodrop_tx_bulk(vo
struct rte_port_ethdev_writer_nodrop *p =
(struct rte_port_ethdev_writer_nodrop *) port;
- uint32_t bsz_mask = p->bsz_mask;
+ uint64_t bsz_mask = p->bsz_mask;
uint32_t tx_buf_count = p->tx_buf_count;
uint64_t expr = (pkts_mask & (pkts_mask + 1)) |
((pkts_mask & bsz_mask) ^ bsz_mask);
Index: dpdk/lib/librte_port/rte_port_ring.c
===================================================================
--- dpdk.orig/lib/librte_port/rte_port_ring.c
+++ dpdk/lib/librte_port/rte_port_ring.c
@@ -300,7 +300,7 @@ rte_port_ring_writer_tx_bulk_internal(vo
struct rte_port_ring_writer *p =
(struct rte_port_ring_writer *) port;
- uint32_t bsz_mask = p->bsz_mask;
+ uint64_t bsz_mask = p->bsz_mask;
uint32_t tx_buf_count = p->tx_buf_count;
uint64_t expr = (pkts_mask & (pkts_mask + 1)) |
((pkts_mask & bsz_mask) ^ bsz_mask);
@@ -614,7 +614,7 @@ rte_port_ring_writer_nodrop_tx_bulk_inte
struct rte_port_ring_writer_nodrop *p =
(struct rte_port_ring_writer_nodrop *) port;
- uint32_t bsz_mask = p->bsz_mask;
+ uint64_t bsz_mask = p->bsz_mask;
uint32_t tx_buf_count = p->tx_buf_count;
uint64_t expr = (pkts_mask & (pkts_mask + 1)) |
((pkts_mask & bsz_mask) ^ bsz_mask);
Index: dpdk/lib/librte_port/rte_port_sched.c
===================================================================
--- dpdk.orig/lib/librte_port/rte_port_sched.c
+++ dpdk/lib/librte_port/rte_port_sched.c
@@ -214,7 +214,7 @@ rte_port_sched_writer_tx_bulk(void *port
uint64_t pkts_mask)
{
struct rte_port_sched_writer *p = (struct rte_port_sched_writer *) port;
- uint32_t bsz_mask = p->bsz_mask;
+ uint64_t bsz_mask = p->bsz_mask;
uint32_t tx_buf_count = p->tx_buf_count;
uint64_t expr = (pkts_mask & (pkts_mask + 1)) |
((pkts_mask & bsz_mask) ^ bsz_mask);

View File

@ -0,0 +1,34 @@
Description: backport of dpdk 16.04 fix for LP: #1570195
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-04-19
From ee4e23ada8cb0fcb566295756d30bd21e757c783 Mon Sep 17 00:00:00 2001
From: Huawei Xie <huawei.xie@intel.com>
Date: Tue, 8 Mar 2016 23:33:39 +0800
Subject: [PATCH] pci: identify devices not managed by any kernel driver
Use RTE_KDRV_NONE to indicate that kernel driver (other than VFIO/UIO) isn't
managing the device.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
Acked-by: David Marchand <david.marchand@6wind.com>
---
lib/librte_eal/linuxapp/eal/eal_pci.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Index: dpdk/lib/librte_eal/linuxapp/eal/eal_pci.c
===================================================================
--- dpdk.orig/lib/librte_eal/linuxapp/eal/eal_pci.c
+++ dpdk/lib/librte_eal/linuxapp/eal/eal_pci.c
@@ -362,7 +362,7 @@ pci_scan_one(const char *dirname, uint16
else
dev->kdrv = RTE_KDRV_UNKNOWN;
} else
- dev->kdrv = RTE_KDRV_UNKNOWN;
+ dev->kdrv = RTE_KDRV_NONE;
/* device is valid, add in list (sorted) */
if (TAILQ_EMPTY(&pci_device_list)) {

View File

@ -0,0 +1,94 @@
Description: backport of dpdk 16.04 fix for LP: #1570195
The whole infrastructure of 756ce64b1ecd eal: "introduce PCI ioport API" was
introduced post DPDK 2.2.
Old virtio is not using lib/librte_eal/linuxapp/eal/eal_pci.c:pci_map_device
New Code:
vtpci_init
First tries for modern device -> virtio_read_caps -> rte_eal_pci_map_device
This detects and returns with "Not managed by a supported kernel driver"
Then legacy_virtio_resource_init -> rte_eal_pci_ioport_mapi
This is where the original patch added the check
vtpci_init came in c52afa68 "virtio: move left PCI stuff in the right file"
Old code was eth_virtio_dev_init -> virtio_resource_init(pci_dev)
The logic of the new patch isn't too complex, just the places don't exist
yet. So we add a semantically equivalent check just before virtio_resource_init.
Additionally I added a message to make it more clear what happened:
EAL: PCI device 0000:00:04.0 on NUMA socket -1
EAL: probe driver: 1af4:1000 rte_virtio_pmd
=> PMD: device not available (in use by the kernel)
EAL: Error - exiting with code: 1
Cause: Requested device 0000:00:04.0 cannot be used
Forwarded: n/a (already upstream)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-04-19
From b8eb345378bdefc4c976eaaf5abb221e0aca3460 Mon Sep 17 00:00:00 2001
From: Huawei Xie <huawei.xie@intel.com>
Date: Tue, 8 Mar 2016 23:33:42 +0800
Subject: [PATCH] pci: ignore devices already managed in Linux when mapping x86
ioport
call pci_ioport_map (on x86) only if the pci device is not bound
to a kernel driver.
Signed-off-by: Huawei Xie <huawei.xie@intel.com>
Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
Acked-by: David Marchand <david.marchand@6wind.com>
---
lib/librte_eal/linuxapp/eal/eal_pci.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
Index: dpdk/drivers/net/virtio/virtio_ethdev.c
===================================================================
--- dpdk.orig/drivers/net/virtio/virtio_ethdev.c
+++ dpdk/drivers/net/virtio/virtio_ethdev.c
@@ -1219,6 +1219,34 @@ static int virtio_resource_init(struct r
}
#endif
+static int virtio_resource_available(struct rte_pci_device *pci_dev)
+{
+ int ret = -1;
+
+ /* only use virtio devices if bound on a supported or no driver
+ * backport of b8eb3453 "pci: ignore devices already managed in Linux
+ * when mapping x86"
+ * Fixes (LP #1570195) and avoids various workarounds and warnings
+ * that formerly were needed */
+ switch (pci_dev->kdrv) {
+#ifdef VFIO_PRESENT
+ case RTE_KDRV_VFIO:
+#endif
+ case RTE_KDRV_IGB_UIO:
+ case RTE_KDRV_UIO_GENERIC:
+ case RTE_KDRV_NONE:
+ ret = 1;
+ break;
+ default:
+ RTE_LOG(ERR, PMD, "device not available for DPDK"
+ " (in use by kernel)\n");
+ ret = -1;
+ break;
+ }
+
+ return ret;
+}
+
/*
* Process Virtio Config changed interrupt and call the callback
* if link state changed.
@@ -1289,6 +1317,9 @@ eth_virtio_dev_init(struct rte_eth_dev *
pci_dev = eth_dev->pci_dev;
+ if (virtio_resource_available(pci_dev) < 0)
+ return -1;
+
if (virtio_resource_init(pci_dev) < 0)
return -1;

View File

@ -0,0 +1,77 @@
Description: backport of dpdk 16.07 fix for LP: #1570466
Backported from this discussion
http://dpdk.org/dev/patchwork/patch/12103/
Not accepted yet, but likely to be accepted in some form once tested and
confirmed.
new fix also relies on a lot of new code, vhost_destroy_device looks totally
different from the former destroy_device.
History on todays function content:
4796ad63 - original code moved from examples to lib
a90ca1a1 - this replaces ops->destroy_device with vhost_destroy_device
71dc571e - simple check against null pointers
45ca9c6f - this changed the code from linked list to arrays
New code cleans with:
notify_ops->destroy_device (callback into the parent)
cleanup_device was existing before even in 2.2 code
free_device as well existing before even in 2.2 code
Old code cleans with:
notify_ops->destroy_device - still there
rm_config_ll_entry -> eventually calls cleanup_device and free_device
(just in the more complex linked list way)
So the only adaption for backporting needed is to replace vhost_destroy_device
with ops->destroy_device(ctx)
Also along the discussion vserver-fh is now initialized with -1 to avoid
accidentially deleting the first connected port if we delete another not yet
connected port.
Forwarded: yes (based on an upstream discussion)
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-04-19
Index: dpdk/lib/librte_vhost/vhost_user/vhost-net-user.c
===================================================================
--- dpdk.orig/lib/librte_vhost/vhost_user/vhost-net-user.c
+++ dpdk/lib/librte_vhost/vhost_user/vhost-net-user.c
@@ -310,6 +310,7 @@ vserver_new_vq_conn(int fd, void *dat, _
}
vdev_ctx.fh = fh;
+ vserver->fh = fh;
size = strnlen(vserver->path, PATH_MAX);
ops->set_ifname(vdev_ctx, vserver->path,
size);
@@ -482,6 +483,7 @@ rte_vhost_driver_register(const char *pa
}
vserver->path = strdup(path);
+ vserver->fh = -1;
ret = fdset_add(&g_vhost_server.fdset, vserver->listenfd,
vserver_new_vq_conn, NULL, vserver);
@@ -516,6 +518,11 @@ rte_vhost_driver_unregister(const char *
for (i = 0; i < g_vhost_server.vserver_cnt; i++) {
if (!strcmp(g_vhost_server.server[i]->path, path)) {
+ struct vhost_device_ctx ctx;
+
+ ctx.fh = g_vhost_server.server[i]->fh;
+ ops->destroy_device(ctx);
+
fdset_del(&g_vhost_server.fdset,
g_vhost_server.server[i]->listenfd);
Index: dpdk/lib/librte_vhost/vhost_user/vhost-net-user.h
===================================================================
--- dpdk.orig/lib/librte_vhost/vhost_user/vhost-net-user.h
+++ dpdk/lib/librte_vhost/vhost_user/vhost-net-user.h
@@ -43,6 +43,7 @@
struct vhost_server {
char *path; /**< The path the uds is bind to. */
int listenfd; /**< The listener sockfd. */
+ uint32_t fh;
};
/* refer to hw/virtio/vhost-user.c */

View File

@ -0,0 +1,51 @@
Description: build: Set soabi for the combined shared library
Currently the build for the combined shared library does not set
any ABI version. Since this deviates from upstream we start with
version 0.
Probably it would be ok if upstream kept individual ABI versions
for each individual library. Then the combined one would have to
be incremented whenever any of those changes version.
Though to me it would feel more logical if there would be only
one ABI version for the whole set.
Forwarded: Not yet. Needs discussion about library versioning.
Author: Stefan Bader <stefan.bader@canonical.com>
Last-Update: 2015-12-01
--- a/mk/rte.sharelib.mk
+++ b/mk/rte.sharelib.mk
@@ -33,10 +33,12 @@
# VPATH contains at least SRCDIR
VPATH += $(SRCDIR)
+# The shared libs abi number.
+LIBABIVER := 0
ifeq ($(CONFIG_RTE_BUILD_COMBINE_LIBS),y)
ifeq ($(CONFIG_RTE_BUILD_SHARED_LIB),y)
-LIB_ONE := lib$(RTE_LIBNAME).so
+LIB_ONE := lib$(RTE_LIBNAME).so.$(LIBABIVER)
else
LIB_ONE := lib$(RTE_LIBNAME).a
endif
@@ -54,10 +56,10 @@
LD := $(CC) $(CPU_CFLAGS)
O_TO_S = $(LD) $(call linkerprefix,$(CPU_LDFLAGS)) \
$(call linkerprefix,$(COMBINED_LDFLAGS)) \
- -shared $(OBJS) -o $(RTE_OUTPUT)/lib/$(LIB_ONE)
+ -shared $(OBJS) -Wl,-soname,$(LIB_ONE) -o $(RTE_OUTPUT)/lib/$(LIB_ONE)
else
O_TO_S = $(LD) $(CPU_LDFLAGS) $(COMBINED_LDFLAGS) \
- -shared $(OBJS) -o $(RTE_OUTPUT)/lib/$(LIB_ONE)
+ -shared $(OBJS) -Wl,-soname,$(LIB_ONE) -o $(RTE_OUTPUT)/lib/$(LIB_ONE)
endif
O_TO_S_STR = $(subst ','\'',$(O_TO_S)) #'# fix syntax highlight
@@ -84,6 +86,8 @@
@[ -d $(dir $@) ] || mkdir -p $(dir $@)
@$(SRCDIR)/scripts/merge-maps.sh > $(COMBINED_MAP)
$(O_TO_S_DO)
+ @[ -L $(RTE_OUTPUT)/lib/$(basename $(LIB_ONE)) ] || \
+ ln -s $(LIB_ONE) $(RTE_OUTPUT)/lib/$(basename $(LIB_ONE))
else
$(LIB_ONE): FORCE
@[ -d $(dir $@) ] || mkdir -p $(dir $@)

View File

@ -0,0 +1,16 @@
Description: build: Fix doc install path
Missing mkdir breaks building docs only
Forwarded: yes
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-01-18
diff --git a/mk/rte.sdkinstall.mk b/mk/rte.sdkinstall.mk
index c159bf7..68e56b6 100644
--- a/mk/rte.sdkinstall.mk
+++ b/mk/rte.sdkinstall.mk
@@ -157,4 +157,5 @@ ifneq ($(wildcard $O/doc/*/*/*pdf),)
$(Q)$(call rte_mkdir, $(DESTDIR)$(docdir)/guides)
$(Q)cp -a $O/doc/*/*/*pdf $(DESTDIR)$(docdir)/guides
endif
+ $(Q)$(call rte_mkdir, $(DESTDIR)$(datadir))
$(Q)cp -a $(RTE_SDK)/examples $(DESTDIR)$(datadir)

View File

@ -0,0 +1,33 @@
Description: build: Fix linkage of combined shared library
Currently the build for the combined shared library does not store
its own dependencies. Forcing consumers of the .so to know about internal
dependencies and adding them as -l in their compile.
This patch adds the correct linkage for the currently packaged library
Forwarded: No, upstream will solve it for DPDK 2.3 via linker script
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-02-24
--- a/mk/rte.sharelib.mk
+++ b/mk/rte.sharelib.mk
@@ -51,12 +51,20 @@ sharelib: $(LIB_ONE) FORCE
OBJS = $(wildcard $(RTE_OUTPUT)/build/lib/*.o)
+# fix linkage of combined shared library, so that app linking against it don't
+# need to know the internal dependencies.
+# Derived from a test run of mk/rtc.app.mk _LDLIBS-y and EXECENV_LDLIBS
+# static until moving to linker script see LP: 1547517 and LP: 1546547 for more
+# This fixes only the build path the ubuntu packaging currently passes
+MISSINGLINKAGE = -lpcap -lxenstore -lpthread $(EXECENV_LDLIBS)
+
ifeq ($(LINK_USING_CC),1)
# Override the definition of LD here, since we're linking with CC
LD := $(CC) $(CPU_CFLAGS)
O_TO_S = $(LD) $(call linkerprefix,$(CPU_LDFLAGS)) \
$(call linkerprefix,$(COMBINED_LDFLAGS)) \
- -shared $(OBJS) -Wl,-soname,$(LIB_ONE) -o $(RTE_OUTPUT)/lib/$(LIB_ONE)
+ -shared $(OBJS) $(MISSINGLINKAGE) \
+ -Wl,-soname,$(LIB_ONE) -o $(RTE_OUTPUT)/lib/$(LIB_ONE)
else
O_TO_S = $(LD) $(CPU_LDFLAGS) $(COMBINED_LDFLAGS) \
-shared $(OBJS) -Wl,-soname,$(LIB_ONE) -o $(RTE_OUTPUT)/lib/$(LIB_ONE)

View File

@ -0,0 +1,75 @@
Description: lpm/lpm6: fix use after free and missing frees
In certain autotests lpm->max_rules turned out to be non initialized.
Also lpm6 autotests failed with the default alloc of 512M Memory.
While >=2500M was a workaround it became clear while debugging that it
had a leak.
That eventually led to the identification of various use after free and leaks
in the lpm/lpm6 code.
Along that is also makes the RTE_LOG messages of the failed allocation unique.
The patches are upstream accepted in 4 pieces now.
This combines them plus a minor tweak currently in review at
http://dpdk.org/dev/patchwork/patch/12025/
Forwarded: Yes - accepted 768f0e45 732a5b5c 34c4b584 d4c18f0a
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-04-12
Index: dpdk/lib/librte_lpm/rte_lpm.c
===================================================================
--- dpdk.orig/lib/librte_lpm/rte_lpm.c
+++ dpdk/lib/librte_lpm/rte_lpm.c
@@ -236,13 +236,10 @@ rte_lpm_free(struct rte_lpm *lpm)
if (te->data == (void *) lpm)
break;
}
- if (te == NULL) {
- rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK);
- return;
+ if (te != NULL) {
+ TAILQ_REMOVE(lpm_list, te, next);
}
- TAILQ_REMOVE(lpm_list, te, next);
-
rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK);
rte_free(lpm);
Index: dpdk/lib/librte_lpm/rte_lpm6.c
===================================================================
--- dpdk.orig/lib/librte_lpm/rte_lpm6.c
+++ dpdk/lib/librte_lpm/rte_lpm6.c
@@ -206,8 +206,9 @@ rte_lpm6_create(const char *name, int so
(size_t)rules_size, RTE_CACHE_LINE_SIZE, socket_id);
if (lpm->rules_tbl == NULL) {
- RTE_LOG(ERR, LPM, "LPM memory allocation failed\n");
+ RTE_LOG(ERR, LPM, "LPM rules_tbl allocation failed\n");
rte_free(lpm);
+ lpm = NULL;
rte_free(te);
goto exit;
}
@@ -277,15 +278,14 @@ rte_lpm6_free(struct rte_lpm6 *lpm)
if (te->data == (void *) lpm)
break;
}
- if (te == NULL) {
- rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK);
- return;
- }
- TAILQ_REMOVE(lpm_list, te, next);
+ if (te != NULL) {
+ TAILQ_REMOVE(lpm_list, te, next);
+ }
rte_rwlock_write_unlock(RTE_EAL_TAILQ_RWLOCK);
+ rte_free(lpm->rules_tbl);
rte_free(lpm);
rte_free(te);
}

View File

@ -0,0 +1,77 @@
Description: build: avoid testpmd only working in XEN
With LIBRTE_PMD_XENVIRT enabled testpmd is built in a way to ONLY work
in XEN environments.
It will surface as:
PMD: gntalloc: ioctl error
EAL: Error - exiting with code: 1
Cause: Creation of mbuf pool for socket 0 failed
There could be a complex solution checking if this is a Xen env via
something like:
#include <xenstore.h>
struct xs_handle *xsh = NULL;
xsh = xs_open(XS_OPEN_READONLY);
check for xsh being NULL ...
But I see no reason to go so complex and instead the patch goes the
simple and more readable way of just falling back to the normal
allocation if the xen based allocation failed.
Forwarded: Yes - Accepted as bece7b6cf6849331c1817e1034c03fab251952a7
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-04-12
Index: dpdk/app/test-pmd/testpmd.c
===================================================================
--- dpdk.orig/app/test-pmd/testpmd.c
+++ dpdk/app/test-pmd/testpmd.c
@@ -410,7 +410,7 @@ mbuf_pool_create(uint16_t mbuf_seg_size,
unsigned int socket_id)
{
char pool_name[RTE_MEMPOOL_NAMESIZE];
- struct rte_mempool *rte_mp;
+ struct rte_mempool *rte_mp = NULL;
uint32_t mb_size;
mb_size = sizeof(struct rte_mbuf) + mbuf_seg_size;
@@ -423,24 +423,23 @@ mbuf_pool_create(uint16_t mbuf_seg_size,
rte_pktmbuf_pool_init, NULL,
rte_pktmbuf_init, NULL,
socket_id, 0);
-
-
-
-#else
- if (mp_anon != 0)
- rte_mp = mempool_anon_create(pool_name, nb_mbuf, mb_size,
- (unsigned) mb_mempool_cache,
- sizeof(struct rte_pktmbuf_pool_private),
- rte_pktmbuf_pool_init, NULL,
- rte_pktmbuf_init, NULL,
- socket_id, 0);
- else
- /* wrapper to rte_mempool_create() */
- rte_mp = rte_pktmbuf_pool_create(pool_name, nb_mbuf,
- mb_mempool_cache, 0, mbuf_seg_size, socket_id);
-
#endif
+ /* if the former XEN allocation failed fall back to normal allocation */
+ if (rte_mp == NULL) {
+ if (mp_anon != 0)
+ rte_mp = mempool_anon_create(pool_name, nb_mbuf,
+ mb_size, (unsigned) mb_mempool_cache,
+ sizeof(struct rte_pktmbuf_pool_private),
+ rte_pktmbuf_pool_init, NULL,
+ rte_pktmbuf_init, NULL,
+ socket_id, 0);
+ else
+ /* wrapper to rte_mempool_create() */
+ rte_mp = rte_pktmbuf_pool_create(pool_name, nb_mbuf,
+ mb_mempool_cache, 0, mbuf_seg_size, socket_id);
+ }
+
if (rte_mp == NULL) {
rte_exit(EXIT_FAILURE, "Creation of mbuf pool for socket %u "
"failed\n", socket_id);

View File

@ -0,0 +1,350 @@
Description: eal: provide option to set vhost_user socket owner/permissions
The API doesn't hold a way to specify a owner/permission set for vhost_user
created sockets.
Projects consuming DPDK started to do 'their own workarounds' like openvswitch
https://patchwork.ozlabs.org/patch/559043/
https://patchwork.ozlabs.org/patch/559045/
But for this specific example they are blocked/stalled behind a bigger
rework (https://patchwork.ozlabs.org/patch/604898/).
We need something now for existing code linking against DPDK. That implies to
avoid changing API/ABI. So I created a DPDK EAL commandline option based ideas
in the former patches.
Fixes LP: #1546565
Forwarded: yes
Author: Christian Ehrhardt <christian.ehrhardt@canonical.com>
Last-Update: 2016-04-24
Index: dpdk/lib/librte_eal/common/eal_common_options.c
===================================================================
--- dpdk.orig/lib/librte_eal/common/eal_common_options.c
+++ dpdk/lib/librte_eal/common/eal_common_options.c
@@ -95,6 +95,8 @@ eal_long_options[] = {
{OPT_VFIO_INTR, 1, NULL, OPT_VFIO_INTR_NUM },
{OPT_VMWARE_TSC_MAP, 0, NULL, OPT_VMWARE_TSC_MAP_NUM },
{OPT_XEN_DOM0, 0, NULL, OPT_XEN_DOM0_NUM },
+ {OPT_VHOST_OWNER, 1, NULL, OPT_VHOST_OWNER_NUM },
+ {OPT_VHOST_PERM, 1, NULL, OPT_VHOST_PERM_NUM },
{0, 0, NULL, 0 }
};
@@ -153,6 +155,8 @@ eal_reset_internal_config(struct interna
#endif
internal_cfg->vmware_tsc_map = 0;
internal_cfg->create_uio_dev = 0;
+ internal_cfg->vhost_sock_owner = NULL;
+ internal_cfg->vhost_sock_perm = NULL;
}
static int
Index: dpdk/lib/librte_eal/common/eal_internal_cfg.h
===================================================================
--- dpdk.orig/lib/librte_eal/common/eal_internal_cfg.h
+++ dpdk/lib/librte_eal/common/eal_internal_cfg.h
@@ -83,6 +83,8 @@ struct internal_config {
volatile enum rte_intr_mode vfio_intr_mode;
const char *hugefile_prefix; /**< the base filename of hugetlbfs files */
const char *hugepage_dir; /**< specific hugetlbfs directory to use */
+ const char *vhost_sock_owner; /**< owner:group of vhost_user sockets */
+ const char *vhost_sock_perm; /**< permissions of vhost_user sockets */
unsigned num_hugepage_sizes; /**< how many sizes on this system */
struct hugepage_info hugepage_info[MAX_HUGEPAGE_SIZES];
Index: dpdk/lib/librte_eal/common/eal_options.h
===================================================================
--- dpdk.orig/lib/librte_eal/common/eal_options.h
+++ dpdk/lib/librte_eal/common/eal_options.h
@@ -83,6 +83,10 @@ enum {
OPT_VMWARE_TSC_MAP_NUM,
#define OPT_XEN_DOM0 "xen-dom0"
OPT_XEN_DOM0_NUM,
+#define OPT_VHOST_OWNER "vhost-owner"
+ OPT_VHOST_OWNER_NUM,
+#define OPT_VHOST_PERM "vhost-perm"
+ OPT_VHOST_PERM_NUM,
OPT_LONG_MAX_NUM
};
Index: dpdk/lib/librte_vhost/vhost_user/vhost-net-user.c
===================================================================
--- dpdk.orig/lib/librte_vhost/vhost_user/vhost-net-user.c
+++ dpdk/lib/librte_vhost/vhost_user/vhost-net-user.c
@@ -51,6 +51,8 @@
#include "vhost-net.h"
#include "virtio-net-user.h"
+#include <rte_eal.h>
+
#define MAX_VIRTIO_BACKLOG 128
static void vserver_new_vq_conn(int fd, void *data, int *remove);
@@ -482,6 +484,8 @@ rte_vhost_driver_register(const char *pa
return -1;
}
+ rte_eal_set_socket_permissions(path);
+
vserver->path = strdup(path);
vserver->fh = -1;
Index: dpdk/lib/librte_eal/linuxapp/eal/eal.c
===================================================================
--- dpdk.orig/lib/librte_eal/linuxapp/eal/eal.c
+++ dpdk/lib/librte_eal/linuxapp/eal/eal.c
@@ -53,6 +53,9 @@
#if defined(RTE_ARCH_X86_64) || defined(RTE_ARCH_I686)
#include <sys/io.h>
#endif
+#include <sys/types.h>
+#include <pwd.h>
+#include <grp.h>
#include <rte_common.h>
#include <rte_debug.h>
@@ -343,6 +346,8 @@ eal_usage(const char *prgname)
" --"OPT_CREATE_UIO_DEV" Create /dev/uioX (usually done by hotplug)\n"
" --"OPT_VFIO_INTR" Interrupt mode for VFIO (legacy|msi|msix)\n"
" --"OPT_XEN_DOM0" Support running on Xen dom0 without hugetlbfs\n"
+ " --"OPT_VHOST_OWNER" Create vhost-user sockets with this owner:group\n"
+ " --"OPT_VHOST_PERM" Create vhost-user sockets with these permissions\n"
"\n");
/* Allow the application to print its usage message too if hook is set */
if ( rte_application_usage_hook ) {
@@ -618,6 +623,14 @@ eal_parse_args(int argc, char **argv)
internal_config.create_uio_dev = 1;
break;
+ case OPT_VHOST_OWNER_NUM:
+ internal_config.vhost_sock_owner = optarg;
+ break;
+
+ case OPT_VHOST_PERM_NUM:
+ internal_config.vhost_sock_perm = optarg;
+ break;
+
default:
if (opt < OPT_LONG_MIN_NUM && isprint(opt)) {
RTE_LOG(ERR, EAL, "Option %c is not supported "
@@ -932,3 +945,172 @@ rte_eal_check_module(const char *module_
/* Module has been found */
return 1;
}
+
+/* Try to double the size of '*buf', return true
+ * if successful, and '*sizep' will be updated with
+ * the new size. Otherwise, return false. */
+static int
+enlarge_buffer(char **buf, size_t *sizep)
+{
+ size_t newsize = *sizep * 2;
+
+ if (newsize > *sizep) {
+ *buf = realloc(*buf, newsize);
+ *sizep = newsize;
+ return 1;
+ }
+
+ return 0;
+}
+
+static int
+get_owners_from_str(const char *user_spec, uid_t *uid, gid_t *gid)
+{
+ size_t bufsize = 4096;
+
+ char *pos = strchr(user_spec, ':');
+ user_spec += strspn(user_spec, " \t\r\n");
+ size_t len = pos ? (size_t)(pos - user_spec) : strlen(user_spec);
+
+ char *buf = NULL;
+ struct passwd pwd, *res;
+ int e;
+
+ buf = malloc(bufsize);
+ char *user_search = NULL;
+ if (len) {
+ user_search = malloc(len + 1);
+ memcpy(user_search, user_spec, len);
+ user_search[len] = '\0';
+ while ((e = getpwnam_r(user_search, &pwd, buf, bufsize, &res)) == ERANGE) {
+ if (!enlarge_buffer(&buf, &bufsize)) {
+ break;
+ }
+ }
+
+ if (e != 0) {
+ RTE_LOG(ERR, EAL,"Failed to retrive user %s's uid (%s), aborting.",
+ user_search, strerror(e));
+ goto release;
+ }
+ if (res == NULL) {
+ RTE_LOG(ERR, EAL,"user %s not found, aborting.",
+ user_search);
+ e = -1;
+ goto release;
+ }
+ } else {
+ /* User name is not specified, use current user. */
+ while ((e = getpwuid_r(getuid(), &pwd, buf, bufsize, &res)) == ERANGE) {
+ if (!enlarge_buffer(&buf, &bufsize)) {
+ break;
+ }
+ }
+
+ if (e != 0) {
+ RTE_LOG(ERR, EAL,"Failed to retrive current user's uid "
+ "(%s), aborting.", strerror(e));
+ goto release;
+ }
+ user_search = strdup(pwd.pw_name);
+ }
+
+ if (uid)
+ *uid = pwd.pw_uid;
+
+ free(buf);
+ buf = NULL;
+
+ if (pos) {
+ char *grpstr = pos + 1;
+ grpstr += strspn(grpstr, " \t\r\n");
+
+ if (*grpstr) {
+ struct group grp, *res;
+
+ bufsize = 4096;
+ buf = malloc(bufsize);
+ while ((e = getgrnam_r(grpstr, &grp, buf, bufsize, &res))
+ == ERANGE) {
+ if (!enlarge_buffer(&buf, &bufsize)) {
+ break;
+ }
+ }
+
+ if (e) {
+ RTE_LOG(ERR, EAL,"Failed to get group entry for %s, "
+ "(%s), aborting.", grpstr,
+ strerror(e));
+ goto release;
+ }
+ if (res == NULL) {
+ RTE_LOG(ERR, EAL,"Group %s not found, aborting.",
+ grpstr);
+ e = -1;
+ goto release;
+ }
+
+ if (gid)
+ *gid = grp.gr_gid;
+ }
+ }
+
+ release:
+ free(buf);
+ free(user_search);
+ return e;
+}
+
+static void
+vhost_set_permissions(const char *vhost_sock_location)
+{
+ unsigned long int mode = strtoul(internal_config.vhost_sock_perm, NULL, 0);
+ int err = chmod(vhost_sock_location, (mode_t)mode);
+ if (err) {
+ RTE_LOG(ERR, EAL,"vhost-user socket cannot set"
+ " permissions to %s (%s).\n",
+ internal_config.vhost_sock_perm, strerror(err));
+ return;
+ }
+ RTE_LOG(INFO, EAL,"Socket %s changed permissions"
+ " to %s\n", vhost_sock_location,
+ internal_config.vhost_sock_perm);
+}
+
+static void
+vhost_set_ownership(const char *vhost_sock_location)
+{
+ uid_t vhuid=0;
+ gid_t vhgid=0;
+
+ if (get_owners_from_str(internal_config.vhost_sock_owner, &vhuid, &vhgid)) {
+ RTE_LOG(ERR, EAL,"vhost-user socket unable to get"
+ " specified user/group: %s\n",
+ internal_config.vhost_sock_owner);
+ return;
+ }
+
+ int err = chown(vhost_sock_location, vhuid, vhgid);
+ if (err) {
+ RTE_LOG(ERR, EAL,"vhost-user socket unable to set"
+ " ownership to %s (%s).\n",
+ internal_config.vhost_sock_owner, strerror(err));
+ return;
+ }
+
+ RTE_LOG(INFO, EAL,"Socket %s changed ownership"
+ " to %s.\n", vhost_sock_location,
+ internal_config.vhost_sock_owner);
+}
+
+void
+rte_eal_set_socket_permissions(const char *path)
+{
+ if (internal_config.vhost_sock_perm) {
+ vhost_set_permissions(path);
+ }
+
+ if (internal_config.vhost_sock_owner) {
+ vhost_set_ownership(path);
+ }
+}
Index: dpdk/lib/librte_eal/common/include/rte_eal.h
===================================================================
--- dpdk.orig/lib/librte_eal/common/include/rte_eal.h
+++ dpdk/lib/librte_eal/common/include/rte_eal.h
@@ -234,6 +234,11 @@ static inline int rte_gettid(void)
return RTE_PER_LCORE(_thread_id);
}
+/**
+ * Set owner/permissions on sockets if requested on EAL commandline
+ */
+void rte_eal_set_socket_permissions(const char *);
+
#ifdef __cplusplus
}
#endif
Index: dpdk/doc/guides/testpmd_app_ug/run_app.rst
===================================================================
--- dpdk.orig/doc/guides/testpmd_app_ug/run_app.rst
+++ dpdk/doc/guides/testpmd_app_ug/run_app.rst
@@ -156,6 +156,25 @@ See the DPDK Getting Started Guides for
Use malloc instead of hugetlbfs.
+* ``--vhost-owner``
+
+ When creating vhost_user sockets change owner and group to the specified value.
+ This can be given as ``user:group``, but also only ``user`` or ``:group`` are supported.
+
+ Examples::
+
+ --vhost-owner 'libvirt-qemu:kvm'
+ --vhost-owner 'libvirt-qemu'
+ --vhost-owner ':kvm'
+
+* ``--vhost-perm``
+
+ When creating vhost_user sockets set them up with these permissions.
+
+ For example::
+
+ --vhost-perm '0664'
+
Testpmd Command-line Options
----------------------------

159
ovs_build/dpdk_2.2.0/debian/rules Executable file
View File

@ -0,0 +1,159 @@
#!/usr/bin/make -f
# See debhelper(7) (uncomment to enable)
# output every command that modifies files on the build system.
#export DH_VERBOSE = 1
# see EXAMPLES in dpkg-buildflags(1) and read /usr/share/dpkg/*
DPKG_EXPORT_BUILDFLAGS = 1
include /usr/share/dpkg/default.mk
DEB_HOST_GNU_CPU := $(shell dpkg-architecture -qDEB_HOST_GNU_CPU)
# see FEATURE AREAS in dpkg-buildflags(1)
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
# build with debug symbols, dh_strip will create -dgbsyms packages by that
export EXTRA_CFLAGS = -g
# see ENVIRONMENT in dpkg-buildflags(1)
# package maintainers to append CFLAGS
#export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
# package maintainers to append LDFLAGS
#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
DPDK_CONFIG = "$(DEB_HOST_GNU_CPU)-native-linuxapp-gcc"
DPDK_STATIC_DIR = "debian/build/static-root"
DPDK_SHARED_DIR = "debian/build/shared-root"
clean:
dh_testdir
rm -rf debian/build debian/tmp
dh_clean
build-config:
dh_testdir
$(MAKE) O=$(DPDK_STATIC_DIR) T=$(DPDK_CONFIG) config
sed -ri -e 's,(RTE_MACHINE=).*,\1"default",' \
-e 's,(RTE_NEXT_ABI=).*,\1n,' \
-e 's,(RTE_APP_TEST=).*,\1n,' \
-e 's,(CONFIG_RTE_EAL_IGB_UIO=).*,\1n,' \
-e 's,(CONFIG_RTE_KNI_KMOD=).*,\1n,' \
-e 's,(CONFIG_RTE_BUILD_COMBINE_LIBS=).*,\1y,' \
-e 's,(LIBRTE_PMD_PCAP=).*,\1y,' \
-e 's,(LIBRTE_PMD_XENVIRT=).*,\1y,' \
$(DPDK_STATIC_DIR)/.config
build-indep: build-config
dh_testdir
$(MAKE) O=$(DPDK_STATIC_DIR) doc-api-html doc-guides-html
build-arch: build-config
dh_testdir
$(MAKE) O=$(DPDK_STATIC_DIR) build
# Unfortunately the decision about having static or shared libraries is
# made for the whole build, which then produces only .a or .so files
# (but not both).
# And the target layout for target selection has no field for the
# type of library.
# Right now I hack this by doing a second build which only differs in
# the selection of shared libs.
# Shared libs should be default, so the previous static build is only
# used to get static libraries.
cp -a $(DPDK_STATIC_DIR) $(DPDK_SHARED_DIR)
sed -ri 's,(RTE_BUILD_SHARED_LIB=).*,\1y,' \
$(DPDK_SHARED_DIR)/.config
$(MAKE) O=$(DPDK_SHARED_DIR) build
build: build-arch build-indep
binary-indep: PACKAGE_NAME=dpdk-doc
binary-indep: DOCDIR=usr/share/doc/dpdk
binary-indep: export DH_OPTIONS=--indep
binary-indep:
dh_testroot
dh_prep
dh_testdir
dh_installdirs
dh_install
dh_installdocs
dh_installchangelogs
dh_lintian
# Package: dpdk-doc
# All files based on the install-doc rule (includes examples)
$(MAKE) O=$(DPDK_SHARED_DIR) prefix=/usr \
DESTDIR=debian/dpdk-doc install-doc
dh_link
dh_compress
dh_fixperms
dh_installdeb
dh_gencontrol
dh_md5sums
dh_builddeb
binary-arch: LIBDIR=usr/lib/$(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
binary-arch: export DH_OPTIONS=--arch
binary-arch:
dh_testroot
dh_prep
dh_testdir
dh_installdirs
dh_install
dh_installdocs
dh_installchangelogs
dh_lintian
dh_systemd_enable
dh_installinit --no-start --no-restart-on-upgrade
dh_systemd_start --no-start --no-restart-on-upgrade
# Package: dpdk (runtime)
$(MAKE) O=$(DPDK_STATIC_DIR) prefix=/usr \
DESTDIR=debian/dpdk install-runtime
$(MAKE) O=$(DPDK_SHARED_DIR) prefix=/usr \
DESTDIR=debian/dpdk install-runtime
cp debian/dpdk.interfaces debian/dpdk/etc/dpdk/interfaces
rm debian/dpdk/usr/sbin/dpdk_nic_bind
ln -s /usr/share/dpdk/tools/dpdk_nic_bind.py \
debian/dpdk/sbin/dpdk_nic_bind
# Package: libdpdk0 (bare runtime libs)
mkdir -p debian/libdpdk0/$(LIBDIR)
# NOTE so far upstream dpdk has not settled on really versioning the
# combined lib. There are discussions ongoing and various alternative
# approaches.
# We have to wait until that is clarified upstream (in a follow on dpdk
# version).
# One likely solution will make us ship the non combined .so and a
# linker script which replaces the combined lib.
# To easen package management a few notes how this will change if that
# happens:
# NOTE: linker script - this becomes a nop (linker skript has no sover
# on its own)
rm debian/dpdk/usr/lib/libdpdk.so
cp $(DPDK_SHARED_DIR)/lib/libdpdk.so.0 debian/libdpdk0/$(LIBDIR)/
# NOTE: linker script - insert basenames loop for all .so's
# NOTE: linker script - we also will need multiple symbol files then
# Package: dpdk-dev (build environment)
$(MAKE) O=$(DPDK_SHARED_DIR) prefix=/usr \
DESTDIR=debian/dpdk-dev install-sdk
cp $(DPDK_SHARED_DIR)/.config debian/dpdk-dev/usr/share/dpdk/config
# Package: libdpdk-dev (bare headers and static devel libs)
mkdir -p debian/libdpdk-dev/$(LIBDIR)
# NOTE: linker script - insert basenames loop for all .a's
ln -s /$(LIBDIR)/libdpdk.so.0 \
debian/libdpdk-dev/$(LIBDIR)/libdpdk.so
mv debian/dpdk/usr/lib/libdpdk.a debian/libdpdk-dev/$(LIBDIR)/
mv debian/dpdk-dev/usr/include/dpdk debian/libdpdk-dev/usr/include/
# NOTE: linker script - package instead of removing all sublibs
rm -rf debian/dpdk/usr/lib*
dh_python2
dh_perl
dh_link
dh_compress
dh_fixperms
dh_strip
dh_makeshlibs
dh_shlibdeps
dh_installdeb
dh_gencontrol
dh_md5sums
dh_builddeb
binary: binary-arch binary-indep

View File

@ -0,0 +1 @@
3.0 (quilt)

View File

@ -0,0 +1,12 @@
#!/bin/bash
arch=$(dpkg --print-architecture)
case $arch in
amd64|i386)
echo "Architecture ${arch} supported, go on with test"
;;
*)
echo "Architecture ${arch} not supported, SKIP test"
exit 0
;;
esac

View File

@ -0,0 +1,8 @@
Tests: test-initscripts
Restrictions: allow-stderr, isolation-machine, needs-root
Depends: dpdk [amd64 i386], gawk, mount, systemd, sysvinit-utils
Tests: test-linkage
Restrictions: allow-stderr
Depends: libdpdk0 [amd64 i386], libdpdk-dev [amd64 i386], libc6, libc6-dev, gcc,
grep, libpcap-dev, libxenstore3.0 [amd64 i386]

View File

@ -0,0 +1,143 @@
#!/bin/sh
set -e
basedir=$(dirname "$0")
. "${basedir}"/check-dpdk-supported-arch.sh
# Overall that could require up to 1.2G for hugepages in the test environment
EXPECT2MHP=10
# Some page sizes like e.g. 1G might not be available in all test environments
# The test still configures 1 page of 1G size.
# One of two things will happen, depending on the test environment:
# - has 1G huge page size => they will tried to be allocated (usually env is
# too small, but we want to see it fail gracefully for that)
# We will not check for the 1G alloc, as we know it often fails in small adt's
# - has no 1G huge page size (HW feature) => we check if it fails gracefully
EXPECT1GHP=1
DPDK_CONF="/etc/dpdk/dpdk.conf"
DPDK_INTERF="/etc/dpdk/interfaces"
checkhp() {
MMDIR="/sys/kernel/mm/hugepages/${1}"
EXPECTHP="${2}"
if [ -d "$MMDIR" -a -r "$MMDIR/nr_hugepages" ]; then
hpcount=$(cat "$MMDIR/nr_hugepages")
if [ "${hpcount}" -ne "${EXPECTHP}" ]; then
echo "Hugepages (${hpcount}) not as expected (${EXPECTHP})"
exit 1
else
echo "Hugepages ok (${hpcount})"
fi
fi
}
checkstatus() {
MARK=${1}
EXPMPCOUNT=${2}
PRE=${3}
POST=${4}
EXPECTEDSTATUS=${5}
echo "Status after ${MARK}"
echo "Status of the Service"
${PRE} status "${POST}" || true
GOTSTATUS=$(${PRE} status "${POST}" | awk '/^ *Active: / { print $2 }')
if [ "${GOTSTATUS}" != "${EXPECTEDSTATUS}" ]; then
echo "Service status (${GOTSTATUS}) not as expected (${EXPECTEDSTATUS})"
exit 1
else
echo "Service status (${GOTSTATUS}) as expected"
fi
echo "Status of hugetlbfs mount points"
# this section is ok to create bad RCs when no mounts are available
set +e
grep hugetlbfs < /proc/mounts
htlbfscount=$(grep -c hugetlbfs < /proc/mounts)
set -e
# we have to reduce the expected mountpoint count in case some sizes are
# not supported by the current kernel/environment
if [ ${EXPMPCOUNT} -gt 0 ]; then
if [ ! -d /sys/kernel/mm/hugepages/hugepages-2048kB ]; then
EXPMPCOUNT=$((EXPMPCOUNT-1))
fi
if [ ! -d /sys/kernel/mm/hugepages/hugepages-1048576kB ]; then
EXPMPCOUNT=$((EXPMPCOUNT-1))
fi
fi
if [ "${htlbfscount}" -eq "${EXPMPCOUNT}" ]; then
echo "MP Count (${htlbfscount}) as expected (${EXPMPCOUNT})"
else
echo "MP Count (${htlbfscount}) not as expected (${EXPMPCOUNT})"
exit 1
fi
# check if setting HP worked
if [ "${EXPMPCOUNT}" -ne "0" ]; then
checkhp "hugepages-2048kB" "${EXPECT2MHP}"
# We do not check 1G alloc, as it is known to be often not available
fi
}
resetservice() {
# help a bit with memory fragmentation regarding huge page allocation
sync
echo 3 > /proc/sys/vm/drop_caches
# stopping and resetting Service
systemctl stop dpdk.service
systemctl reset-failed dpdk.service
echo "Unmounting all potential hugetlbfs mounts"
awk '/hugetlbfs/ {print $2}' /proc/mounts | while read hugetlbmount; do
umount -v "$hugetlbmount"
done
}
checkinitstyle() {
# We want to verify that
# - initially our environment has no hugetlbfs mount
# - a system without hugetlbfs mount gets it mounted
# - a restart of the service does neither drop nor duplicate the mount
PRE=${1}
POST=${2}
TYPE=${3}
printf "\n\n### Checking Type %s ###\n" "${TYPE}"
resetservice
checkstatus "${TYPE}-BEGIN" 0 "${PRE}" "${POST}" "inactive"
echo "### Starting Service ###"
${PRE} start "${POST}"
checkstatus "${TYPE}-START" 2 "${PRE}" "${POST}" "active"
echo "### Restarting Service ###"
${PRE} restart "${POST}"
checkstatus "${TYPE}-RESTART" 2 "${PRE}" "${POST}" "active"
}
echo "NR_2M_PAGES=$EXPECT2MHP" >> ${DPDK_CONF}
echo "NR_1G_PAGES=$EXPECT1GHP" >> ${DPDK_CONF}
# We can't rely on any real device for DPDK tests in adt-* environments. But
# we can expect all kind of broken configuration not to break it (would be
# detected via set -e).
# So add all kind of known-to-be-broken definitions and expect it not to fail.
cat <<EOF > ${DPDK_INTERF}
# wrong bus
pTi 0000:04:00.0 uio-pci-generic
# not enough parms
0000:04:00.0 uio-pci-generic
# empty line
# non existing device
pci 1234:56:78.9 uio-pci-generic
EOF
# some had issues in the past caused by different init systems, so we test all
# Direct Calls
checkinitstyle "/etc/init.d/dpdk" "" "Direct"
# System V style init
checkinitstyle "service dpdk" "" "SysV"
# SystemD style init
checkinitstyle "systemctl" "dpdk.service" "SystemD"

View File

@ -0,0 +1,41 @@
#!/bin/bash
set -eu
basedir=$(dirname "$0")
. "${basedir}"/check-dpdk-supported-arch.sh
cat > testlinkage.c << EOF
#include <stdio.h>
#include "dpdk/rte_common.h"
int main()
{
printf("Hello rte_exit %p\n", rte_exit);
return 0;
}
EOF
# with broken linkage this will fail with undefined symbols
printf "\n\nChecking compile with link against DPDK\n"
gcc -v testlinkage.c -o testlinkage.bin -Wall -Werror -ldpdk
echo "OK"
printf "\n\nChecking for expected libraries\n"
# The binary should inherit dependencies from the .so
# check one of the libs that came in due to features
ldd testlinkage.bin | grep libpcap
# check one of the libs that came in due to basic dpdp linuxapp config
ldd testlinkage.bin | grep libm
# one that it uses implicitly
ldd testlinkage.bin | grep libpthread
echo "OK"
printf "\n\nChecking test execution\n"
# It doesn't do much, but it should work - so calling it is a minor extra test.
# It is known to fail without SSE3 in e.g. some adt environments, in that
# case check at least that we get the correct error message (this will trigger
# a test fail if it neither finds the success nor the expected error message)
(./testlinkage.bin 2>&1 || /bin/true ) | \
grep -E 'ERROR: This system does not support "SSSE3".|Hello rte_exit 0x'
echo "OK"

View File

@ -0,0 +1,2 @@
version=3
http://www.dpdk.org/download /browse/dpdk/snapshot/dpdk-(.+)\.(?:zip|tgz|tbz|txz|(?:tar\.(?:gz|bz2|xz)))