perf bench: Fix numa report output code
Jiri Olsa
reviewerPATCH 1/1 perf bench: Fix numa report output code
Currently we can hit following assert when running numa bench:
$ perf bench numa mem -p 3 -t 1 -P 512 -s 100 -zZ0cm --thp 1 perf: bench/numa.c:1577: __bench_numa: Assertion `!(!(((wait_stat) & 0x7f) == 0))' failed.
The assertion is correct, because we hit the SIGFPE in following line:
Thread 2.2 "thread 0/0" received signal SIGFPE, Arithmetic exception. [Switching to Thread 0x7fffd28c6700 (LWP 11750)]
0x000.. in worker_thread (__tdata=0x7.. ) at bench/numa.c:1257 1257 td->speed_gbs = bytes_done / (td->runtime_ns / NSEC_PER_SEC) / 1e9;
We don't check if the runtime is actually bigger than 1 second, and thus this might end up with zero division within FPU.
Adding the check to prevent this.
--- tools/perf/bench/numa.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
tools/perf/bench/numa.c +3 -2
@@ -1098,7 +1098,7 @@ static void *worker_thread(void *__tdata)u8 *global_data;u8 *process_data;u8 *thread_data; -u64 bytes_done; +u64 bytes_done, secs;long work_done;u32 l;struct rusage rusage;
@@ -1254,7 +1254,8 @@ static void *worker_thread(void *__tdata)timersub (&stop, &start0, &diff); td->runtime_ns = diff.tv_sec *NSEC_PER_SEC ; td->runtime_ns += diff.tv_usec *NSEC_PER_USEC ; - td->speed_gbs = bytes_done / (td->runtime_ns /NSEC_PER_SEC ) /1e9 ; + secs = td->runtime_ns /NSEC_PER_SEC ; + td->speed_gbs = secs ? bytes_done / secs /1e9 :0 ;getrusage (RUSAGE_THREAD , &rusage); td->system_time_ns = rusage.ru_stime.tv_sec *NSEC_PER_SEC ;
Signature · 1 line
2.13.6
Em Wed, Jun 20, 2018 at 11:40:36AM +0200, Jiri Olsa escreveu:
Quoted 12 lines
Currently we can hit following assert when running numa bench:
$ perf bench numa mem -p 3 -t 1 -P 512 -s 100 -zZ0cm --thp 1 perf: bench/numa.c:1577: __bench_numa: Assertion `!(!(((wait_stat) & 0x7f) == 0))' failed.The assertion is correct, because we hit the SIGFPE in following line:
Thread 2.2 "thread 0/0" received signal SIGFPE, Arithmetic exception. [Switching to Thread
0x7fffd28c6700(LWP 11750)]
0x000.. inworker_thread(__tdata=0x7.. ) atbench/numa.c:12571257td->speed_gbs=bytes_done/ (td->runtime_ns/NSEC_PER_SEC) / 1e9;
Quoted 7 lines
We don't check if the runtime is actually bigger than 1 second, and thus this might end up with zero division within FPU.
Adding the check to prevent this.
Signed-off-by Jiri Olsa <[email protected]>
thanks, applied to perf/urgent.
- Arnaldo
tip-bot for Jiri Olsa
merge botperf bench: Fix numa report output code
Commit-ID: 983107072be1a39cbde67d45cb0059138190e015 Gitweb: https://git.kernel.org/tip/983107072be1a39cbde67d45cb0059138190e015 Author: Jiri Olsa <[email protected]> AuthorDate: Wed, 20 Jun 2018 11:40:36 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 25 Jun 2018 11:59:37 -0300
perf bench: Fix numa report output code
Currently we can hit following assert when running numa bench:
$ perf bench numa mem -p 3 -t 1 -P 512 -s 100 -zZ0cm --thp 1 perf: bench/numa.c:1577: __bench_numa: Assertion `!(!(((wait_stat) & 0x7f) == 0))' failed.
The assertion is correct, because we hit the SIGFPE in following line:
Thread 2.2 "thread 0/0" received signal SIGFPE, Arithmetic exception. [Switching to Thread 0x7fffd28c6700 (LWP 11750)]
0x000.. in worker_thread (__tdata=0x7.. ) at bench/numa.c:1257 1257 td->speed_gbs = bytes_done / (td->runtime_ns / NSEC_PER_SEC) / 1e9;
We don't check if the runtime is actually bigger than 1 second, and thus this might end up with zero division within FPU.
Adding the check to prevent this.
--- tools/perf/bench/numa.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
tools/perf/bench/numa.c +3 -2
@@ -1098,7 +1098,7 @@ static void *worker_thread(void *__tdata)u8 *global_data;u8 *process_data;u8 *thread_data; -u64 bytes_done; +u64 bytes_done, secs;long work_done;u32 l;struct rusage rusage;
@@ -1254,7 +1254,8 @@ static void *worker_thread(void *__tdata)timersub (&stop, &start0, &diff); td->runtime_ns = diff.tv_sec *NSEC_PER_SEC ; td->runtime_ns += diff.tv_usec *NSEC_PER_USEC ; - td->speed_gbs = bytes_done / (td->runtime_ns /NSEC_PER_SEC ) /1e9 ; + secs = td->runtime_ns /NSEC_PER_SEC ; + td->speed_gbs = secs ? bytes_done / secs /1e9 :0 ;getrusage (RUSAGE_THREAD , &rusage); td->system_time_ns = rusage.ru_stime.tv_sec *NSEC_PER_SEC ;