/
usr
/
share
/
systemtap
/
runtime
/
/usr/share/systemtap/runtime
mkdir
upload
Name
Size
Mode
Actions
dyninst/
-
0755
rm
linux/
-
0755
rm
softfloat/
-
0755
rm
transport/
-
0755
rm
unwind/
-
0755
rm
addr-map.c
523
0644
edit
dl
rm
addr-map.h
1156
0644
edit
dl
rm
alloc.c
498
0644
edit
dl
rm
arith.c
483
0644
edit
dl
rm
common_probe_context.h
6576
0644
edit
dl
rm
common_session_state.h
415
0644
edit
dl
rm
compatdefs.h
3682
0644
edit
dl
rm
copy.c
585
0644
edit
dl
rm
debug.h
485
0644
edit
dl
rm
io.c
508
0644
edit
dl
rm
k_syms.h
182
0644
edit
dl
rm
loc2c-runtime.h
17937
0644
edit
dl
rm
map-gen.c
25977
0644
edit
dl
rm
map-stat.c
3589
0644
edit
dl
rm
map.c
14660
0644
edit
dl
rm
map.h
5918
0644
edit
dl
rm
mempool.c
2644
0644
edit
dl
rm
namespaces.h
487
0644
edit
dl
rm
pmap-gen.c
8710
0644
edit
dl
rm
print.c
486
0644
edit
dl
rm
print.h
872
0644
edit
dl
rm
print_flush.c
3073
0644
edit
dl
rm
probe_lock.h
498
0644
edit
dl
rm
procfs-probes.c
4673
0644
edit
dl
rm
procfs-probes.h
674
0644
edit
dl
rm
procfs.c
4021
0644
edit
dl
rm
proc_fs_compatibility.h
2316
0644
edit
dl
rm
ptrace_compatibility.h
1512
0644
edit
dl
rm
regs.c
4280
0644
edit
dl
rm
regs.h
2352
0644
edit
dl
rm
runtime.h
928
0644
edit
dl
rm
runtime_context.h
669
0644
edit
dl
rm
runtime_defines.h
3582
0644
edit
dl
rm
softfloat.c
77159
0644
edit
dl
rm
softfloat.h
5125
0644
edit
dl
rm
stack-arm.c
1688
0644
edit
dl
rm
stack-ia64.c
1083
0644
edit
dl
rm
stack-mips.c
125
0644
edit
dl
rm
stack-s390.c
2362
0644
edit
dl
rm
stack.c
21790
0644
edit
dl
rm
stat-common.c
8486
0644
edit
dl
rm
stat.c
7421
0644
edit
dl
rm
stat.h
1964
0644
edit
dl
rm
stp_helper_lock.h
3669
0644
edit
dl
rm
stp_string.c
8632
0644
edit
dl
rm
stp_string.h
598
0644
edit
dl
rm
stp_task_work.c
3511
0644
edit
dl
rm
stp_utrace.c
94735
0644
edit
dl
rm
stp_utrace.h
14010
0644
edit
dl
rm
sym.c
39757
0644
edit
dl
rm
sym.h
6539
0644
edit
dl
rm
syscall.h
17408
0644
edit
dl
rm
task_finder_vma.c
13290
0644
edit
dl
rm
time.c
14887
0644
edit
dl
rm
timer.c
481
0644
edit
dl
rm
timer.h
482
0644
edit
dl
rm
uidgid_compatibility.h
603
0644
edit
dl
rm
unwind.c
47890
0644
edit
dl
rm
utrace_compatibility.h
3148
0644
edit
dl
rm
vma.c
9545
0644
edit
dl
rm
vsprintf.c
24058
0644
edit
dl
rm
vsprintf.h
1502
0644
edit
dl
rm
Edit:
/usr/share/systemtap/runtime/stp_task_work.c
(3511B)
#ifndef _STP_TASK_WORK_C #define _STP_TASK_WORK_C #include "linux/task_work_compatibility.h" #if !defined(STAPCONF_TASK_WORK_ADD_EXPORTED) // First typedef from the original decls, then #define as typecasted calls. typedef typeof(&task_work_add) task_work_add_fn; #define task_work_add (* (task_work_add_fn)kallsyms_task_work_add) #endif #if !defined(STAPCONF_TASK_WORK_CANCEL_EXPORTED) typedef typeof(&task_work_cancel) task_work_cancel_fn; #define task_work_cancel (* (task_work_cancel_fn)kallsyms_task_work_cancel) #endif /* To avoid a crash when a task_work callback gets called after the * module is unloaded, keep track of the number of current callbacks. */ static atomic_t stp_task_work_callbacks = ATOMIC_INIT(0); static DECLARE_WAIT_QUEUE_HEAD(stp_task_work_waitq); /* * stp_task_work_init() should be called before any other * stp_task_work_* functions are called to do setup. */ static int stp_task_work_init(void) { #if !defined(STAPCONF_TASK_WORK_ADD_EXPORTED) /* The task_work_add()/task_work_cancel() functions aren't * exported. Look up those function addresses. */ kallsyms_task_work_add = (void *)kallsyms_lookup_name("task_work_add"); if (kallsyms_task_work_add == NULL) { _stp_error("Can't resolve task_work_add!"); return -ENOENT; } #endif #if !defined(STAPCONF_TASK_WORK_CANCEL_EXPORTED) kallsyms_task_work_cancel = (void *)kallsyms_lookup_name("task_work_cancel"); if (kallsyms_task_work_cancel == NULL) { _stp_error("Can't resolve task_work_cancel!"); return -ENOENT; } #endif return 0; } /* * stap_task_work_exit() should be called when no more * stp_task_work_* functions will be called (before module exit). * * This function makes sure that all the callbacks are finished before * letting the module unload. If the module unloads before a callback * is called, the kernel will try to make a function call to an * invalid address. */ static void stp_task_work_exit(void) { wait_event(stp_task_work_waitq, !atomic_read(&stp_task_work_callbacks)); } static void stp_task_work_get(void) { /* * We use atomic_inc_return() here instead of atomic_inc() because * atomic_inc_return() implies a full memory barrier and we need the * updates to stp_task_work_callbacks to be ordered correctly, otherwise * there could still be a task worker active after stp_task_work_exit() * returns (assuming that no task workers are added *after* * stp_task_work_exit() returns). */ atomic_inc_return(&stp_task_work_callbacks); } static void stp_task_work_put(void) { if (atomic_dec_and_test(&stp_task_work_callbacks)) wake_up(&stp_task_work_waitq); } /* * Our task_work_add() wrapper that remembers that we've got a pending * callback. */ static int stp_task_work_add(struct task_struct *task, struct task_work *twork) { int rc; rc = task_work_add(task, twork, true); if (rc == 0) stp_task_work_get(); return rc; } /* * Our task_work_cancel() wrapper that remembers that a callback has * been cancelled. */ static struct task_work * stp_task_work_cancel(struct task_struct *task, task_work_func_t func) { struct task_work *twork; twork = task_work_cancel(task, func); if (twork != NULL) stp_task_work_put(); return twork; } /* * stp_task_work_func_done() should be called at the very end of a * task_work callback function so that we can keep up with callback * accounting. */ static void stp_task_work_func_done(void) { stp_task_work_put(); } #endif /* _STP_TASK_WORK_C */
Save
cmd:
run