Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

powerpc/mm: Add trace point for tracking hash pte fault

This enables us to understand how many hash fault we are taking
when running benchmarks.

For ex:
-bash-4.2# ./perf stat -e powerpc:hash_fault -e page-faults /tmp/ebizzy.ppc64 -S 30 -P -n 1000
...

Performance counter stats for '/tmp/ebizzy.ppc64 -S 30 -P -n 1000':

1,10,04,075 powerpc:hash_fault
1,10,03,429 page-faults

30.865978991 seconds time elapsed

NOTE:
The impact of the tracepoint was not noticeable when running test. It was
within the run-time variance of the test. For ex:

without-patch:
--------------

Performance counter stats for './a.out 3000 300':

643 page-faults # 0.089 M/sec
7.236562 task-clock (msec) # 0.928 CPUs utilized
2,179,213 stalled-cycles-frontend # 0.00% frontend cycles idle
17,174,367 stalled-cycles-backend # 0.00% backend cycles idle
0 context-switches # 0.000 K/sec

0.007794658 seconds time elapsed

And with-patch:
---------------

Performance counter stats for './a.out 3000 300':

643 page-faults # 0.089 M/sec
7.233746 task-clock (msec) # 0.921 CPUs utilized
0 context-switches # 0.000 K/sec

0.007854876 seconds time elapsed

Performance counter stats for './a.out 3000 300':

643 page-faults # 0.087 M/sec
649 powerpc:hash_fault # 0.087 M/sec
7.430376 task-clock (msec) # 0.938 CPUs utilized
2,347,174 stalled-cycles-frontend # 0.00% frontend cycles idle
17,524,282 stalled-cycles-backend # 0.00% backend cycles idle
0 context-switches # 0.000 K/sec

0.007920284 seconds time elapsed

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>

authored by

Aneesh Kumar K.V and committed by
Michael Ellerman
cfcb3d80 809fac67

+22
+20
arch/powerpc/include/asm/trace.h
··· 144 144 ); 145 145 #endif 146 146 147 + TRACE_EVENT(hash_fault, 148 + 149 + TP_PROTO(unsigned long addr, unsigned long access, unsigned long trap), 150 + TP_ARGS(addr, access, trap), 151 + TP_STRUCT__entry( 152 + __field(unsigned long, addr) 153 + __field(unsigned long, access) 154 + __field(unsigned long, trap) 155 + ), 156 + 157 + TP_fast_assign( 158 + __entry->addr = addr; 159 + __entry->access = access; 160 + __entry->trap = trap; 161 + ), 162 + 163 + TP_printk("hash fault with addr 0x%lx and access = 0x%lx trap = 0x%lx", 164 + __entry->addr, __entry->access, __entry->trap) 165 + ); 166 + 147 167 #endif /* _TRACE_POWERPC_H */ 148 168 149 169 #undef TRACE_INCLUDE_PATH
+2
arch/powerpc/mm/hash_utils_64.c
··· 57 57 #include <asm/fadump.h> 58 58 #include <asm/firmware.h> 59 59 #include <asm/tm.h> 60 + #include <asm/trace.h> 60 61 61 62 #ifdef DEBUG 62 63 #define DBG(fmt...) udbg_printf(fmt) ··· 1005 1004 1006 1005 DBG_LOW("hash_page(ea=%016lx, access=%lx, trap=%lx\n", 1007 1006 ea, access, trap); 1007 + trace_hash_fault(ea, access, trap); 1008 1008 1009 1009 /* Get region & vsid */ 1010 1010 switch (REGION_ID(ea)) {