setup.sh: enable using the igb_uio driver

On some platforms, especially AWS, uio_pci_generic is not readily
available, and we don't have access to an IOMMU, so using the DPDK
igb_uio driver is a valid workaround.

Change-Id: Ic96776f925d9bbbcab625f5adb7642ca6bd4033d
Signed-off-by: Seth Howell <seth.howell@intel.com>
Reviewed-on: https://review.gerrithub.io/c/444122
Reviewed-by: Pawel Wodkowski <pawelx.wodkowski@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Seth Howell 2019-02-11 12:50:08 -07:00 committed by Jim Harris
parent 7d4d22a846
commit c8bcedf4df

View File

@ -55,7 +55,7 @@ function usage()
echo " By default the current user will be used."
echo "DRIVER_OVERRIDE Disable automatic vfio-pci/uio_pci_generic selection and forcefully"
echo " bind devices to the given driver."
echo " E.g. DRIVER_OVERRIDE=uio_pci_generic or DRIVER_OVERRIDE=vfio-pci"
echo " E.g. DRIVER_OVERRIDE=uio_pci_generic or DRIVER_OVERRIDE=/home/public/dpdk/build/kmod/igb_uio.ko"
exit 0
}
@ -167,22 +167,40 @@ function get_virtio_names_from_bdf {
}
function configure_linux_pci {
if [ -z "${DRIVER_OVERRIDE}" ]; then
driver_name=vfio-pci
if [ -z "$(ls /sys/kernel/iommu_groups)" ]; then
# No IOMMU. If no-IOMMU mode vfio is not present, then use uio.
if ! [ -e /sys/module/vfio/parameters/enable_unsafe_noiommu_mode ] ||
! [ "$(cat /sys/module/vfio/parameters/enable_unsafe_noiommu_mode)" == "Y" ]
then
driver_name=uio_pci_generic
fi
local driver_path=""
driver_name=""
if [[ -n "${DRIVER_OVERRIDE}" ]]; then
driver_path="${DRIVER_OVERRIDE%/*}"
driver_name="${DRIVER_OVERRIDE##*/}"
# path = name -> there is no path
if [[ "$driver_path" = "$driver_name" ]]; then
driver_path=""
fi
elif [[ -n "$(ls /sys/kernel/iommu_groups)" || \
(-e /sys/module/vfio/parameters/enable_unsafe_noiommu_mode && \
"$(cat /sys/module/vfio/parameters/enable_unsafe_noiommu_mode)" == "Y") ]]; then
driver_name=vfio-pci
elif modinfo uio_pci_generic >/dev/null 2>&1; then
driver_name=uio_pci_generic
elif [[ -r "$rootdir/dpdk/build/kmod/igb_uio.ko" ]]; then
driver_path="$rootdir/dpdk/build/kmod/igb_uio.ko"
driver_name="igb_uio"
modprobe uio
echo "WARNING: uio_pci_generic not detected - using $driver_name"
else
driver_name="${DRIVER_OVERRIDE}"
echo "No valid drivers found [vfio-pci, uio_pci_generic, igb_uio]. Please either enable the vfio-pci or uio_pci_generic"
echo "kernel modules, or have SPDK build the igb_uio driver by running ./configure --with-igb-uio-driver and recompiling."
return 1
fi
# modprobe assumes the directory of the module. If the user passes in a path, we should use insmod
if [[ -n "$driver_path" ]]; then
insmod $driver_path || true
else
modprobe $driver_name
fi
# NVMe
modprobe $driver_name
for bdf in $(iter_all_pci_class_code 01 08 02); do
blkname=''
get_nvme_name_from_bdf "$bdf" blkname