usertools: remove dpdk-setup.sh

This old script relied on deprecated stuff, and especially make.
It also applied some scary 666 permissions on files under /dev/vfio.

Its deprecation had been notified in a previous release, remove it.

Signed-off-by: David Marchand <david.marchand@redhat.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Thomas Monjalon <thomas@monjalon.net>
Acked-by: Ferruh Yigit <ferruh.yigit@intel.com>
Acked-by: Maxime Coquelin <maxime.coquelin@redhat.com>
This commit is contained in:
David Marchand 2020-11-27 16:07:10 +01:00
parent 3ca55dac6d
commit b0a49787b4
12 changed files with 7 additions and 974 deletions

View File

@ -96,7 +96,7 @@ Bind PF UIO driver(s)
Install the DPDK igb_uio driver, bind it with the PF PCI device ID and use
``lspci`` to confirm the PF device is under use by ``igb_uio`` DPDK UIO driver.
The igb_uio driver may be bound to the PF PCI device using one of three methods:
The igb_uio driver may be bound to the PF PCI device using one of two methods:
1. PCI functions (physical or virtual, depending on the use case) can be bound to
@ -120,19 +120,9 @@ the UIO driver by repeating this command for every function.
where the PCI device ID (example: 0000:06:00.0) is obtained using lspci -vd8086:0d5c
3. A third way to bind is to use ``dpdk-setup.sh`` tool
.. code-block:: console
cd <dpdk-top-level-directory>
./usertools/dpdk-setup.sh
select 'Bind Ethernet/Crypto/Baseband device to IGB UIO module'
enter PCI device ID
select 'Display current Ethernet/Crypto/Baseband device settings' to confirm binding
In a similar way the ACC100 5G/4G FEC PF may be bound with vfio-pci as any PCIe device.
Enable Virtual Functions
~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -82,7 +82,7 @@ Bind PF UIO driver(s)
Install the DPDK igb_uio driver, bind it with the PF PCI device ID and use
``lspci`` to confirm the PF device is under use by ``igb_uio`` DPDK UIO driver.
The igb_uio driver may be bound to the PF PCI device using one of three methods:
The igb_uio driver may be bound to the PF PCI device using one of two methods:
1. PCI functions (physical or virtual, depending on the use case) can be bound to
@ -105,20 +105,6 @@ the UIO driver by repeating this command for every function.
where the PCI device ID (example: 0000:06:00.0) is obtained using lspci -vd8086:0d8f
3. A third way to bind is to use ``dpdk-setup.sh`` tool
.. code-block:: console
cd <dpdk-top-level-directory>
./usertools/dpdk-setup.sh
select 'Bind Ethernet/Crypto/Baseband device to IGB UIO module'
or
select 'Bind Ethernet/Crypto/Baseband device to VFIO module' depending on driver required
enter PCI device ID
select 'Display current Ethernet/Crypto/Baseband device settings' to confirm binding
In the same way the FPGA 5GNR FEC PF can be bound with vfio, but vfio driver does not
support SR-IOV configuration right out of the box, so it will need to be patched.

View File

@ -81,7 +81,7 @@ Bind PF UIO driver(s)
Install the DPDK igb_uio driver, bind it with the PF PCI device ID and use
``lspci`` to confirm the PF device is under use by ``igb_uio`` DPDK UIO driver.
The igb_uio driver may be bound to the PF PCI device using one of three methods:
The igb_uio driver may be bound to the PF PCI device using one of two methods:
1. PCI functions (physical or virtual, depending on the use case) can be bound to
@ -104,20 +104,6 @@ the UIO driver by repeating this command for every function.
where the PCI device ID (example: 0000:06:00.0) is obtained using lspci -vd1172:
3. A third way to bind is to use ``dpdk-setup.sh`` tool
.. code-block:: console
cd <dpdk-top-level-directory>
./usertools/dpdk-setup.sh
select 'Bind Ethernet/Crypto/Baseband device to IGB UIO module'
or
select 'Bind Ethernet/Crypto/Baseband device to VFIO module' depending on driver required
enter PCI device ID
select 'Display current Ethernet/Crypto/Baseband device settings' to confirm binding
In the same way the FPGA LTE FEC PF can be bound with vfio, but vfio driver does not
support SR-IOV configuration right out of the box, so it will need to be patched.

View File

@ -22,8 +22,7 @@ When you stop and restart the test application, it looks to see if the pages are
If you look in the directory, you will see ``n`` number of 2M pages files. If you specified 1024, you will see 1024 page files.
These are then placed in memory segments to get contiguous memory.
If you need to change the number of pages, it is easier to first remove the pages. The usertools/dpdk-setup.sh script provides an option to do this.
See the "Quick Start Setup Script" section in the :ref:`DPDK Getting Started Guide <linux_gsg>` for more information.
If you need to change the number of pages, it is easier to first remove the pages.
If I execute "l2fwd -l 0-3 -m 64 -n 3 -- -p 3", I get the following output, indicating that there are no socket 0 hugepages to allocate the mbuf and ring structures to?

View File

@ -6,11 +6,6 @@
Compiling the DPDK Target from Source
=====================================
.. note::
Parts of this process can also be done using the setup script described in
the :ref:`linux_setup_script` section of this document.
Uncompress DPDK and Browse Sources
----------------------------------

View File

@ -7,11 +7,6 @@ Running Sample Applications
The chapter describes how to compile and run applications in a DPDK environment.
It also provides a pointer to where sample applications are stored.
.. note::
Parts of this process can also be done using the setup script described the
:ref:`linux_setup_script` section of this document.
Compiling a Sample Application
------------------------------

View File

@ -18,5 +18,4 @@ Getting Started Guide for Linux
build_sample_apps
linux_eal_parameters
enable_func
quick_start
nic_perf_intel_platform

View File

@ -107,7 +107,6 @@ Also, to use VFIO, both kernel and BIOS must support and be configured to use IO
``vfio-pci`` module doesn't support the creation of virtual functions before Linux version 5.7.
For proper operation of VFIO when running DPDK applications as a non-privileged user, correct permissions should also be set up.
This can be done by using the DPDK setup script (called dpdk-setup.sh and located in the usertools directory).
.. note::

View File

@ -1,304 +0,0 @@
.. SPDX-License-Identifier: BSD-3-Clause
Copyright(c) 2010-2014 Intel Corporation.
.. _linux_setup_script:
Quick Start Setup Script
========================
The dpdk-setup.sh script, found in the usertools subdirectory, allows the user to perform the following tasks:
* Build the DPDK libraries
* Insert and remove the DPDK IGB_UIO kernel module
* Insert and remove VFIO kernel modules
* Insert and remove the DPDK KNI kernel module
* Create and delete hugepages for NUMA and non-NUMA cases
* View network port status and reserve ports for DPDK application use
* Set up permissions for using VFIO as a non-privileged user
* Run the test and testpmd applications
* Look at hugepages in the meminfo
* List hugepages in ``/mnt/huge``
* Remove built DPDK libraries
Once these steps have been completed for one of the EAL targets,
the user may compile their own application that links in the EAL libraries to create the DPDK image.
Script Organization
-------------------
The dpdk-setup.sh script is logically organized into a series of steps that a user performs in sequence.
Each step provides a number of options that guide the user to completing the desired task.
The following is a brief synopsis of each step.
**Step 1: Build DPDK Libraries**
Initially, the user must select a DPDK target to choose the correct target type and compiler options to use when building the libraries.
The user must have all libraries, modules, updates and compilers installed in the system prior to this,
as described in the earlier chapters in this Getting Started Guide.
**Step 2: Setup Environment**
The user configures the Linux* environment to support the running of DPDK applications.
Hugepages can be set up for NUMA or non-NUMA systems. Any existing hugepages will be removed.
The DPDK kernel module that is needed can also be inserted in this step,
and network ports may be bound to this module for DPDK application use.
**Step 3: Run an Application**
The user may run the test application once the other steps have been performed.
The test application allows the user to run a series of functional tests for the DPDK.
The testpmd application, which supports the receiving and sending of packets, can also be run.
**Step 4: Examining the System**
This step provides some tools for examining the status of hugepage mappings.
**Step 5: System Cleanup**
The final step has options for restoring the system to its original state.
Use Cases
---------
The following are some example of how to use the dpdk-setup.sh script.
The script should be run using the source command.
Some options in the script prompt the user for further data before proceeding.
.. warning::
The dpdk-setup.sh script should be run with root privileges.
.. code-block:: console
source usertools/dpdk-setup.sh
------------------------------------------------------------------------
RTE_SDK exported as /home/user/rte
------------------------------------------------------------------------
Step 1: Select the DPDK environment to build
------------------------------------------------------------------------
[1] i686-native-linux-gcc
[2] i686-native-linux-icc
[3] ppc_64-power8-linux-gcc
[4] x86_64-native-freebsd-clang
[5] x86_64-native-freebsd-gcc
[6] x86_64-native-linux-clang
[7] x86_64-native-linux-gcc
[8] x86_64-native-linux-icc
------------------------------------------------------------------------
Step 2: Setup linux environment
------------------------------------------------------------------------
[11] Insert IGB UIO module
[12] Insert VFIO module
[13] Insert KNI module
[14] Setup hugepage mappings for non-NUMA systems
[15] Setup hugepage mappings for NUMA systems
[16] Display current Ethernet device settings
[17] Bind Ethernet device to IGB UIO module
[18] Bind Ethernet device to VFIO module
[19] Setup VFIO permissions
------------------------------------------------------------------------
Step 3: Run test application for linux environment
------------------------------------------------------------------------
[20] Run test application ($RTE_TARGET/app/test)
[21] Run testpmd application in interactive mode ($RTE_TARGET/app/testpmd)
------------------------------------------------------------------------
Step 4: Other tools
------------------------------------------------------------------------
[22] List hugepage info from /proc/meminfo
------------------------------------------------------------------------
Step 5: Uninstall and system cleanup
------------------------------------------------------------------------
[23] Uninstall all targets
[24] Unbind NICs from IGB UIO driver
[25] Remove IGB UIO module
[26] Remove VFIO module
[27] Remove KNI module
[28] Remove hugepage mappings
[29] Exit Script
Option:
The following selection demonstrates the creation of the ``x86_64-native-linux-gcc`` DPDK library.
.. code-block:: console
Option: 9
================== Installing x86_64-native-linux-gcc
Configuration done
== Build lib
...
Build complete
RTE_TARGET exported as x86_64-native-linux-gcc
The following selection demonstrates the starting of the DPDK UIO driver.
.. code-block:: console
Option: 25
Unloading any existing DPDK UIO module
Loading DPDK UIO module
The following selection demonstrates the creation of hugepages in a NUMA system.
1024 2 MByte pages are assigned to each node.
The result is that the application should use -m 4096 for starting the application to access both memory areas
(this is done automatically if the -m option is not provided).
.. note::
If prompts are displayed to remove temporary files, type 'y'.
.. code-block:: console
Option: 15
Removing currently reserved hugepages
mounting /mnt/huge and removing directory
Input the number of 2MB pages for each node
Example: to have 128MB of hugepages available per node,
enter '64' to reserve 64 * 2MB pages on each node
Number of pages for node0: 1024
Number of pages for node1: 1024
Reserving hugepages
Creating /mnt/huge and mounting as hugetlbfs
The following selection demonstrates the launch of the test application to run on a single core.
.. code-block:: console
Option: 20
Enter hex bitmask of cores to execute test app on
Example: to execute app on cores 0 to 7, enter 0xff
bitmask: 0x01
Launching app
EAL: coremask set to 1
EAL: Detected lcore 0 on socket 0
...
EAL: Main core 0 is ready (tid=1b2ad720)
RTE>>
Applications
------------
Once the user has run the dpdk-setup.sh script, built one of the EAL targets and set up hugepages (if using one of the Linux EAL targets),
the user can then move on to building and running their application or one of the examples provided.
The examples in the /examples directory provide a good starting point to gain an understanding of the operation of the DPDK.
The following command sequence shows how the helloworld sample application is built and run.
As recommended in Section 4.2.1 , "Logical Core Use by Applications",
the logical core layout of the platform should be determined when selecting a core mask to use for an application.
.. code-block:: console
cd helloworld/
make
CC main.o
LD helloworld
INSTALL-APP helloworld
INSTALL-MAP helloworld.map
sudo ./build/app/helloworld -l 0-3 -n 3
[sudo] password for rte:
EAL: coremask set to f
EAL: Detected lcore 0 as core 0 on socket 0
EAL: Detected lcore 1 as core 0 on socket 1
EAL: Detected lcore 2 as core 1 on socket 0
EAL: Detected lcore 3 as core 1 on socket 1
EAL: Setting up hugepage memory...
EAL: Ask a virtual area of 0x200000 bytes
EAL: Virtual area found at 0x7f0add800000 (size = 0x200000)
EAL: Ask a virtual area of 0x3d400000 bytes
EAL: Virtual area found at 0x7f0aa0200000 (size = 0x3d400000)
EAL: Ask a virtual area of 0x400000 bytes
EAL: Virtual area found at 0x7f0a9fc00000 (size = 0x400000)
EAL: Ask a virtual area of 0x400000 bytes
EAL: Virtual area found at 0x7f0a9f600000 (size = 0x400000)
EAL: Ask a virtual area of 0x400000 bytes
EAL: Virtual area found at 0x7f0a9f000000 (size = 0x400000)
EAL: Ask a virtual area of 0x800000 bytes
EAL: Virtual area found at 0x7f0a9e600000 (size = 0x800000)
EAL: Ask a virtual area of 0x800000 bytes
EAL: Virtual area found at 0x7f0a9dc00000 (size = 0x800000)
EAL: Ask a virtual area of 0x400000 bytes
EAL: Virtual area found at 0x7f0a9d600000 (size = 0x400000)
EAL: Ask a virtual area of 0x400000 bytes
EAL: Virtual area found at 0x7f0a9d000000 (size = 0x400000)
EAL: Ask a virtual area of 0x400000 bytes
EAL: Virtual area found at 0x7f0a9ca00000 (size = 0x400000)
EAL: Ask a virtual area of 0x200000 bytes
EAL: Virtual area found at 0x7f0a9c600000 (size = 0x200000)
EAL: Ask a virtual area of 0x200000 bytes
EAL: Virtual area found at 0x7f0a9c200000 (size = 0x200000)
EAL: Ask a virtual area of 0x3fc00000 bytes
EAL: Virtual area found at 0x7f0a5c400000 (size = 0x3fc00000)
EAL: Ask a virtual area of 0x200000 bytes
EAL: Virtual area found at 0x7f0a5c000000 (size = 0x200000)
EAL: Requesting 1024 pages of size 2MB from socket 0
EAL: Requesting 1024 pages of size 2MB from socket 1
EAL: Main core 0 is ready (tid=de25b700)
EAL: Core 1 is ready (tid=5b7fe700)
EAL: Core 3 is ready (tid=5a7fc700)
EAL: Core 2 is ready (tid=5affd700)
hello from core 1
hello from core 2
hello from core 3
hello from core 0

View File

@ -100,8 +100,3 @@ Deprecation Notices
* cmdline: ``cmdline`` structure will be made opaque to hide platform-specific
content. On Linux and FreeBSD, supported prior to DPDK 20.11,
original structure will be kept until DPDK 21.11.
* dpdk-setup.sh: This old script relies on deprecated stuff, and especially
``make``. Given environments are too much variables for such a simple script,
it will be removed in DPDK 20.11.
Some useful parts may be converted into specific scripts.

View File

@ -457,6 +457,8 @@ Removed Items
* Removed TEP termination sample application.
* Removed the deprecated ``dpdk-setup.sh`` script.
API Changes
-----------

View File

@ -1,609 +0,0 @@
#! /bin/bash
# SPDX-License-Identifier: BSD-3-Clause
# Copyright(c) 2010-2014 Intel Corporation
#
# Run with "source /path/to/dpdk-setup.sh"
#
#
# Change to DPDK directory ( <this-script's-dir>/.. ), and export it as RTE_SDK
#
cd $(dirname ${BASH_SOURCE[0]})/..
export RTE_SDK=$PWD
echo "------------------------------------------------------------------------------"
echo " RTE_SDK exported as $RTE_SDK"
echo "------------------------------------------------------------------------------"
HUGEPGSZ=`cat /proc/meminfo | grep Hugepagesize | cut -d : -f 2 | tr -d ' '`
#
# Application EAL parameters for setting memory options (amount/channels/ranks).
#
EAL_PARAMS='-n 4'
#
# Sets QUIT variable so script will finish.
#
quit()
{
QUIT=$1
}
# Shortcut for quit.
q()
{
quit
}
#
# Sets up environmental variables for ICC.
#
setup_icc()
{
DEFAULT_PATH=/opt/intel/bin/iccvars.sh
param=$1
shpath=`which iccvars.sh 2> /dev/null`
if [ $? -eq 0 ] ; then
echo "Loading iccvars.sh from $shpath for $param"
source $shpath $param
elif [ -f $DEFAULT_PATH ] ; then
echo "Loading iccvars.sh from $DEFAULT_PATH for $param"
source $DEFAULT_PATH $param
else
echo "## ERROR: cannot find 'iccvars.sh' script to set up ICC."
echo "## To fix, please add the directory that contains"
echo "## iccvars.sh to your 'PATH' environment variable."
quit
fi
}
#
# Sets RTE_TARGET and does a "make install".
#
setup_target()
{
option=$1
export RTE_TARGET=${TARGETS[option]}
compiler=${RTE_TARGET##*-}
if [ "$compiler" == "icc" ] ; then
platform=${RTE_TARGET%%-*}
if [ "$platform" == "x86_64" ] ; then
setup_icc intel64
else
setup_icc ia32
fi
fi
if [ "$QUIT" == "0" ] ; then
make install T=${RTE_TARGET}
fi
echo "------------------------------------------------------------------------------"
echo " RTE_TARGET exported as $RTE_TARGET"
echo "------------------------------------------------------------------------------"
}
#
# Creates hugepage filesystem.
#
create_mnt_huge()
{
echo "Creating /mnt/huge and mounting as hugetlbfs"
sudo mkdir -p /mnt/huge
grep -s '/mnt/huge' /proc/mounts > /dev/null
if [ $? -ne 0 ] ; then
sudo mount -t hugetlbfs nodev /mnt/huge
fi
}
#
# Removes hugepage filesystem.
#
remove_mnt_huge()
{
echo "Unmounting /mnt/huge and removing directory"
grep -s '/mnt/huge' /proc/mounts > /dev/null
if [ $? -eq 0 ] ; then
sudo umount /mnt/huge
fi
if [ -d /mnt/huge ] ; then
sudo rm -R /mnt/huge
fi
}
#
# Unloads igb_uio.ko.
#
remove_igb_uio_module()
{
echo "Unloading any existing DPDK UIO module"
/sbin/lsmod | grep -s igb_uio > /dev/null
if [ $? -eq 0 ] ; then
sudo /sbin/rmmod igb_uio
fi
}
#
# Loads new igb_uio.ko (and uio module if needed).
#
load_igb_uio_module()
{
if [ ! -f $RTE_SDK/$RTE_TARGET/kmod/igb_uio.ko ];then
echo "## ERROR: Target does not have the DPDK UIO Kernel Module."
echo " To fix, please try to rebuild target."
return
fi
remove_igb_uio_module
/sbin/lsmod | grep -s uio > /dev/null
if [ $? -ne 0 ] ; then
modinfo uio > /dev/null
if [ $? -eq 0 ]; then
echo "Loading uio module"
sudo /sbin/modprobe uio
fi
fi
# UIO may be compiled into kernel, so it may not be an error if it can't
# be loaded.
echo "Loading DPDK UIO module"
sudo /sbin/insmod $RTE_SDK/$RTE_TARGET/kmod/igb_uio.ko
if [ $? -ne 0 ] ; then
echo "## ERROR: Could not load kmod/igb_uio.ko."
quit
fi
}
#
# Unloads VFIO modules.
#
remove_vfio_module()
{
echo "Unloading any existing VFIO module"
/sbin/lsmod | grep -s vfio > /dev/null
if [ $? -eq 0 ] ; then
sudo /sbin/rmmod vfio-pci
sudo /sbin/rmmod vfio_iommu_type1
sudo /sbin/rmmod vfio
fi
}
#
# Loads new vfio-pci (and vfio module if needed).
#
load_vfio_module()
{
remove_vfio_module
VFIO_PATH="kernel/drivers/vfio/pci/vfio-pci.ko"
echo "Loading VFIO module"
/sbin/lsmod | grep -s vfio_pci > /dev/null
if [ $? -ne 0 ] ; then
if [ -f /lib/modules/$(uname -r)/$VFIO_PATH ] ; then
sudo /sbin/modprobe vfio-pci
fi
fi
# make sure regular users can read /dev/vfio
echo "chmod /dev/vfio"
sudo chmod a+x /dev/vfio
if [ $? -ne 0 ] ; then
echo "FAIL"
quit
fi
echo "OK"
# check if /dev/vfio/vfio exists - that way we
# know we either loaded the module, or it was
# compiled into the kernel
if [ ! -e /dev/vfio/vfio ] ; then
echo "## ERROR: VFIO not found!"
fi
}
#
# Unloads the rte_kni.ko module.
#
remove_kni_module()
{
echo "Unloading any existing DPDK KNI module"
/sbin/lsmod | grep -s rte_kni > /dev/null
if [ $? -eq 0 ] ; then
sudo /sbin/rmmod rte_kni
fi
}
#
# Loads the rte_kni.ko module.
#
load_kni_module()
{
# Check that the KNI module is already built.
if [ ! -f $RTE_SDK/$RTE_TARGET/kmod/rte_kni.ko ];then
echo "## ERROR: Target does not have the DPDK KNI Module."
echo " To fix, please try to rebuild target."
return
fi
# Unload existing version if present.
remove_kni_module
# Now try load the KNI module.
echo "Loading DPDK KNI module"
sudo /sbin/insmod $RTE_SDK/$RTE_TARGET/kmod/rte_kni.ko
if [ $? -ne 0 ] ; then
echo "## ERROR: Could not load kmod/rte_kni.ko."
quit
fi
}
#
# Sets appropriate permissions on /dev/vfio/* files
#
set_vfio_permissions()
{
# make sure regular users can read /dev/vfio
echo "chmod /dev/vfio"
sudo chmod a+x /dev/vfio
if [ $? -ne 0 ] ; then
echo "FAIL"
quit
fi
echo "OK"
# make sure regular user can access everything inside /dev/vfio
echo "chmod /dev/vfio/*"
sudo chmod 0666 /dev/vfio/*
if [ $? -ne 0 ] ; then
echo "FAIL"
quit
fi
echo "OK"
# since permissions are only to be set when running as
# regular user, we only check ulimit here
#
# warn if regular user is only allowed
# to memlock <64M of memory
MEMLOCK_AMNT=`ulimit -l`
if [ "$MEMLOCK_AMNT" != "unlimited" ] ; then
MEMLOCK_MB=`expr $MEMLOCK_AMNT / 1024`
echo ""
echo "Current user memlock limit: ${MEMLOCK_MB} MB"
echo ""
echo "This is the maximum amount of memory you will be"
echo "able to use with DPDK and VFIO if run as current user."
echo -n "To change this, please adjust limits.conf memlock "
echo "limit for current user."
if [ $MEMLOCK_AMNT -lt 65536 ] ; then
echo ""
echo "## WARNING: memlock limit is less than 64MB"
echo -n "## DPDK with VFIO may not be able to initialize "
echo "if run as current user."
fi
fi
}
#
# Removes all reserved hugepages.
#
clear_huge_pages()
{
echo > .echo_tmp
for d in /sys/devices/system/node/node? ; do
echo "echo 0 > $d/hugepages/hugepages-${HUGEPGSZ}/nr_hugepages" >> .echo_tmp
done
echo "Removing currently reserved hugepages"
sudo sh .echo_tmp
rm -f .echo_tmp
remove_mnt_huge
}
#
# Creates hugepages.
#
set_non_numa_pages()
{
clear_huge_pages
echo ""
echo " Input the number of ${HUGEPGSZ} hugepages"
echo " Example: to have 128MB of hugepages available in a 2MB huge page system,"
echo " enter '64' to reserve 64 * 2MB pages"
echo -n "Number of pages: "
read Pages
echo "echo $Pages > /sys/kernel/mm/hugepages/hugepages-${HUGEPGSZ}/nr_hugepages" > .echo_tmp
echo "Reserving hugepages"
sudo sh .echo_tmp
rm -f .echo_tmp
create_mnt_huge
}
#
# Creates hugepages on specific NUMA nodes.
#
set_numa_pages()
{
clear_huge_pages
echo ""
echo " Input the number of ${HUGEPGSZ} hugepages for each node"
echo " Example: to have 128MB of hugepages available per node in a 2MB huge page system,"
echo " enter '64' to reserve 64 * 2MB pages on each node"
echo > .echo_tmp
for d in /sys/devices/system/node/node? ; do
node=$(basename $d)
echo -n "Number of pages for $node: "
read Pages
echo "echo $Pages > $d/hugepages/hugepages-${HUGEPGSZ}/nr_hugepages" >> .echo_tmp
done
echo "Reserving hugepages"
sudo sh .echo_tmp
rm -f .echo_tmp
create_mnt_huge
}
#
# Run unit test application.
#
run_test_app()
{
echo ""
echo " Enter hex bitmask of cores to execute test app on"
echo " Example: to execute app on cores 0 to 7, enter 0xff"
echo -n "bitmask: "
read Bitmask
echo "Launching app"
sudo ${RTE_TARGET}/app/test -c $Bitmask $EAL_PARAMS
}
#
# Run unit testpmd application.
#
run_testpmd_app()
{
echo ""
echo " Enter hex bitmask of cores to execute testpmd app on"
echo " Example: to execute app on cores 0 to 7, enter 0xff"
echo -n "bitmask: "
read Bitmask
echo "Launching app"
sudo ${RTE_TARGET}/app/testpmd -c $Bitmask $EAL_PARAMS -- -i
}
#
# Print hugepage information.
#
grep_meminfo()
{
grep -i huge /proc/meminfo
}
#
# Calls dpdk-devbind.py --status to show the devices and what they
# are all bound to, in terms of drivers.
#
show_devices()
{
if [ -d /sys/module/vfio_pci -o -d /sys/module/igb_uio ]; then
${RTE_SDK}/usertools/dpdk-devbind.py --status
else
echo "# Please load the 'igb_uio' or 'vfio-pci' kernel module before "
echo "# querying or adjusting device bindings"
fi
}
#
# Uses dpdk-devbind.py to move devices to work with vfio-pci
#
bind_devices_to_vfio()
{
if [ -d /sys/module/vfio_pci ]; then
${RTE_SDK}/usertools/dpdk-devbind.py --status
echo ""
echo -n "Enter PCI address of device to bind to VFIO driver: "
read PCI_PATH
sudo ${RTE_SDK}/usertools/dpdk-devbind.py -b vfio-pci $PCI_PATH &&
echo "OK"
else
echo "# Please load the 'vfio-pci' kernel module before querying or "
echo "# adjusting device bindings"
fi
}
#
# Uses dpdk-devbind.py to move devices to work with igb_uio
#
bind_devices_to_igb_uio()
{
if [ -d /sys/module/igb_uio ]; then
${RTE_SDK}/usertools/dpdk-devbind.py --status
echo ""
echo -n "Enter PCI address of device to bind to IGB UIO driver: "
read PCI_PATH
sudo ${RTE_SDK}/usertools/dpdk-devbind.py -b igb_uio $PCI_PATH && echo "OK"
else
echo "# Please load the 'igb_uio' kernel module before querying or "
echo "# adjusting device bindings"
fi
}
#
# Uses dpdk-devbind.py to move devices to work with kernel drivers again
#
unbind_devices()
{
${RTE_SDK}/usertools/dpdk-devbind.py --status
echo ""
echo -n "Enter PCI address of device to unbind: "
read PCI_PATH
echo ""
echo -n "Enter name of kernel driver to bind the device to: "
read DRV
sudo ${RTE_SDK}/usertools/dpdk-devbind.py -b $DRV $PCI_PATH && echo "OK"
}
#
# Options for building a target. Note that this step MUST be first as it sets
# up TARGETS[] starting from 1, and this is accessed in setup_target using the
# user entered option.
#
step1_func()
{
TITLE="Select the DPDK environment to build"
CONFIG_NUM=1
for cfg in config/defconfig_* ; do
cfg=${cfg/config\/defconfig_/}
TEXT[$CONFIG_NUM]="$cfg"
TARGETS[$CONFIG_NUM]=$cfg
FUNC[$CONFIG_NUM]="setup_target"
let "CONFIG_NUM+=1"
done
}
#
# Options for setting up environment.
#
step2_func()
{
TITLE="Setup linux environment"
TEXT[1]="Insert IGB UIO module"
FUNC[1]="load_igb_uio_module"
TEXT[2]="Insert VFIO module"
FUNC[2]="load_vfio_module"
TEXT[3]="Insert KNI module"
FUNC[3]="load_kni_module"
TEXT[4]="Setup hugepage mappings for non-NUMA systems"
FUNC[4]="set_non_numa_pages"
TEXT[5]="Setup hugepage mappings for NUMA systems"
FUNC[5]="set_numa_pages"
TEXT[6]="Display current Ethernet/Baseband/Crypto device settings"
FUNC[6]="show_devices"
TEXT[7]="Bind Ethernet/Baseband/Crypto device to IGB UIO module"
FUNC[7]="bind_devices_to_igb_uio"
TEXT[8]="Bind Ethernet/Baseband/Crypto device to VFIO module"
FUNC[8]="bind_devices_to_vfio"
TEXT[9]="Setup VFIO permissions"
FUNC[9]="set_vfio_permissions"
}
#
# Options for running applications.
#
step3_func()
{
TITLE="Run test application for linux environment"
TEXT[1]="Run test application (\$RTE_TARGET/app/test)"
FUNC[1]="run_test_app"
TEXT[2]="Run testpmd application in interactive mode (\$RTE_TARGET/app/testpmd)"
FUNC[2]="run_testpmd_app"
}
#
# Other options
#
step4_func()
{
TITLE="Other tools"
TEXT[1]="List hugepage info from /proc/meminfo"
FUNC[1]="grep_meminfo"
}
#
# Options for cleaning up the system
#
step5_func()
{
TITLE="Uninstall and system cleanup"
TEXT[1]="Unbind devices from IGB UIO or VFIO driver"
FUNC[1]="unbind_devices"
TEXT[2]="Remove IGB UIO module"
FUNC[2]="remove_igb_uio_module"
TEXT[3]="Remove VFIO module"
FUNC[3]="remove_vfio_module"
TEXT[4]="Remove KNI module"
FUNC[4]="remove_kni_module"
TEXT[5]="Remove hugepage mappings"
FUNC[5]="clear_huge_pages"
}
STEPS[1]="step1_func"
STEPS[2]="step2_func"
STEPS[3]="step3_func"
STEPS[4]="step4_func"
STEPS[5]="step5_func"
QUIT=0
while [ "$QUIT" == "0" ]; do
OPTION_NUM=1
for s in $(seq ${#STEPS[@]}) ; do
${STEPS[s]}
echo "----------------------------------------------------------"
echo " Step $s: ${TITLE}"
echo "----------------------------------------------------------"
for i in $(seq ${#TEXT[@]}) ; do
echo "[$OPTION_NUM] ${TEXT[i]}"
OPTIONS[$OPTION_NUM]=${FUNC[i]}
let "OPTION_NUM+=1"
done
# Clear TEXT and FUNC arrays before next step
unset TEXT
unset FUNC
echo ""
done
echo "[$OPTION_NUM] Exit Script"
OPTIONS[$OPTION_NUM]="quit"
echo ""
echo '--------------------------------------------------'
echo 'WARNING: This tool will be removed from DPDK 20.11'
echo '--------------------------------------------------'
echo
echo -n "Option: "
read our_entry
echo ""
${OPTIONS[our_entry]} ${our_entry}
if [ "$QUIT" == "0" ] ; then
echo
echo -n "Press enter to continue ..."; read
fi
done