diff options
Diffstat (limited to 'tapset/memory.stp')
-rw-r--r-- | tapset/memory.stp | 102 |
1 files changed, 74 insertions, 28 deletions
diff --git a/tapset/memory.stp b/tapset/memory.stp index 9370073b..961cca38 100644 --- a/tapset/memory.stp +++ b/tapset/memory.stp @@ -6,14 +6,57 @@ // redistribute it and/or modify it under the terms of the GNU General // Public License (GPL); either version 2, or (at your option) any // later version. +%{ +#include <linux/mm.h> +%} + +global VM_FAULT_OOM=0, VM_FAULT_SIGBUS=1, VM_FAULT_MINOR=2, VM_FAULT_MAJOR=3 +global VM_FAULT_NOPAGE=4, VM_FAULT_LOCKED=5, VM_FAULT_ERROR=6 + +/** + * sfunction vm_fault_contains - Test return value for page fault reason + * @value: The fault_type returned by vm.page_fault.return + * @test: The type of fault to test for (VM_FAULT_OOM or similar) + */ +function vm_fault_contains:long (value:long, test:long) +%{ + int res; +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23) + switch (THIS->test){ + case 0: res = THIS->value == VM_FAULT_OOM; break; + case 1: res = THIS->value == VM_FAULT_SIGBUS; break; + case 2: res = THIS->value == VM_FAULT_MINOR; break; + case 3: res = THIS->value == VM_FAULT_MAJOR; break; + default: + res = 0; break; + } +#else + switch (THIS->test){ + case 0: res = THIS->value & VM_FAULT_OOM; break; + case 1: res = THIS->value & VM_FAULT_SIGBUS; break; + case 2: /* VM_FAULT_MINOR infered by that flags off */ + res = !((VM_FAULT_OOM | VM_FAULT_SIGBUS | VM_FAULT_MAJOR) & + THIS->value); + break; + case 3: res = THIS->value & VM_FAULT_MAJOR; break; + case 4: res = THIS->value & VM_FAULT_NOPAGE; break; + case 5: res = THIS->value & VM_FAULT_LOCKED; break; + case 6: res = THIS->value & VM_FAULT_ERROR; break; + default: + res = 0; + } +#endif + THIS->__retvalue = (res != 0); + return; +%} /** * probe vm.pagefault - Records that a page fault occurred. - * @address: The address of the faulting memory access. - * @write_access: Indicates whether this was a write. + * @address: The address of the faulting memory access; i.e. the address that caused the page fault. + * @write_access: Indicates whether this was a write or read access; <command>1</command> indicates a write, + * while <command>0</command> indicates a read. * * Context: The process which triggered the fault - * */ probe vm.pagefault = kernel.function("__handle_mm_fault@mm/memory.c") ?, kernel.function("handle_mm_fault@mm/memory.c") ? @@ -23,9 +66,12 @@ probe vm.pagefault = kernel.function("__handle_mm_fault@mm/memory.c") ?, } /** - * probe vm.pagefault.return - Records type of fault that occurred. - * @fault_type: 0 (VM_FAULT_OOM), 1 (VM_FAULT_SIGBUS), - * 2 (VM_FAULT_MINOR), and 3 (VM_FAULT_MAJOR) + * probe vm.pagefault.return - Indicates what type of fault occurred. + * @fault_type: Returns either + * <command>0</command> (VM_FAULT_OOM) for out of memory faults, + * <command>2</command> (VM_FAULT_MINOR) for minor faults, <command>3</command> (VM_FAULT_MAJOR) for + * major faults, or <command>1</command> (VM_FAULT_SIGBUS) if the fault was neither OOM, minor fault, + * nor major fault. */ probe vm.pagefault.return = kernel.function("__handle_mm_fault@mm/memory.c").return ?, kernel.function("handle_mm_fault@mm/memory.c").return ? @@ -34,7 +80,7 @@ probe vm.pagefault.return = kernel.function("__handle_mm_fault@mm/memory.c").ret } /** - * sfunction addr_to_node - Returns which NUMA node has the given address. + * sfunction addr_to_node - Returns which node a given address belongs to within a NUMA system. * @addr: The address of the faulting memory access. * */ @@ -58,7 +104,7 @@ function _IS_ZERO_PAGE:long(from:long, vaddr:long) %{ /* pure */ /** - * probe vm.write_shared - Write to shared page. + * probe vm.write_shared - Attempts at writing to a shared page. * @address: The address of the shared write. * * Context: @@ -66,7 +112,7 @@ function _IS_ZERO_PAGE:long(from:long, vaddr:long) %{ /* pure */ * * Fires when a process attempts to write to a shared page. * If a copy is necessary, this will be followed by a - * vm.write_shared_copy. + * <command>vm.write_shared_copy</command>. */ probe vm.write_shared = kernel.function("do_wp_page") { address = $address @@ -74,15 +120,15 @@ probe vm.write_shared = kernel.function("do_wp_page") { /** * probe vm.write_shared_copy- Page copy for shared page write. - * @address: the address of the shared write. - * @zero: boolean indicating whether it is a zero page + * @address: The address of the shared write. + * @zero: Boolean indicating whether it is a zero page * (can do a clear instead of a copy). * * Context: * The process attempting the write. * * Fires when a write to a shared page requires a page copy. This is - * always preceded by a vm.shared_write. + * always preceded by a <command>vm.shared_write</command>. */ probe vm.write_shared_copy = kernel.function("copy_cow_page")? { address = $address @@ -91,12 +137,12 @@ probe vm.write_shared_copy = kernel.function("copy_cow_page")? { /** - * probe vm.mmap - Fires when an mmap is requested. - * @address: the requested address - * @length: the length of the memory segment + * probe vm.mmap - Fires when an <command>mmap</command> is requested. + * @address: The requested address + * @length: The length of the memory segment * * Context: - * The process calling mmap. + * The process calling <command>mmap</command>. */ probe vm.mmap = kernel.function("do_mmap"), kernel.function("do_mmap2")? { address = $addr @@ -105,12 +151,12 @@ probe vm.mmap = kernel.function("do_mmap"), kernel.function("do_mmap2")? { /** - * probe vm.munmap - Fires when an munmap is requested. - * @address: the requested address - * @length: the length of the memory segment + * probe vm.munmap - Fires when an <command>munmap</command> is requested. + * @address: The requested address + * @length: The length of the memory segment * * Context: - * The process calling munmap. + * The process calling <command>munmap</command>. */ probe vm.munmap = kernel.function("do_munmap") { address = $start @@ -118,12 +164,12 @@ probe vm.munmap = kernel.function("do_munmap") { } /** - * probe vm.brk -Fires when a brk is requested (resizing a heap). - * @address - the requested address - * @length - the length of the memory segment + * probe vm.brk - Fires when a <command>brk</command> is requested (i.e. the heap will be resized). + * @address: The requested address + * @length: The length of the memory segment * * Context: - * The process calling brk. + * The process calling <command>brk</command>. */ probe vm.brk = kernel.function("do_brk") { address = $addr @@ -131,12 +177,12 @@ probe vm.brk = kernel.function("do_brk") { } /** - * probe vm.oom_kill - Fires when a thread is targetted by the OOM killer. - * @task: the task being killed + * probe vm.oom_kill - Fires when a thread is selected for termination by the OOM killer. + * @task: The task being killed * * Context: - * The process that tried to consume more memory, and thus - * triggered the OOM. (correct?) + * The process that tried to consume excessive memory, and thus + * triggered the OOM. <remark>(is this correct?)</remark> */ probe vm.oom_kill = kernel.function("__oom_kill_task") { task = $p |