summaryrefslogtreecommitdiffstats
path: root/kernel/tracepoints/operational/runtest.sh
blob: 2daeac26be971648c38a38f820b7763143a63d71 (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
150
151
152
153
154
155
156
157
158
159
160
161
162
#!/bin/sh

# Source the common test script helpers
. /usr/bin/rhts-environment.sh

# Helper functions
function resultFail()
{
    echo "***** End of runtest.sh *****" | tee -a $OUTPUTFILE
    report_result $1 FAIL $2
    echo "" | tee -a $OUTPUTFILE
}

function resultPass ()
{
    echo "***** End of runtest.sh *****" | tee -a $OUTPUTFILE
    report_result $1 PASS $2
    echo "" | tee -a $OUTPUTFILE
}

function submitLog ()
{
    LOG=$1
    if [ -z "$TESTPATH" ]; then
        echo "Running in developer mode"
    else
        rhts_submit_log -S $RESULT_SERVER -T $TESTID -l $LOG
    fi
}

function testHeader ()
{
    echo "***** Starting the runtest.sh script *****" | tee $OUTPUTFILE
    echo "***** Current Running Kernel Package = "$kernbase" *****" | tee -a $OUTPUTFILE
    echo "***** Installed systemtap version = "$stapbase" *****" | tee -a $OUTPUTFILE
    echo "***** Current Running Distro = "$installeddistro" *****" | tee -a $OUTPUTFILE
}

function timeCalc ()
{
    # end & test time
    ETIME=`date +%s`
    TTIME=`expr $ETIME - $STIME`
}

function isCpuFamilyModel ()
{
    local CPU=$1
    local FAMILY=$2
    local MODEL=$3
    
    cat /proc/cpuinfo  | awk  "BEGIN {CPU=\"NO\"; FAMILY=\"NO\"; MODEL=\"NO\"; MATCH=1} /^vendor_id/ { CPU = \$3 }; /^cpu family/ { FAMILY=\$4}; /^model\t/ { MODEL=\$3}; (CPU == \"$CPU\") && (FAMILY == \"$FAMILY\") && (MODEL == \"$MODEL\") { MATCH=0}; END {exit MATCH}"
    return $?
}

function testList ()
{
    local TESTLIST="$1"
    local GROUP_SIZE="$2"
    local COUNT=0
    local PROBE_COUNT=`echo $TESTLIST | wc -w`
    local PROBES_FILE=`mktemp -p /tmp -t group.XXXXXX`
    local PROBES_NAME_FILE=`mktemp -p /tmp -t group_probe_names.XXXXXX`
    for i in $TESTLIST; do

        # Create unique log for verbose tracepoint logging
        COUNT=`expr $COUNT + 1`
        STIME=`date +%s`

        echo "$i" | tr -d '\"' >> $PROBES_NAME_FILE
        echo 'probe kernel.trace('$i') { dummy = dummy + 1; }' >> $PROBES_FILE

        if [ $((COUNT % GROUP_SIZE)) == 0 -o $COUNT == $PROBE_COUNT ]; then

            testHeader
            echo "------------------------------------------------------------" | tee -a $OUTPUTFILE
            echo "         Start of SystemTap Kernel Tracepoint Test          " | tee -a $OUTPUTFILE
            echo "         $STIME                                             " | tee -a $OUTPUTFILE
            echo "         Testing:                                           " | tee -a $OUTPUTFILE
            cat $PROBES_FILE | tee -a $OUTPUTFILE
            echo "------------------------------------------------------------" | tee -a $OUTPUTFILE

            echo "global dummy" > group.stap
            echo "probe end { printf(\"dummy: %d\n\", dummy); }" >> group.stap
            cat $PROBES_FILE >> group.stap

            local firstp=`head -1 $PROBES_NAME_FILE`
            local lastp=`tail -1 $PROBES_NAME_FILE`
            local VAR="$firstp"
            if [ ! "$firstp" == "$lastp" ]; then
                local VAR="${firstp}__to__${lastp}"
            fi
            local VERBOSETRACELOG=`mktemp -p /mnt/testarea -t $VAR-TraceLog.XXXXXX`

            stap -DSTP_NO_OVERLOAD $XTRA -t -c "sleep 1" -vvvv group.stap > $VERBOSETRACELOG 2>&1
            local rc=$?
            timeCalc
            if [ $rc -eq 0 ] ; then
                echo "       Result testing : Test Passed " | tee -a $OUTPUTFILE
                echo "       Test run time  : $TTIME seconds " | tee -a $OUTPUTFILE
                echo "------------------------------------------------------------" | tee -a $OUTPUTFILE
                resultPass $VAR $COUNT
            else
                echo "       Result testing : Test Failed " | tee -a $OUTPUTFILE
                echo "       Test run time  : $TTIME seconds " | tee -a $OUTPUTFILE
                echo "------------------------------------------------------------" | tee -a $OUTPUTFILE
                submitLog $VERBOSETRACELOG
                resultFail $VAR $COUNT
            fi
            rm -f $PROBES_FILE
            rm -f $PROBES_NAME_FILE
        fi
    done
}

function runTest ()
{
    local TESTLIST=`/usr/bin/stap -L 'kernel.trace("*")' | grep -o "\".*\""`
    if [ -z "$TESTLIST" ] ; then
        resultFail TESTLIST_EMPTY 99
        exit 0
    fi

    # Additional argumewnt to stap if Family is RHEL5 and CPU/Family/Model match
    [ "$FAMILY" == "RedHatEnterpriseLinuxServer5" ] && isCpuFamilyModel AuthenticAMD 21 2
    if [ "$?" == 0 ]; then
        XTRA="-DTRYLOCKDELAY=300"
    fi
    stap --clean-cache
    testList "$TESTLIST" 32
}

# Setup some variables
if [ -e /etc/redhat-release ] ; then
    installeddistro=`cat /etc/redhat-release`
else
    installeddistro=unknown
fi

kernbase=$(rpm -q --queryformat '%{name}-%{version}-%{release}.%{arch}\n' -qf /boot/config-$(uname -r))
stapbase=$(rpm -q --queryformat '%{name}-%{version}-%{release}.%{arch}\n' -qf /usr/bin/stap)

# Skip test if we are in FIPS mode, unsigned modules will cause kernel panic
grep "1" /proc/sys/crypto/fips_enabled  > /dev/null
if [ $? -eq 0 ]; then
    echo "***** Running in FIPS mode, stap modules would cause kernel panic ****" | tee -a $OUTPUTFILE
    report_result Test_Skipped PASS 1
    exit 0
fi

# Skip test if we are running an earlier distro (Supported in RHEL5.4)
KERNVER=`/bin/uname -r | /bin/awk -F- {'print $2'} | /bin/awk -F. {'print $1'}`
if uname -r | grep -q 'el[67]' || [ "$KERNVER" -ge "156" ]; then
    runTest
else
    echo "***** tracepoint not enabled in this kernel *****" | tee -a $OUTPUTFILE
    echo "***** End of runtest.sh *****" | tee -a $OUTPUTFILE
    echo"" | tee -a $OUTPUTFILE
    report_result Test_Skipped PASS 99
    echo "" | tee -a $OUTPUTFILE
    exit 0
fi