/
usr
/
share
/
systemtap
/
runtime
/
linux
/
/usr/share/systemtap/runtime/linux
mkdir
upload
Name
Size
Mode
Actions
uprobes/
-
0755
rm
uprobes2/
-
0755
rm
access_process_vm.h
4311
0644
edit
dl
rm
addr-map.c
9749
0644
edit
dl
rm
alloc.c
15900
0644
edit
dl
rm
arith.c
16799
0644
edit
dl
rm
autoconf-514-panic.c
68
0644
edit
dl
rm
autoconf-access_ok_2args.c
90
0644
edit
dl
rm
autoconf-alloc-percpu-align.c
118
0644
edit
dl
rm
autoconf-asm-syscall.c
51
0644
edit
dl
rm
autoconf-atomic_fetch_add_unless.c
94
0644
edit
dl
rm
autoconf-bio-bi_opf.c
824
0644
edit
dl
rm
autoconf-blk-types.c
359
0644
edit
dl
rm
autoconf-compat-utimbuf.c
53
0644
edit
dl
rm
autoconf-compat_sigaction.c
448
0644
edit
dl
rm
autoconf-constant-tsc.c
63
0644
edit
dl
rm
autoconf-cpu-clock.c
1277
0644
edit
dl
rm
autoconf-dpath-path.c
121
0644
edit
dl
rm
autoconf-files_lookup_fd_raw.c
136
0644
edit
dl
rm
autoconf-from_kuid_munged.c
191
0644
edit
dl
rm
autoconf-fs_supers-hlist.c
354
0644
edit
dl
rm
autoconf-generated-compile.c
56
0644
edit
dl
rm
autoconf-genhd.c
201
0644
edit
dl
rm
autoconf-get-kretprobe.c
107
0644
edit
dl
rm
autoconf-get_user_pages-flags.c
1549
0644
edit
dl
rm
autoconf-get_user_pages-notask_struct.c
1301
0644
edit
dl
rm
autoconf-get_user_pages_remote-flags.c
1550
0644
edit
dl
rm
autoconf-get_user_pages_remote-flags_locked.c
1331
0644
edit
dl
rm
autoconf-get_user_pages_remote-notask_struct.c
1438
0644
edit
dl
rm
autoconf-grsecurity.c
219
0644
edit
dl
rm
autoconf-hlist-4args.c
296
0644
edit
dl
rm
autoconf-hlist_add_tail_rcu.c
112
0644
edit
dl
rm
autoconf-hrtimer-getset-expires.c
126
0644
edit
dl
rm
autoconf-hrtimer-rel.c
87
0644
edit
dl
rm
autoconf-hw_breakpoint_context.c
315
0644
edit
dl
rm
autoconf-inode-private.c
173
0644
edit
dl
rm
autoconf-inode-rwsem.c
172
0644
edit
dl
rm
autoconf-inode-uretprobes.c
264
0644
edit
dl
rm
autoconf-kernel_read-new-args.c
1030
0644
edit
dl
rm
autoconf-kprobe-symbol-name.c
90
0644
edit
dl
rm
autoconf-ktime-get-real.c
98
0644
edit
dl
rm
autoconf-linux-sched_headers.c
1678
0644
edit
dl
rm
autoconf-local-clock.c
1282
0644
edit
dl
rm
autoconf-lockdown-debugfs.c
102
0644
edit
dl
rm
autoconf-lockdown-kernel.c
90
0644
edit
dl
rm
autoconf-mm-context-vdso-base.c
117
0644
edit
dl
rm
autoconf-mm-context-vdso.c
114
0644
edit
dl
rm
autoconf-mm-shmempages.c
72
0644
edit
dl
rm
autoconf-mmap_lock.c
175
0644
edit
dl
rm
autoconf-module-sect-attrs.c
158
0644
edit
dl
rm
autoconf-module_layout.c
52
0644
edit
dl
rm
autoconf-mod_kallsyms.c
51
0644
edit
dl
rm
autoconf-nameidata.c
96
0644
edit
dl
rm
autoconf-netfilter-4_1.c
769
0644
edit
dl
rm
autoconf-netfilter-4_4.c
1460
0644
edit
dl
rm
autoconf-netfilter-313b.c
602
0644
edit
dl
rm
autoconf-netfilter.c
422
0644
edit
dl
rm
autoconf-old-inode-uprobes.c
357
0644
edit
dl
rm
autoconf-oneachcpu-retry.c
957
0644
edit
dl
rm
autoconf-pagefault_disable.c
137
0644
edit
dl
rm
autoconf-pde_data.c
226
0644
edit
dl
rm
autoconf-perf-structpid.c
444
0644
edit
dl
rm
autoconf-procfs-owner.c
158
0644
edit
dl
rm
autoconf-proc_ops.c
566
0644
edit
dl
rm
autoconf-rcu_is_watching.c
385
0644
edit
dl
rm
autoconf-real-parent.c
427
0644
edit
dl
rm
autoconf-regset.c
239
0644
edit
dl
rm
autoconf-relay-umode_t.c
730
0644
edit
dl
rm
autoconf-relay_buf-per_cpu_ptr.c
920
0644
edit
dl
rm
autoconf-ring_buffer-flags.c
112
0644
edit
dl
rm
autoconf-ring_buffer_lost_events.c
296
0644
edit
dl
rm
autoconf-ring_buffer_read_prepare.c
181
0644
edit
dl
rm
autoconf-save-stack-trace-no-bp.c
498
0644
edit
dl
rm
autoconf-save-stack-trace.c
501
0644
edit
dl
rm
autoconf-set_fs.c
221
0644
edit
dl
rm
autoconf-smpcall-4args.c
166
0644
edit
dl
rm
autoconf-smpcall-5args.c
169
0644
edit
dl
rm
autoconf-stack-trace-save-regs.c
176
0644
edit
dl
rm
autoconf-stacktrace_ops-int-address.c
409
0644
edit
dl
rm
autoconf-stacktrace_ops-warning.c
188
0644
edit
dl
rm
autoconf-syscall_get_args_3args.c
239
0644
edit
dl
rm
autoconf-task-state.c
550
0644
edit
dl
rm
autoconf-task-uid.c
152
0644
edit
dl
rm
autoconf-task_work-struct.c
219
0644
edit
dl
rm
autoconf-time32-old.c
52
0644
edit
dl
rm
autoconf-time32.c
53
0644
edit
dl
rm
autoconf-timerfd.c
232
0644
edit
dl
rm
autoconf-trace-printk.c
151
0644
edit
dl
rm
autoconf-tracepoint-has-data.c
493
0644
edit
dl
rm
autoconf-tracepoint-strings.c
233
0644
edit
dl
rm
autoconf-uaccess.c
28
0644
edit
dl
rm
autoconf-uapi-mount.c
52
0644
edit
dl
rm
autoconf-udelay_simple.c
90
0644
edit
dl
rm
autoconf-uidgid.c
50
0644
edit
dl
rm
autoconf-unwind-stack-trace.c
326
0644
edit
dl
rm
autoconf-uprobe-get-pc.c
374
0644
edit
dl
rm
autoconf-utrace-regset.c
273
0644
edit
dl
rm
autoconf-utrace-via-tracepoints.c
1712
0644
edit
dl
rm
autoconf-vm-area-pte.c
141
0644
edit
dl
rm
autoconf-walk-stack.c
217
0644
edit
dl
rm
autoconf-x86-fs.c
90
0644
edit
dl
rm
autoconf-x86-gs.c
90
0644
edit
dl
rm
autoconf-x86-uniregs.c
140
0644
edit
dl
rm
autoconf-x86-xfs.c
91
0644
edit
dl
rm
common_session_state.h
3249
0644
edit
dl
rm
compat_net.h
858
0644
edit
dl
rm
compat_structs.h
4409
0644
edit
dl
rm
compat_unistd.h
68384
0644
edit
dl
rm
copy.c
2717
0644
edit
dl
rm
debug.h
2978
0644
edit
dl
rm
io.c
5291
0644
edit
dl
rm
itrace.c
14874
0644
edit
dl
rm
kprobes.c
25126
0644
edit
dl
rm
loc2c-runtime.h
29874
0644
edit
dl
rm
map_list.h
1220
0644
edit
dl
rm
map_runtime.h
5266
0644
edit
dl
rm
namespaces.h
7128
0644
edit
dl
rm
netfilter.c
1410
0644
edit
dl
rm
perf.c
7596
0644
edit
dl
rm
perf.h
1272
0644
edit
dl
rm
perf_event_counter_context.c
336
0644
edit
dl
rm
perf_probe_handler_nmi.c
278
0644
edit
dl
rm
perf_read.h
959
0644
edit
dl
rm
print.c
11402
0644
edit
dl
rm
probe_lock.h
1807
0644
edit
dl
rm
regs-ia64.c
3741
0644
edit
dl
rm
regs.c
13490
0644
edit
dl
rm
runtime.h
12591
0644
edit
dl
rm
runtime_context.h
6089
0644
edit
dl
rm
runtime_defines.h
1041
0644
edit
dl
rm
stap_mmap_lock.h
343
0644
edit
dl
rm
stat_runtime.h
1774
0644
edit
dl
rm
stp_tls.h
1181
0644
edit
dl
rm
stp_tracepoint.c
11481
0644
edit
dl
rm
stp_tracepoint.h
2270
0644
edit
dl
rm
syscalls-common.h
976
0644
edit
dl
rm
task_finder.c
53860
0644
edit
dl
rm
task_finder2.c
57640
0644
edit
dl
rm
task_finder_map.c
5194
0644
edit
dl
rm
task_finder_stubs.c
2442
0644
edit
dl
rm
task_work_compatibility.h
1283
0644
edit
dl
rm
timer.c
2200
0644
edit
dl
rm
timer.h
1383
0644
edit
dl
rm
timer_compatibility.h
2317
0644
edit
dl
rm
uprobes-common.c
15573
0644
edit
dl
rm
uprobes-common.h
1653
0644
edit
dl
rm
uprobes-inc.h
484
0644
edit
dl
rm
uprobes-inode.c
34086
0644
edit
dl
rm
Edit:
/usr/share/systemtap/runtime/linux/runtime_context.h
(6089B)
/* -*- linux-c -*- * Context Runtime Functions * Copyright (C) 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 _LINUX_RUNTIME_CONTEXT_H_ #define _LINUX_RUNTIME_CONTEXT_H_ /* Can't use a lock primitive for this because lock_acquire() has tracepoints */ static atomic_t _stp_contexts_busy_ctr = ATOMIC_INIT(0); /* Per-cpu data is always initialized with zero filled. */ static DEFINE_PER_CPU(struct context *, contexts); static int _stp_runtime_contexts_alloc(void) { unsigned int cpu; /* We don't use for_aech_possible_cpu() here since the number of possible * CPUs may be very large even though there are many fewere online CPUs. * For example, VMWare guests usually have 128 possible CPUs while only * have a few online CPUs. Once the context structs were * allocated for online CPUs at this point, we will discard any context * fetching operations on any future online CPUs dynamically added * through the kernel's CPU hotplug feature. Memory allocations of the * context structs can only happen right here. */ for_each_online_cpu(cpu) { /* Module init, so in user context, safe to use * "sleeping" allocation. */ struct context *c = _stp_vzalloc_node(sizeof (struct context), cpu_to_node(cpu)); if (unlikely(c == NULL)) { _stp_error ("context (size %lu per cpu) allocation failed", (unsigned long) sizeof (struct context)); return -ENOMEM; } per_cpu(contexts, cpu) = c; } return 0; } static bool _stp_runtime_context_trylock(void) { bool locked; /* Need to disable preemption because of the smp_processor_id() call in _stp_runtime_get_context(). */ preempt_disable(); /* fast path to ignore new online CPUs without percpu context memory * allocations. this also serves as an extra safe guard for NULL context * pointers. */ if (unlikely(_stp_runtime_get_context() == NULL)) { preempt_enable_no_resched(); return false; } locked = atomic_add_unless(&_stp_contexts_busy_ctr, 1, INT_MAX); if (!locked) preempt_enable_no_resched(); return locked; } static void _stp_runtime_context_unlock(void) { atomic_dec(&_stp_contexts_busy_ctr); preempt_enable_no_resched(); } /* We should be free of all probes by this time, but for example the timer for * _stp_ctl_work_callback may still be running and looking for contexts. We * use _stp_contexts_busy_ctr to be sure its safe to free them. */ static void _stp_runtime_contexts_free(void) { unsigned int cpu; /* Sync to make sure existing readers are done */ while (atomic_cmpxchg(&_stp_contexts_busy_ctr, 0, INT_MAX)) cpu_relax(); /* Now we can actually free the contexts */ /* NB We cannot use the for_each_online_cpu() here since online * CPUs may get changed on-the-fly through the CPU hotplug feature * of the kernel. We only allocated the context structs on original * online CPUs when _stp_runtime_contexts_alloc() was called. And we * cannot allocate new memory from within this context. */ for_each_possible_cpu(cpu) { struct context *c = per_cpu(contexts, cpu); if (likely(c)) _stp_vfree(c); } } static inline struct context * _stp_runtime_get_context(void) { return per_cpu(contexts, smp_processor_id()); } static struct context * _stp_runtime_entryfn_get_context(void) { struct context* __restrict__ c = NULL; if (!_stp_runtime_context_trylock()) return NULL; c = _stp_runtime_get_context(); if (c != NULL) { if (!atomic_cmpxchg(&c->busy, 0, 1)) { // NB: Notice we're not releasing _stp_contexts_busy_ctr // here. We exepect the calling code to call // _stp_runtime_entryfn_get_context() and // _stp_runtime_entryfn_put_context() as a // pair. return c; } } _stp_runtime_context_unlock(); return NULL; } static inline void _stp_runtime_entryfn_put_context(struct context *c) { if (c) { atomic_set(&c->busy, 0); _stp_runtime_context_unlock(); } } static void _stp_runtime_context_wait(void) { int holdon; unsigned long hold_start; int hold_index; hold_start = jiffies; hold_index = -1; do { int i; holdon = 0; if (!_stp_runtime_context_trylock()) break; for_each_possible_cpu(i) { struct context *c = per_cpu(contexts, i); if (c != NULL && atomic_read (& c->busy)) { holdon = 1; /* Just in case things are really * stuck, let's print some diagnostics. */ if (time_after(jiffies, hold_start + HZ) // > 1 second && (i > hold_index)) { // not already printed hold_index = i; printk(KERN_ERR "%s context[%d] stuck: %s\n", THIS_MODULE->name, i, c->probe_point); } } } _stp_runtime_context_unlock(); /* * Just in case things are really really stuck, a * handler probably suffered a fault, and the kernel * probably killed a task/thread already. We can't be * quite sure in what state everything is in, however * auxiliary stuff like kprobes / uprobes / locks have * already been unregistered. So it's *probably* safe * to pretend/assume/hope everything is OK, and let * the cleanup finish. * * In the worst case, there may occur a fault, as a * genuinely running probe handler tries to access * script globals (about to be freed), or something * accesses module memory (about to be unloaded). * This is sometimes stinky, so the alternative * (default) is to change from a livelock to a * livelock that sleeps awhile. */ #ifdef STAP_OVERRIDE_STUCK_CONTEXT if (time_after(jiffies, hold_start + HZ*10)) { // > 10 seconds printk(KERN_ERR "%s overriding stuck context to allow module shutdown.", THIS_MODULE->name); holdon = 0; // allow loop to exit } #else /* at least stop sucking down the staprun cpu */ msleep(250); #endif /* NB: we run at least one of these during the * shutdown sequence: */ yield(); /* aka schedule() and then some */ } while (holdon); } #endif /* _LINUX_RUNTIME_CONTEXT_H_ */
Save
cmd:
run