/usr/share/systemtap/runtime/linux
NameSizeModeActions
uprobes/-0755rm
uprobes2/-0755rm
access_process_vm.h43110644editdlrm
addr-map.c97490644editdlrm
alloc.c159000644editdlrm
arith.c167990644editdlrm
autoconf-514-panic.c680644editdlrm
autoconf-access_ok_2args.c900644editdlrm
autoconf-alloc-percpu-align.c1180644editdlrm
autoconf-asm-syscall.c510644editdlrm
autoconf-atomic_fetch_add_unless.c940644editdlrm
autoconf-bio-bi_opf.c8240644editdlrm
autoconf-blk-types.c3590644editdlrm
autoconf-compat-utimbuf.c530644editdlrm
autoconf-compat_sigaction.c4480644editdlrm
autoconf-constant-tsc.c630644editdlrm
autoconf-cpu-clock.c12770644editdlrm
autoconf-dpath-path.c1210644editdlrm
autoconf-files_lookup_fd_raw.c1360644editdlrm
autoconf-from_kuid_munged.c1910644editdlrm
autoconf-fs_supers-hlist.c3540644editdlrm
autoconf-generated-compile.c560644editdlrm
autoconf-genhd.c2010644editdlrm
autoconf-get-kretprobe.c1070644editdlrm
autoconf-get_user_pages-flags.c15490644editdlrm
autoconf-get_user_pages-notask_struct.c13010644editdlrm
autoconf-get_user_pages_remote-flags.c15500644editdlrm
autoconf-get_user_pages_remote-flags_locked.c13310644editdlrm
autoconf-get_user_pages_remote-notask_struct.c14380644editdlrm
autoconf-grsecurity.c2190644editdlrm
autoconf-hlist-4args.c2960644editdlrm
autoconf-hlist_add_tail_rcu.c1120644editdlrm
autoconf-hrtimer-getset-expires.c1260644editdlrm
autoconf-hrtimer-rel.c870644editdlrm
autoconf-hw_breakpoint_context.c3150644editdlrm
autoconf-inode-private.c1730644editdlrm
autoconf-inode-rwsem.c1720644editdlrm
autoconf-inode-uretprobes.c2640644editdlrm
autoconf-kernel_read-new-args.c10300644editdlrm
autoconf-kprobe-symbol-name.c900644editdlrm
autoconf-ktime-get-real.c980644editdlrm
autoconf-linux-sched_headers.c16780644editdlrm
autoconf-local-clock.c12820644editdlrm
autoconf-lockdown-debugfs.c1020644editdlrm
autoconf-lockdown-kernel.c900644editdlrm
autoconf-mm-context-vdso-base.c1170644editdlrm
autoconf-mm-context-vdso.c1140644editdlrm
autoconf-mm-shmempages.c720644editdlrm
autoconf-mmap_lock.c1750644editdlrm
autoconf-module-sect-attrs.c1580644editdlrm
autoconf-module_layout.c520644editdlrm
autoconf-mod_kallsyms.c510644editdlrm
autoconf-nameidata.c960644editdlrm
autoconf-netfilter-4_1.c7690644editdlrm
autoconf-netfilter-4_4.c14600644editdlrm
autoconf-netfilter-313b.c6020644editdlrm
autoconf-netfilter.c4220644editdlrm
autoconf-old-inode-uprobes.c3570644editdlrm
autoconf-oneachcpu-retry.c9570644editdlrm
autoconf-pagefault_disable.c1370644editdlrm
autoconf-pde_data.c2260644editdlrm
autoconf-perf-structpid.c4440644editdlrm
autoconf-procfs-owner.c1580644editdlrm
autoconf-proc_ops.c5660644editdlrm
autoconf-rcu_is_watching.c3850644editdlrm
autoconf-real-parent.c4270644editdlrm
autoconf-regset.c2390644editdlrm
autoconf-relay-umode_t.c7300644editdlrm
autoconf-relay_buf-per_cpu_ptr.c9200644editdlrm
autoconf-ring_buffer-flags.c1120644editdlrm
autoconf-ring_buffer_lost_events.c2960644editdlrm
autoconf-ring_buffer_read_prepare.c1810644editdlrm
autoconf-save-stack-trace-no-bp.c4980644editdlrm
autoconf-save-stack-trace.c5010644editdlrm
autoconf-set_fs.c2210644editdlrm
autoconf-smpcall-4args.c1660644editdlrm
autoconf-smpcall-5args.c1690644editdlrm
autoconf-stack-trace-save-regs.c1760644editdlrm
autoconf-stacktrace_ops-int-address.c4090644editdlrm
autoconf-stacktrace_ops-warning.c1880644editdlrm
autoconf-syscall_get_args_3args.c2390644editdlrm
autoconf-task-state.c5500644editdlrm
autoconf-task-uid.c1520644editdlrm
autoconf-task_work-struct.c2190644editdlrm
autoconf-time32-old.c520644editdlrm
autoconf-time32.c530644editdlrm
autoconf-timerfd.c2320644editdlrm
autoconf-trace-printk.c1510644editdlrm
autoconf-tracepoint-has-data.c4930644editdlrm
autoconf-tracepoint-strings.c2330644editdlrm
autoconf-uaccess.c280644editdlrm
autoconf-uapi-mount.c520644editdlrm
autoconf-udelay_simple.c900644editdlrm
autoconf-uidgid.c500644editdlrm
autoconf-unwind-stack-trace.c3260644editdlrm
autoconf-uprobe-get-pc.c3740644editdlrm
autoconf-utrace-regset.c2730644editdlrm
autoconf-utrace-via-tracepoints.c17120644editdlrm
autoconf-vm-area-pte.c1410644editdlrm
autoconf-walk-stack.c2170644editdlrm
autoconf-x86-fs.c900644editdlrm
autoconf-x86-gs.c900644editdlrm
autoconf-x86-uniregs.c1400644editdlrm
autoconf-x86-xfs.c910644editdlrm
common_session_state.h32490644editdlrm
compat_net.h8580644editdlrm
compat_structs.h44090644editdlrm
compat_unistd.h683840644editdlrm
copy.c27170644editdlrm
debug.h29780644editdlrm
io.c52910644editdlrm
itrace.c148740644editdlrm
kprobes.c251260644editdlrm
loc2c-runtime.h298740644editdlrm
map_list.h12200644editdlrm
map_runtime.h52660644editdlrm
namespaces.h71280644editdlrm
netfilter.c14100644editdlrm
perf.c75960644editdlrm
perf.h12720644editdlrm
perf_event_counter_context.c3360644editdlrm
perf_probe_handler_nmi.c2780644editdlrm
perf_read.h9590644editdlrm
print.c114020644editdlrm
probe_lock.h18070644editdlrm
regs-ia64.c37410644editdlrm
regs.c134900644editdlrm
runtime.h125910644editdlrm
runtime_context.h60890644editdlrm
runtime_defines.h10410644editdlrm
stap_mmap_lock.h3430644editdlrm
stat_runtime.h17740644editdlrm
stp_tls.h11810644editdlrm
stp_tracepoint.c114810644editdlrm
stp_tracepoint.h22700644editdlrm
syscalls-common.h9760644editdlrm
task_finder.c538600644editdlrm
task_finder2.c576400644editdlrm
task_finder_map.c51940644editdlrm
task_finder_stubs.c24420644editdlrm
task_work_compatibility.h12830644editdlrm
timer.c22000644editdlrm
timer.h13830644editdlrm
timer_compatibility.h23170644editdlrm
uprobes-common.c155730644editdlrm
uprobes-common.h16530644editdlrm
uprobes-inc.h4840644editdlrm
uprobes-inode.c340860644editdlrm
Edit: /usr/share/systemtap/runtime/linux/perf.c (7596B)
/* -*- linux-c -*- * Perf Functions * Copyright (C) 2006-2014 Red Hat Inc. * * This file is part of systemtap, and is free software. You can * 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. */ #ifndef _PERF_C_ #define _PERF_C_ #include #include #include "perf.h" #ifndef INIT_WORK_ONSTACK #define INIT_WORK_ONSTACK(_work, _func) INIT_WORK((_work), (_func)) #define destroy_work_on_stack(_work) do { (void)(_work); } while (0) #endif /** @file perf.c * @brief Implements performance monitoring hardware support */ /** Initialize performance sampling * Call this during probe initialization to set up performance event sampling * for all online cpus. Returns non-zero on error. * * @param stp Handle for the event to be registered. */ static long _stp_perf_init (struct stap_perf_probe *stp, struct task_struct* task) { int cpu; if (!stp->system_wide) { if (task == 0) /* need to setup later when we know the task */ return 0; else { if (stp->e.t.per_thread_event != 0) /* already setup */ return 0; stp->e.t.per_thread_event = perf_event_create_kernel_counter(&stp->attr, -1, #if defined(STAPCONF_PERF_STRUCTPID) || defined (STAPCONF_PERF_COUNTER_CONTEXT) task, #else task->pid, #endif stp->callback #ifdef STAPCONF_PERF_COUNTER_CONTEXT , NULL #endif ); if (IS_ERR(stp->e.t.per_thread_event)) { long rc = PTR_ERR(stp->e.t.per_thread_event); stp->e.t.per_thread_event = NULL; /* * PPC returns ENXIO for HW counters until 2.6.37 * (behavior changed with commit b0a873e). */ if (rc == -EINVAL || rc == -ENOSYS || rc == -ENOENT || rc == -EOPNOTSUPP || rc == -ENXIO) { _stp_warn("perf probe '%s' is not supported by this kernel (%ld).", #ifdef STP_NEED_PROBE_NAME stp->probe->pn, #else stp->probe->pp, #endif rc); /* Lie and return 0. This way the more generic * task_finder warning won't be printed. */ rc = 0; } return rc; } } } else { /* allocate space for the event descriptor for each cpu */ stp->e.events = _stp_alloc_percpu (sizeof(struct perf_event*)); if (stp->e.events == NULL) { return -ENOMEM; } /* initialize event on each processor */ for_each_possible_cpu(cpu) { struct perf_event **event = per_cpu_ptr (stp->e.events, cpu); if (cpu_is_offline(cpu)) { *event = NULL; continue; } *event = perf_event_create_kernel_counter(&stp->attr, cpu, #if defined(STAPCONF_PERF_STRUCTPID) || defined (STAPCONF_PERF_COUNTER_CONTEXT) NULL, #else -1, #endif stp->callback #ifdef STAPCONF_PERF_COUNTER_CONTEXT , NULL #endif ); if (IS_ERR(*event)) { long rc = PTR_ERR(*event); *event = NULL; _stp_perf_del(stp); return rc; } } } /* (stp->system_wide) */ return 0; } /** Delete performance event. * Call this to shutdown one performance event sampling * * @param stp Handle for the event to be unregistered. */ static void _stp_perf_del (struct stap_perf_probe *stp) { int cpu; if (! stp || !stp->e.events) return; /* shut down performance event sampling */ if (stp->system_wide) { for_each_possible_cpu(cpu) { struct perf_event **event = per_cpu_ptr (stp->e.events, cpu); if (*event) { perf_event_release_kernel(*event); } } _stp_free_percpu (stp->e.events); stp->e.events = NULL; } else { if (stp->e.t.per_thread_event) { perf_event_release_kernel(stp->e.t.per_thread_event); } stp->e.t.per_thread_event = NULL; } } /** Delete many performance events in reverse order. * Call this to shutdown all performance event sampling * * @param probes A pointer array for the events to be unregistered. * @param n The number of events in the array. */ static void _stp_perf_del_n (struct stap_perf_probe *probes, size_t n) { while (n--) _stp_perf_del(&probes[n]); } struct _stp_perf_work { struct work_struct work; struct stap_perf_probe *probes; size_t nprobes; const char* probe_point; int rc; }; /** Initialize many performance events from a workqueue * Even though we're using the kernel interface, perf checks CAP_SYS_ADMIN, * which our mere @stapdev user may not have. By running via a workqueue, * we'll be in an events/X kernel thread with sufficient privileges. * * @param work The _stp_perf_work encapsulating _stp_perf_init_n parameters. */ static void _stp_perf_init_work (struct work_struct *work) { size_t i; struct _stp_perf_work *pwork = container_of(work, struct _stp_perf_work, work); for (i = 0; i < pwork->nprobes; ++i) { struct stap_perf_probe* stp = &pwork->probes[i]; if (stp->system_wide) pwork->rc = _stp_perf_init(stp, NULL); else if (stp->task_finder) #ifdef STP_PERF_USE_TASK_FINDER pwork->rc = stap_register_task_finder_target(&stp->e.t.tgt); #else pwork->rc = EINVAL; #endif if (pwork->rc) { pwork->probe_point = stp->probe->pp; _stp_perf_del_n(pwork->probes, i); break; } } } /** Initialize many performance events * Call this to start all performance event sampling * * @param probes A pointer array for the events to be registered. * @param n The number of events in the array. * @param ppfail A pointer to return the probe_point on failure. */ static int _stp_perf_init_n (struct stap_perf_probe *probes, size_t n, const char **ppfail) { struct _stp_perf_work pwork = { .probes = probes, .nprobes = n }; INIT_WORK_ONSTACK(&pwork.work, _stp_perf_init_work); schedule_work(&pwork.work); flush_work(&pwork.work); if (pwork.rc) *ppfail = pwork.probe_point; destroy_work_on_stack(&pwork.work); return pwork.rc; } /* The first call to _stp_perf_init, via systemtap_module_init at runtime, is for setting up aggregate counters. Per thread counters need to be setup when the thread is known. This is done by calling _stp_perf_init later when the thread is known. A per thread perf counter is defined by a counter("var") suffix on the perf probe. It is defined by perf_builder. This counter is read on demand via the "@perf("var")" builtin which is treated as an expression right hand side which reads the perf counter associated with the previously defined perf counter. It is expanded by dwarf_var_expanding_visitor */ static int _stp_perf_read_init (unsigned i, struct task_struct* task) { /* Choose the stap_perf_probes entry */ struct stap_perf_probe* stp = & stap_perf_probes[i]; return _stp_perf_init (stp, task); } long _stp_perf_read (int ncpu, unsigned i) { /* Choose the stap_perf_probes entry */ struct stap_perf_probe* stp; u64 enabled, running; if (i > sizeof(stap_perf_probes)/sizeof(struct stap_perf_probe)) { _stp_error ("_stp_perf_read - out of range"); return 0; } stp = & stap_perf_probes[i]; if (stp == NULL || stp->system_wide || stp->e.t.per_thread_event == NULL) { _stp_error ("_stp_perf_read - probe '%s' is not supported by this kernel", #ifdef STP_NEED_PROBE_NAME (stp ? stp->probe->pn : "unknown") #else (stp ? stp->probe->pp : "unknown") #endif ); return 0; } might_sleep(); return perf_event_read_value (stp->e.t.per_thread_event, &enabled, &running); } #endif /* _PERF_C_ */