aboutsummaryrefslogtreecommitdiffstats
path: root/debian/tests/test-initscripts
blob: 1643a2ea6599190ec053d24d6e1a8103048c4aaf (plain)
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
138
139
140
141
142
143
144
145
146
147
148
149
#!/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
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}
    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-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 || /bin/true
    systemctl reset-failed dpdk.service || /bin/true

    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" 3 "${PRE}" "${POST}" "active"
    echo "### Restarting Service ###"
    ${PRE} restart "${POST}"
    checkstatus "${TYPE}-RESTART" 3 "${PRE}" "${POST}" "active"
}

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

# 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"