Merge ~alextu/plainbox-provider-pc-sanity:nvidia-rtd3-checking-v2 into plainbox-provider-pc-sanity:master

Proposed by Alex Tu
Status: Merged
Merged at revision: 2ca35543b651a18559f32177e3a4a998a3a41328
Proposed branch: ~alextu/plainbox-provider-pc-sanity:nvidia-rtd3-checking-v2
Merge into: plainbox-provider-pc-sanity:master
Diff against target: 367 lines (+329/-1)
5 files modified
bin/check-nvidia.sh (+186/-0)
debian/control (+1/-0)
test/test-check-nvidia.bats (+133/-0)
units/pc-sanity/packaging.pxu (+0/-1)
units/pc-sanity/pc-sanity-nvidia.pxu (+9/-0)
Reviewer Review Type Date Requested Status
Cyrus Lien Approve
Shih-Yuan Lee Pending
Kai-Chuan Hsieh Pending
OEM Solutions Group: Engineers Pending
Review via email: mp+394049@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Alex Tu (alextu) wrote :
Revision history for this message
Alex Tu (alextu) wrote :
Revision history for this message
Alex Tu (alextu) wrote :
Revision history for this message
Alex Tu (alextu) wrote :

this is a test result on 202010-28303 (IP: 192.168.101.32) in nvidia on-demand mode for reference :
https://pastebin.ubuntu.com/p/R7hxTS6sv8/

Revision history for this message
Alex Tu (alextu) wrote :
Revision history for this message
Alex Tu (alextu) wrote :
Revision history for this message
Cyrus Lien (cyruslien) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/bin/check-nvidia.sh b/bin/check-nvidia.sh
2new file mode 100755
3index 0000000..85b0a04
4--- /dev/null
5+++ b/bin/check-nvidia.sh
6@@ -0,0 +1,186 @@
7+#!/bin/bash
8+#set -x
9+OUTPUT_FOLDER=/tmp
10+test_result="PASS"
11+#readonly function_pass=0
12+readonly function_failed=1
13+
14+usage() {
15+cat << EOF
16+usage: $(basename "$0") options
17+
18+A script to check if nvidia driver behave as expected.
19+Nvidia introduce runtime pm (RTD3) from version 450,
20+this script is target to check the expected behavior of nviia driver, and gpu manager.
21+
22+This script will need some environment precondition that DISPLAY environment is assigned,
23+nvidia-prime and ubuntu-drivers-common are installed. Nvidia drvier newer than version 450.
24+Powertop is needed to check the sleep status of nvidia graphic.
25+
26+ -h|--help print this message
27+ --dry-run dryrun
28+ --out The output folder for generated logs. The default one is /tmp/
29+
30+EOF
31+}
32+
33+show_error() {
34+ >&2 echo "[ERROR] ""$1"
35+ test_result="FAILED"
36+ if [ -n "$2" ]; then
37+ case "$2" in
38+ exit1 )
39+ exit 1
40+ ;;
41+ exit0 )
42+ exit 0
43+ ;;
44+ usage-exit1 )
45+ usage
46+ exit 1
47+ ;;
48+ * )
49+ ;;
50+ esac
51+ fi
52+}
53+
54+collect_nvidia_debug_info() {
55+ local logs_folder="$OUTPUT_FOLDER/nvidia-debug-logs"
56+ mkdir -p "$logs_folder"
57+ echo "/proc/driver/nvidia/params:" >> $OUTPUT_FOLDER/nvidia-debug-log
58+ if [ -f /proc/driver/nvidia/params ]; then
59+ cat /proc/driver/nvidia/params >> $OUTPUT_FOLDER/nvidia-debug-log
60+ else
61+ echo "file is not there" >> $OUTPUT_FOLDER/nvidia-debug-log
62+ fi
63+
64+ echo "/var/log/gpu-manager.log:" >> $OUTPUT_FOLDER/nvidia-debug-log
65+ if [ -f /var/log/gpu-manager.log ]; then
66+ cp /var/log/gpu-manager.log $logs_folder
67+ echo "Copied file to $logs_folder" >> $OUTPUT_FOLDER/nvidia-debug-log
68+ else
69+ echo "file is not there" >> $OUTPUT_FOLDER/nvidia-debug-log
70+ fi
71+
72+ echo "nvidia-smi:" >> $OUTPUT_FOLDER/nvidia-debug-log
73+ nvidia-smi >> $OUTPUT_FOLDER/nvidia-debug-log
74+}
75+
76+get_powertop_report() {
77+ sudo powertop --csv="$OUTPUT_FOLDER"/"$filename" -t 3 || show_error "Powertop failed.." usage-exit1
78+}
79+check_nvidia_sleep() {
80+ local result
81+ local filename="$1powertop.csv"
82+ get_powertop_report "$filename"
83+ result="$(grep -i "NVIDIA" $OUTPUT_FOLDER/"$filename" | grep "%" | grep -v checkbox | awk -F'%' '{ if ($1 > 0) print "failed:"$0}')"
84+ if [ -n "$result" ]; then
85+ show_error "$result"
86+ show_error "nvidia devices not sleep deep to 0%. Check $OUTPUT_FOLDER/$filename for detail."
87+ return $function_failed
88+ fi
89+}
90+check_environment() {
91+ [ -n "$DISPLAY" ] || show_error "Please assign DISPLAY enviornment." usage-exit1
92+ glxinfo > /dev/null || show_error "Failed to execute glxinfo" usage-exit1
93+ dpkg --compare-versions "$(modinfo nvidia -F version)" "gt" "450" || show_error "[ERROR] $(basename "$0") only support nvidia driver >= 450." usage-exit1
94+ command -v prime-select || show_error "nvidia-prime is not installed." usage-exit1
95+ command -v gpu-manager || show_error "ubuntu-drivers-common is not installed." usage-exit1
96+ command -v powertop || show_error "powertop is not installed." usage-exit1
97+}
98+check_renderer() {
99+ local renderer
100+ case $1 in
101+ on-demand-default )
102+ renderer="$(__NV_PRIME_RENDER_OFFLOAD=0 __GLX_VENDOR_LIBRARY_NAME="" glxinfo | grep "OpenGL renderer string")"
103+ [ -z "${renderer##*Intel*}" ] || show_error "The default renderer is NOT Intel in on-demand." exit1
104+ ;;
105+ on-demand-nvidia )
106+ renderer="$(__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia glxinfo | grep "OpenGL renderer string")"
107+ [ -n "${renderer##*Intel*}" ] || show_error "renderer is Intel in on-demand with Nvidia runtime parameters." exit1
108+ [ -n "${renderer##*LLVM*}" ] || show_error "renderer is LLVM in nvidia mode (performance)." exit1
109+ ;;
110+ nvidia )
111+ local renderer
112+ renderer="$(glxinfo | grep "OpenGL renderer string")"
113+ [ -n "${renderer##*Intel*}" ] || show_error "renderer is Intel in nvidia mode (performance)." exit1
114+ [ -n "${renderer##*LLVM*}" ] || show_error "renderer is LLVM in nvidia mode (performance)." exit1
115+ ;;
116+ intel )
117+ renderer="$(glxinfo | grep "OpenGL renderer string")"
118+ [ -z "${renderer##*Intel*}" ] || show_error "renderer is NOT Intel in intel mode(powersaving)." exit1
119+ ;;
120+ * )
121+ show_error "[ERROR][CODE] Not assigned which mode to check." usage-exit1
122+ ;;
123+ esac
124+}
125+check_ondemand_mode() {
126+ check_nvidia_sleep ondemand_
127+ check_renderer on-demand-default
128+ check_renderer on-demand-nvidia
129+}
130+check_nvidia_mode() {
131+ check_renderer nvidia
132+}
133+check_intel_mode() {
134+ check_renderer intel
135+ check_nvidia_sleep intel_
136+}
137+check_behavior_of_current_mode() {
138+ local NV_MODE
139+ NV_MODE="$(prime-select query)"
140+ case "$NV_MODE" in
141+ on-demand)
142+ echo "[INFO] current mode is on-demand mode."
143+ check_ondemand_mode
144+ ;;
145+ nvidia)
146+ echo "[INFO] current mode is nvidia mode."
147+ check_nvidia_mode
148+ ;;
149+ intel)
150+ echo "[INFO] current mode is intel mode."
151+ check_intel_mode
152+ ;;
153+ *)
154+ show_error "Unsupported mode: $NV_MODE" usage-exit1
155+ ;;
156+ esac
157+}
158+
159+main() {
160+ while [ $# -gt 0 ]
161+ do
162+ case "$1" in
163+ -h | --help)
164+ usage 0
165+ exit 0
166+ ;;
167+ --out)
168+ shift;
169+ OUTPUT_FOLDER=$1;
170+ ;;
171+ *)
172+ show_error "[ERROR] not support parameger $1" usage-exit1
173+ usage
174+ esac
175+ shift
176+ done
177+
178+ check_environment
179+ check_behavior_of_current_mode
180+}
181+
182+if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
183+ main "$@"
184+ if [ "$test_result" = "PASS" ]; then
185+ echo "[INFO] passed"
186+ else
187+ collect_nvidia_debug_info
188+ echo "[ERROR] $(basename "$0") testing failed."
189+ exit "$function_failed"
190+ fi
191+fi
192+
193diff --git a/debian/control b/debian/control
194index 441a981..4d2fdbb 100644
195--- a/debian/control
196+++ b/debian/control
197@@ -9,6 +9,7 @@ Vcs-Browser: https://code.launchpad.net/~ville-team/ville/+git/plainbox-provider
198 Package: plainbox-provider-pc-sanity
199 Architecture: all
200 Depends: plainbox-provider-checkbox (>= 0.27),
201+ powertop,
202 python3 (>= 3.2),
203 python3-checkbox-support (>= 0.27),
204 ${misc:Depends},
205diff --git a/test/test-check-nvidia.bats b/test/test-check-nvidia.bats
206new file mode 100644
207index 0000000..b0daffd
208--- /dev/null
209+++ b/test/test-check-nvidia.bats
210@@ -0,0 +1,133 @@
211+#!/usr/bin/env bats
212+
213+# execute this test file by `bats test/test-check-nvidia.bats`
214+BIN_FOLDER="bin"
215+
216+function setup() {
217+ # shellcheck source=/dev/null
218+ source "$BIN_FOLDER"/check-nvidia.sh
219+}
220+
221+@test "recognize current mode" {
222+ set -e
223+ function prime-select() {
224+ echo "$current_mode"
225+ }
226+ function check_ondemand_mode() {
227+ return "$on_demand_mode"
228+ }
229+ function check_nvidia_mode() {
230+ return "$nvidia_mode"
231+ }
232+ function check_intel_mode() {
233+ return "$intel_mode"
234+ }
235+ on_demand_mode=1
236+ nvidia_mode=2
237+ intel_mode=3
238+
239+ echo "testing recognizing on-demand mode"
240+ current_mode="on-demand"
241+ run check_behavior_of_current_mode
242+ [ "$status" -eq $on_demand_mode ]
243+ echo "testing recognizing nvidia mode"
244+ current_mode="nvidia"
245+ run check_behavior_of_current_mode
246+ [ "$status" -eq $nvidia_mode ]
247+ echo "testing recognizing intel mode"
248+ current_mode="intel"
249+ run check_behavior_of_current_mode
250+ [ "$status" -eq $intel_mode ]
251+
252+}
253+
254+@test "Check renderer when OpenGL renderer string: Mesa Intel(R)" {
255+ set -e
256+ glxinfo_string="OpenGL renderer string: Mesa Intel(R)"
257+ function glxinfo() {
258+ echo "$glxinfo_string"
259+ }
260+ echo run check_renderer intel
261+ run check_renderer intel
262+ [ "$status" -eq 0 ]
263+
264+ echo run check_renderer on-demand-default
265+ run check_renderer on-demand-default
266+ [ "$status" -eq 0 ]
267+
268+ echo run check_renderer on-demand-nvidia
269+ run check_renderer on-demand-nvidia
270+ [ "$status" -eq 1 ]
271+ echo run check_renderer on-nvidia
272+ run check_renderer nvidia
273+ [ "$status" -eq 1 ]
274+}
275+
276+@test "Check renderer when OpenGL renderer string: GeForce GTX" {
277+ set -e
278+ glxinfo_string="OpenGL renderer string: GeForce GTX"
279+ function glxinfo() {
280+ echo "$glxinfo_string"
281+ }
282+ echo run check_renderer intel
283+ run check_renderer intel
284+ [ "$status" -eq 1 ]
285+
286+ echo run check_renderer on-demand-default
287+ run check_renderer on-demand-default
288+ [ "$status" -eq 1 ]
289+
290+ echo run check_renderer on-demand-nvidia
291+ run check_renderer on-demand-nvidia
292+ [ "$status" -eq 0 ]
293+ echo run check_renderer on-nvidia
294+ run check_renderer nvidia
295+ [ "$status" -eq 0 ]
296+}
297+@test "Check renderer when OpenGL renderer string: llvmpipe (LLVM 10.0.0, 256 bits)" {
298+ set -e
299+ glxinfo_string="OpenGL renderer string: llvmpipe (LLVM 10.0.0, 256 bits)"
300+ function glxinfo() {
301+ echo "$glxinfo_string"
302+ }
303+ echo run check_renderer intel
304+ run check_renderer intel
305+ [ "$status" -eq 1 ]
306+
307+ echo run check_renderer on-demand-default
308+ run check_renderer on-demand-default
309+ [ "$status" -eq 1 ]
310+
311+ echo run check_renderer on-demand-nvidia
312+ run check_renderer on-demand-nvidia
313+ [ "$status" -eq 1 ]
314+ echo run check_renderer on-nvidia
315+ run check_renderer nvidia
316+ [ "$status" -eq 1 ]
317+}
318+
319+@test "Check Nvidia sleep in on-demand and Intel mode" {
320+ set -e
321+ OUTPUT_FOLDER="$(mktemp -d)"
322+
323+ function get_powertop_report() {
324+ rm -f "$OUTPUT_FOLDER"/"$1"
325+ echo "$powertop_str1" > "$OUTPUT_FOLDER"/"$1"
326+ echo "$powertop_str2" >> "$OUTPUT_FOLDER"/"$1"
327+ }
328+
329+ # the string will show by checkbox process
330+ powertop_str1="100.0%;checkbox nvidia"
331+
332+ echo "When Nvidia not sleep deep to 0%, it should be failed."
333+ powertop_str2="30.0%;PCI Device: NVIDIA"
334+ run check_nvidia_sleep ondemand_
335+ run check_nvidia_sleep intel_
336+ [ "$status" -eq 1 ]
337+ echo "When Nvidia sleep deep to 0%, it should be pass."
338+ powertop_str2="0.0%;PCI Device: NVIDIA"
339+ run check_nvidia_sleep ondemand_
340+ run check_nvidia_sleep intel_
341+ [ "$status" -eq 0 ]
342+}
343+
344diff --git a/units/pc-sanity/packaging.pxu b/units/pc-sanity/packaging.pxu
345index 31ac911..953bef7 100644
346--- a/units/pc-sanity/packaging.pxu
347+++ b/units/pc-sanity/packaging.pxu
348@@ -2,4 +2,3 @@
349 unit: packaging meta-data
350 os-id: debian
351 Depends: plainbox-provider-certification-client
352-
353diff --git a/units/pc-sanity/pc-sanity-nvidia.pxu b/units/pc-sanity/pc-sanity-nvidia.pxu
354new file mode 100644
355index 0000000..3d7153a
356--- /dev/null
357+++ b/units/pc-sanity/pc-sanity-nvidia.pxu
358@@ -0,0 +1,9 @@
359+plugin: shell
360+category_id: com.canonical.plainbox::miscellanea
361+id: miscellanea/check-nvidia
362+command:
363+ set -x
364+ check-nvidia.sh
365+_summary: check if nvidia dgpu behave as we expected.
366+_description:
367+ Nvidia introduce runtime D3 (runtime pm) from Nvidia driver version 450. This test case is used to check if everything work as expected.

Subscribers

People subscribed via source and target branches