| From foo@baz Wed Dec 6 18:04:41 CET 2017 |
| From: Thomas Richter <tmricht@linux.vnet.ibm.com> |
| Date: Wed, 13 Sep 2017 10:12:08 +0200 |
| Subject: perf test attr: Fix python error on empty result |
| |
| From: Thomas Richter <tmricht@linux.vnet.ibm.com> |
| |
| |
| [ Upstream commit 3440fe2790aa3d13530260af6033533b18959aee ] |
| |
| Commit d78ada4a767 ("perf tests attr: Do not store failed events") does |
| not create an event file in the /tmp directory when the |
| perf_open_event() system call failed. |
| |
| This can lead to a situation where not /tmp/event-xx-yy-zz result file |
| exists at all (for example on a s390x virtual machine environment) where |
| no CPUMF hardware is available. |
| |
| The following command then fails with a python call back chain instead |
| of printing failure: |
| |
| [root@s8360046 perf]# /usr/bin/python2 ./tests/attr.py -d ./tests/attr/ \ |
| -p ./perf -v -ttest-stat-basic |
| running './tests/attr//test-stat-basic' |
| Traceback (most recent call last): |
| File "./tests/attr.py", line 379, in <module> |
| main() |
| File "./tests/attr.py", line 370, in main |
| run_tests(options) |
| File "./tests/attr.py", line 311, in run_tests |
| Test(f, options).run() |
| File "./tests/attr.py", line 300, in run |
| self.compare(self.expect, self.result) |
| File "./tests/attr.py", line 248, in compare |
| exp_event.diff(res_event) |
| UnboundLocalError: local variable 'res_event' referenced before assignment |
| [root@s8360046 perf]# |
| |
| This patch catches this pitfall and prints an error message instead: |
| |
| [root@s8360047 perf]# /usr/bin/python2 ./tests/attr.py -d ./tests/attr/ \ |
| -p ./perf -vvv -ttest-stat-basic |
| running './tests/attr//test-stat-basic' |
| loading expected events |
| Event event:base-stat |
| fd = 1 |
| group_fd = -1 |
| flags = 0|8 |
| [....] |
| sample_regs_user = 0 |
| sample_stack_user = 0 |
| 'PERF_TEST_ATTR=/tmp/tmpJbMQMP ./perf stat -o /tmp/tmpJbMQMP/perf.data -e cycles kill >/dev/null 2>&1' ret '1', expected '1' |
| loading result events |
| compare |
| matching [event:base-stat] |
| match: [event:base-stat] matches [] |
| res_event is empty |
| FAILED './tests/attr//test-stat-basic' - match failure |
| [root@s8360047 perf]# |
| |
| Signed-off-by: Thomas-Mich Richter <tmricht@linux.vnet.ibm.com> |
| Acked-by: Jiri Olsa <jolsa@kernel.org> |
| Cc: Heiko Carstens <heiko.carstens@de.ibm.com> |
| Cc: Hendrik Brueckner <brueckner@linux.vnet.ibm.com> |
| Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> |
| Cc: Thomas-Mich Richter <tmricht@linux.vnet.ibm.com> |
| LPU-Reference: 20170913081209.39570-1-tmricht@linux.vnet.ibm.com |
| Link: http://lkml.kernel.org/n/tip-04d63nn7svfgxdhi60gq2mlm@git.kernel.org |
| Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Signed-off-by: Sasha Levin <alexander.levin@verizon.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| tools/perf/tests/attr.py | 6 +++++- |
| 1 file changed, 5 insertions(+), 1 deletion(-) |
| |
| --- a/tools/perf/tests/attr.py |
| +++ b/tools/perf/tests/attr.py |
| @@ -238,6 +238,7 @@ class Test(object): |
| # events in result. Fail if there's not any. |
| for exp_name, exp_event in expect.items(): |
| exp_list = [] |
| + res_event = {} |
| log.debug(" matching [%s]" % exp_name) |
| for res_name, res_event in result.items(): |
| log.debug(" to [%s]" % res_name) |
| @@ -254,7 +255,10 @@ class Test(object): |
| if exp_event.optional(): |
| log.debug(" %s does not match, but is optional" % exp_name) |
| else: |
| - exp_event.diff(res_event) |
| + if not res_event: |
| + log.debug(" res_event is empty"); |
| + else: |
| + exp_event.diff(res_event) |
| raise Fail(self, 'match failure'); |
| |
| match[exp_name] = exp_list |