File: 348

package info (click to toggle)
pcp 7.0.5-1
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 252,916 kB
  • sloc: ansic: 1,478,844; sh: 177,285; xml: 160,462; cpp: 83,809; python: 24,349; perl: 18,303; yacc: 6,877; lex: 2,864; makefile: 2,694; awk: 165; fortran: 60; java: 52
file content (236 lines) | stat: -rwxr-xr-x 6,254 bytes parent folder | download
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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
#!/bin/sh
# PCP QA Test No. 348
# Install/Remove for Linux KVM pmda
#
# Copyright (c) 2020 Red Hat.
# Copyright (c) 2008 Aconex.  All Rights Reserved.
#

seq=`basename $0`
echo "QA output created by $seq"

# get standard filters
. ./common.product
. ./common.filter
. ./common.check

[ -d $PCP_PMDAS_DIR/kvm ] || _notrun "KVM PMDA not installed"
[ $PCP_PLATFORM = linux ] || _notrun "KVM only exists on Linux"
kvm_stats_path=/sys/kernel/debug/kvm
$sudo [ -d $kvm_stats_path ] || _notrun "KVM sysfs interface not available"
count=`$sudo ls $kvm_stats_path | wc -l`
[ "$count" -eq 0 ] && _notrun "KVM kernel instrumentation is disabled"
lockdown=/sys/kernel/security/lockdown
if [ -f $lockdown ]
then
    $sudo grep -F -q '[integrity]' $lockdown && _notrun "Kernel in lockdown"
    $sudo grep -F -q '[confidentiality]' $lockdown && _notrun "Kernel in lockdown"
fi

status=1
done_clean=false

install_on_cleanup=false
pminfo kvm >/dev/null 2>&1 && install_on_cleanup=true

_cleanup()
{
    if $done_clean
    then
	:
    else
	[ -f $tmp.kvm.conf ] && $sudo cp $tmp.kvm.conf $PCP_PMDAS_DIR/kvm/kvm.conf
	[ -f $tmp.pmcd.conf ] && $sudo cp $tmp.pmcd.conf $PCP_PMCDCONF_PATH
	_service pmcd restart 2>&1 | _filter_pcp_restart
	_wait_for_pmcd
	_service pmlogger restart 2>&1 | _filter_pcp_restart
	_wait_for_pmlogger
	if $install_on_cleanup
	then
	    ( cd $PCP_PMDAS_DIR/kvm; $sudo ./Install </dev/null >/dev/null 2>&1 )
	else
	    ( cd $PCP_PMDAS_DIR/kvm; $sudo ./Remove >/dev/null 2>&1 )
	fi
	_restore_auto_restart pmcd
	done_clean=true
    fi
    $sudo rm -f $tmp.*
    exit $status
}

trap "_cleanup" 0 1 2 3 15

_filter()
{
    _filter_pmcd_log | sed -e 's/pmdakvm([1-9][0-9]*)/pmdakvm(PID)/g'
}

# real QA test starts here
iam=kvm
cd $PCP_PMDAS_DIR/$iam
_stop_auto_restart pmcd

# create our own kvm config files for deterministic testing.
cat > $tmp.default.conf << EOF
[paths]
debugfs=/sys/kernel/debug
tracefs=/sys/kernel/debug/tracing

# dynamically created kvm.trace metrics.
[trace]
kvm_exit
kvm_entry
kvm_mmio
kvm_hypercall
kvm_vcpu_wakeup
EOF

# sysfs files reflecting locked down kernel states
echo 'none [integrity] confidentiality' > $tmp.integrity
cat > $tmp.integrity.conf << EOF
[paths]
debugfs=/sys/kernel/debug
tracefs=/sys/kernel/debug/tracing
lockdown=$tmp.integrity
EOF
echo 'none integrity [confidentiality]' > $tmp.confidentiality
cat > $tmp.confidentiality.conf << EOF
[paths]
debugfs=/sys/kernel/debug
tracefs=/sys/kernel/debug/tracing
lockdown=$tmp.confidentiality
EOF

# copy the config files to restore state later.
cp $PCP_PMCDCONF_PATH $tmp.pmcd.conf
cp $PCP_PMDAS_DIR/kvm/kvm.conf $tmp.kvm.conf

# start from a known starting point
$sudo ./Remove >/dev/null 2>&1

echo
echo "=== $iam agent installation (kernel locked down for integrity) ==="
$sudo cp $tmp.integrity.conf $PCP_PMDAS_DIR/kvm/kvm.conf
$sudo ./Install </dev/null >$tmp.out 2>&1
# Check kvm metrics have appeared ... X warnings, Y metrics and 0 values
_filter_pmda_install <$tmp.out \
| $PCP_AWK_PROG '
/Check kvm metrics have appeared/	{ if ($7 >= 30) $7 = "X"
					  if ($9 >= 30) $9 = "Y"
					}
					{ print }'
grep lockdown $PCP_LOG_DIR/pmcd/kvm.log | _filter

echo
echo "=== $iam agent installation (kernel locked down for confidentiality) ==="
$sudo cp $tmp.confidentiality.conf $PCP_PMDAS_DIR/kvm/kvm.conf
$sudo ./Install </dev/null >$tmp.out 2>&1
# Check kvm metrics have appeared ... X warnings, Y metrics and 0 values
_filter_pmda_install <$tmp.out \
| $PCP_AWK_PROG '
/Check kvm metrics have appeared/	{ if ($7 >= 30) $7 = "X"
					  if ($9 >= 30) $9 = "Y"
					}
					{ print }'
grep lockdown $PCP_LOG_DIR/pmcd/kvm.log | _filter

echo
echo "=== $iam agent installation (normal kernel mode) ==="
$sudo cp $tmp.default.conf $PCP_PMDAS_DIR/kvm/kvm.conf
$sudo ./Install </dev/null >$tmp.out 2>&1
# Check kvm metrics have appeared ... X metrics and Y values
_filter_pmda_install <$tmp.out \
| $PCP_AWK_PROG '
/Check kvm metrics have appeared/	{ if ($7 >= 30) $7 = "X"
					  if ($10 >= 30) $10 = "Y"
					}
					{ print }'
grep lockdown $PCP_LOG_DIR/pmcd/kvm.log | _filter

if pminfo -v $iam
then
    :
else
    echo "... failed! ... here is the Install log ..."
    cat $tmp.out
fi

echo
echo "=== validate values ==="
rm -f $tmp.stats $tmp.values $tmp.probe $tmp.diff
pmprobe -v $iam | LC_COLLATE=POSIX sort > $tmp.probe
echo "from pmprobe ..." >>$seq_full
cat $tmp.probe >>$seq_full
for stat in `$sudo find $kvm_stats_path -mindepth 1`
do
    case $stat
    in
	$kvm_stats_path/[0-9]*)
	    continue
	    ;;
    esac
    value=`$sudo cat $stat`
    echo $stat 1 $value | sed -e "s,$kvm_stats_path/,kvm.,g" >> $tmp.stats
done
LC_COLLATE=POSIX sort $tmp.stats > $tmp.values
echo "from /sys/kernel/debug/kvm ..." >>$seq_full
cat $tmp.values >>$seq_full
LC_COLLATE=POSIX join $tmp.probe $tmp.values >$tmp.all
echo >>$seq_full
cat $tmp.all >>$seq_full

echo
echo "=== check values ==="
cat $tmp.all \
| while read metric n1 vpcp n2 vsys
do
    # test for Linux kernel version-specific metrics ... these may not be present
    #
    case "$metric"
    in
	# this group may be missing from /sys/kernel/debug/kvm but if
	# present (they survive the join above), they need to be skipped
	# here so that the output is deterministic
	# 
	kvm.directed_yield_attempted)		;;
	kvm.directed_yield_successful)		;;
	kvm.efer_reload)			;;
	kvm.guest_mode)				;;
	kvm.halt_poll_invalid)			;;
	kvm.halt_successful_poll)		;;
	kvm.irq_window)				;;
	kvm.irq_window_exits)			;;
	kvm.largepages)				;;
	kvm.l1d_flush)				;;
	kvm.max_mmu_page_hash_collisions)	;;
	kvm.mmu_pte_updated)			;;
	kvm.nested_run)				;;
	kvm.nmi_window)				;;
	kvm.nmi_window_exits)			;;
	kvm.req_event)				;;
	kvm.request_irq)			;;
	kvm.request_irq_exits)			;;

	kvm.halt_attempted_poll)		# special case
	    _within_tolerance $metric $vpcp $vsys 2%
	    [ $? -eq 0 ] || echo Platform $metric is out of range $vpcp vs $vsys
	    ;;

	*)					# default tolerence check
	    if [ "$n1" = 1 -a "$n2" = 1 ]
	    then
		_within_tolerance $metric $vpcp $vsys 2% -v
	    else
		echo "$metric: number of values not 1 as expected: pcp $n1 /sys $n2"
	    fi
	    ;;
    esac
done | tee -a $seq_full

echo
echo "=== remove $iam agent ==="
$sudo ./Remove >$tmp.out 2>&1
_filter_pmda_remove <$tmp.out

status=0
exit