1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
#!/bin/sh
set -e
basedir=$(dirname "$0")
# 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
EXPECT16MHP=2
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}
EXPECTEDSTATUS=${3}
echo "Status after ${MARK}"
echo "Status of the Service"
systemctl status "dpdk.service" || true
GOTSTATUS=$(systemctl status "dpdk.service" | 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-16384kB ]; 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}"
checkhp "hugepages-16384kB" "${EXPECT16MHP}"
# We do not check 1G/16M 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 2>/dev/null || /bin/true
systemctl reset-failed dpdk.service 2>/dev/null || /bin/true
echo "Unmounting all potential hugetlbfs mounts"
awk '/hugetlbfs/ {print $2}' /proc/mounts | while read hugetlbmount; do
umount -v "$hugetlbmount"
done
}
echo "NR_2M_PAGES=$EXPECT2MHP" >> ${DPDK_CONF}
echo "NR_1G_PAGES=$EXPECT1GHP" >> ${DPDK_CONF}
echo "NR_16M_PAGES=$EXPECT16MHP" >> ${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
# 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
POST=${2}
TYPE=${3}
printf "\n\n### Reset ###\n"
resetservice
printf "\n\n### Check initial state ###\n"
checkstatus "${TYPE}-BEGIN" 0 "inactive"
echo "### Starting Service ###"
systemctl start "dpdk.service"
checkstatus "${TYPE}-START" 3 "active"
echo "### Restarting Service ###"
systemctl restart "dpdk.service"
checkstatus "${TYPE}-RESTART" 3 "active"
|