scripts: factor out iter_pci helper functions

Add a new file, scripts/common.sh, that can be shared between not only
autotest scripts, but also scripts/setup.sh, scripts/gen_nvme.sh, etc.,
and move the PCI iteration functions there.

The iterators are also expanded to work identically for both dev_id and
class_code on Linux and FreeBSD.

Change-Id: I98423cd06242e78535f5da4fce82166812ea96a8
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-on: https://review.gerrithub.io/393416
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Daniel Verkamp 2018-01-02 14:44:48 -07:00 committed by Jim Harris
parent 581107c77a
commit f0c2093477
5 changed files with 67 additions and 39 deletions

44
scripts/common.sh Normal file
View File

@ -0,0 +1,44 @@
# Common shell utility functions
function iter_pci_class_code() {
local class="$(printf %02x $((0x$1)))"
local subclass="$(printf %02x $((0x$2)))"
local progif="$(printf %02x $((0x$3)))"
if hash lspci &>/dev/null; then
if [ "$progif" != "00" ]; then
lspci -mm -n -D | \
grep -i -- "-p${progif}" | \
awk -v cc="\"${class}${subclass}\"" -F " " \
'{if (cc ~ $2) print $1}' | tr -d '"'
else
lspci -mm -n -D | \
awk -v cc="\"${class}${subclass}\"" -F " " \
'{if (cc ~ $2) print $1}' | tr -d '"'
fi
elif hash pciconf &>/dev/null; then
addr=($(pciconf -l | grep -i "class=0x${class}${subclass}${progif}" | \
cut -d$'\t' -f1 | sed -e 's/^[a-zA-Z0-9_]*@pci//g' | tr ':' ' '))
printf "%04x:%02x:%02x:%x\n" ${addr[0]} ${addr[1]} ${addr[2]} ${addr[3]}
else
echo "Missing PCI enumeration utility"
exit 1
fi
}
function iter_pci_dev_id() {
local ven_id="$(printf %04x $((0x$1)))"
local dev_id="$(printf %04x $((0x$2)))"
if hash lspci &>/dev/null; then
lspci -mm -n -D | awk -v ven="\"$ven_id\"" -v dev="\"${dev_id}\"" -F " " \
'{if (ven ~ $3 && dev ~ $4) print $1}' | tr -d '"'
elif hash pciconf &>/dev/null; then
addr=($(pciconf -l | grep -i "chip=0x${dev_id}${ven_id}" | \
cut -d$'\t' -f1 | sed -e 's/^[a-zA-Z0-9_]*@pci//g' | tr ':' ' '))
printf "%04x:%02x:%02x:%x\n" ${addr[0]} ${addr[1]} ${addr[2]} ${addr[3]}
else
echo "Missing PCI enumeration utility"
exit 1
fi
}

View File

@ -2,17 +2,10 @@
set -e
case `uname` in
FreeBSD)
bdfs=$(pciconf -l | grep "class=0x010802" | awk -F: ' {printf "0000:%02X:%02X.%X\n", $2, $3, $4}')
;;
Linux)
bdfs=$(lspci -mm -n | grep 0108 | tr -d '"' | awk -F " " '{print "0000:"$1}')
;;
*)
exit 1
;;
esac
rootdir=$(readlink -f $(dirname $0))/..
source "$rootdir/scripts/common.sh"
bdfs=$(iter_pci_class_code 01 08 02)
echo "[Nvme]"
i=0

View File

@ -3,17 +3,7 @@
set -e
rootdir=$(readlink -f $(dirname $0))/..
function linux_iter_pci_class_code {
# Argument is the class code
lspci -mm -n -D | awk -v cc="\"$1\"" -F " " '{if (cc ~ $2) print $1}' | tr -d '"'
}
function linux_iter_pci_dev_id {
# Argument 1 is the vendor id
# Argument 2 is the device id
lspci -mm -n -D | awk -v ven="\"$1\"" -v dev="\"$2\"" -F " " '{if (ven ~ $3 && dev ~ $4) print $1}' | tr -d '"'
}
source "$rootdir/scripts/common.sh"
function linux_bind_driver() {
bdf="$1"
@ -90,7 +80,7 @@ function configure_linux_pci {
# NVMe
modprobe $driver_name || true
for bdf in $(linux_iter_pci_class_code 0108); do
for bdf in $(iter_pci_class_code 01 08 02); do
blkname=''
get_nvme_name_from_bdf "$bdf" blkname
if [ "$blkname" != "" ]; then
@ -112,7 +102,7 @@ function configure_linux_pci {
| awk -F"x" '{print $2}' > $TMP
for dev_id in `cat $TMP`; do
for bdf in $(linux_iter_pci_dev_id 8086 $dev_id); do
for bdf in $(iter_pci_dev_id 8086 $dev_id); do
linux_bind_driver "$bdf" "$driver_name"
done
done
@ -125,7 +115,7 @@ function configure_linux_pci {
| awk -F"x" '{print $2}' > $TMP
for dev_id in `cat $TMP`; do
for bdf in $(linux_iter_pci_dev_id 1af4 $dev_id); do
for bdf in $(iter_pci_dev_id 1af4 $dev_id); do
linux_bind_driver "$bdf" "$driver_name"
done
done
@ -196,7 +186,7 @@ function reset_linux_pci {
lsmod | grep nvme > /dev/null
driver_loaded=$?
set -e
for bdf in $(linux_iter_pci_class_code 0108); do
for bdf in $(iter_pci_class_code 01 08 02); do
if [ $driver_loaded -eq 0 ]; then
linux_bind_driver "$bdf" nvme
else
@ -215,7 +205,7 @@ function reset_linux_pci {
driver_loaded=$?
set -e
for dev_id in `cat $TMP`; do
for bdf in $(linux_iter_pci_dev_id 8086 $dev_id); do
for bdf in $(iter_pci_dev_id 8086 $dev_id); do
if [ $driver_loaded -eq 0 ]; then
linux_bind_driver "$bdf" ioatdma
else
@ -237,7 +227,7 @@ function reset_linux_pci {
# underscore vs. dash right in the virtio_scsi name.
modprobe virtio-pci || true
for dev_id in `cat $TMP`; do
for bdf in $(linux_iter_pci_dev_id 1af4 $dev_id); do
for bdf in $(iter_pci_dev_id 1af4 $dev_id); do
linux_bind_driver "$bdf" virtio-pci
done
done
@ -260,7 +250,7 @@ function status_linux {
echo "NVMe devices"
echo -e "BDF\t\tNuma Node\tDriver name\t\tDevice name"
for bdf in $(linux_iter_pci_class_code 0108); do
for bdf in $(iter_pci_class_code 01 08 02); do
driver=`grep DRIVER /sys/bus/pci/devices/$bdf/uevent |awk -F"=" '{print $2}'`
node=`cat /sys/bus/pci/devices/$bdf/numa_node`;
if [ "$driver" = "nvme" ]; then
@ -278,7 +268,7 @@ function status_linux {
| awk -F"x" '{print $2}'`
echo -e "BDF\t\tNuma Node\tDriver Name"
for dev_id in $TMP; do
for bdf in $(linux_iter_pci_dev_id 8086 $dev_id); do
for bdf in $(iter_pci_dev_id 8086 $dev_id); do
driver=`grep DRIVER /sys/bus/pci/devices/$bdf/uevent |awk -F"=" '{print $2}'`
node=`cat /sys/bus/pci/devices/$bdf/numa_node`;
echo -e "$bdf\t$node\t\t$driver"
@ -292,7 +282,7 @@ function status_linux {
| awk -F"x" '{print $2}'`
echo -e "BDF\t\tNuma Node\tDriver Name"
for dev_id in $TMP; do
for bdf in $(linux_iter_pci_dev_id 1af4 $dev_id); do
for bdf in $(iter_pci_dev_id 1af4 $dev_id); do
driver=`grep DRIVER /sys/bus/pci/devices/$bdf/uevent |awk -F"=" '{print $2}'`
node=`cat /sys/bus/pci/devices/$bdf/numa_node`;
echo -e "$bdf\t$node\t\t$driver"

View File

@ -4,12 +4,9 @@ set -e
testdir=$(readlink -f $(dirname $0))
rootdir=$(readlink -f $testdir/../../..)
source $rootdir/scripts/common.sh
source $rootdir/scripts/autotest_common.sh
function linux_iter_pci {
lspci -mm -n -D | grep $1 | tr -d '"' | awk -F " " '{print $1}'
}
function get_nvme_name_from_bdf {
lsblk -d --output NAME
if ! [ $(lsblk -d --output NAME | grep "^nvme") ]; then
@ -44,7 +41,7 @@ if [ `uname` = Linux ]; then
#
# note: more work probably needs to be done to properly handle devices with multiple
# namespaces
for bdf in $(linux_iter_pci 0108); do
for bdf in $(iter_pci_class_code 01 08 02); do
get_nvme_name_from_bdf "$bdf" blkname
if [ "$blkname" != "" ]; then
mountpoints=$(lsblk /dev/$blkname --output MOUNTPOINT -n | wc -w)
@ -107,7 +104,7 @@ fi
timing_enter identify
$rootdir/examples/nvme/identify/identify -i 0
for bdf in $(linux_iter_pci 0108); do
for bdf in $(iter_pci_class_code 01 08 02); do
$rootdir/examples/nvme/identify/identify -r "trtype:PCIe traddr:${bdf}" -i 0
done
timing_exit identify
@ -168,7 +165,7 @@ PLUGIN_DIR=$rootdir/examples/nvme/fio_plugin
if [ -d /usr/src/fio ]; then
timing_enter fio_plugin
for bdf in $(linux_iter_pci 0108); do
for bdf in $(iter_pci_class_code 01 08 02); do
# Only test when ASAN is not enabled. If ASAN is enabled, we cannot test.
if [ $SPDK_RUN_ASAN -eq 0 ]; then
LD_PRELOAD=$PLUGIN_DIR/fio_plugin /usr/src/fio/fio $PLUGIN_DIR/example_config.fio --filename="trtype=PCIe traddr=${bdf//:/.} ns=1"

View File

@ -1,5 +1,9 @@
#!/usr/bin/env bash
set -e
rootdir=$(readlink -f $(dirname $0))/../../..
source "$rootdir/scripts/common.sh"
BASE_DIR=$(readlink -f $(dirname $0))
[[ -z "$TEST_DIR" ]] && TEST_DIR="$(cd $BASE_DIR/../../../../ && pwd)"
[[ -z "$COMMON_DIR" ]] && COMMON_DIR="$(cd $BASE_DIR/../common && pwd)"
@ -91,7 +95,7 @@ while getopts 'xh-:' optchar; do
done
echo "INFO: Get NVMe disks:"
nvmes=($(lspci -mm -n | grep 0108 | tr -d '"' | awk -F " " '{print "0000:"$1}'))
nvmes=($(iter_pci_class_code 01 08 02))
if [[ -z $max_disks ]]; then
max_disks=${#nvmes[@]}