summaryrefslogtreecommitdiffstats
path: root/testsuite/systemtap.examples/memory/pfaults.stp
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/systemtap.examples/memory/pfaults.stp')
-rw-r--r--testsuite/systemtap.examples/memory/pfaults.stp35
1 files changed, 35 insertions, 0 deletions
diff --git a/testsuite/systemtap.examples/memory/pfaults.stp b/testsuite/systemtap.examples/memory/pfaults.stp
new file mode 100644
index 00000000..5bf1a8a6
--- /dev/null
+++ b/testsuite/systemtap.examples/memory/pfaults.stp
@@ -0,0 +1,35 @@
+#! /usr/bin/env stap
+
+global fault_entry_time, fault_address, fault_access
+global time_offset
+
+probe begin { time_offset = gettimeofday_us() }
+
+probe vm.pagefault {
+ t = gettimeofday_us()
+ p = pid()
+ fault_entry_time[p] = t
+ fault_address[p] = address
+ fault_access[p] = write_access ? "w" : "r"
+}
+
+probe vm.pagefault.return {
+ t=gettimeofday_us()
+ p = pid()
+ if (!(p in fault_entry_time)) next
+ e = t - fault_entry_time[p]
+ if (vm_fault_contains(fault_type,VM_FAULT_MINOR)) {
+ ftype="minor"
+ } else if (vm_fault_contains(fault_type,VM_FAULT_MAJOR)) {
+ ftype="major"
+ } else {
+ next #only want to deal with minor and major page faults
+ }
+
+ printf("%d:%d:%p:%s:%s:%d\n",
+ t - time_offset, p, fault_address[p], fault_access[p], ftype, e)
+ #free up memory
+ delete fault_entry_time[p]
+ delete fault_address[p]
+ delete fault_access[p]
+}