summaryrefslogtreecommitdiffstats
path: root/include/linux/tracehook.h
diff options
context:
space:
mode:
authorAnton Arapov <anton@redhat.com>2012-06-27 09:05:37 +0200
committerAnton Arapov <anton@redhat.com>2012-06-27 09:05:37 +0200
commitd91eda5d7b0383e6a0c83e0146ff141ff3b1355b (patch)
tree07a568258d104e4cb79176348cd42141f41e592c /include/linux/tracehook.h
parent3d6fafb8cd68b287130dbd5b19fbb5e9bfa32a54 (diff)
downloadkernel-uprobes-d91eda5d7b0383e6a0c83e0146ff141ff3b1355b.tar.gz
kernel-uprobes-d91eda5d7b0383e6a0c83e0146ff141ff3b1355b.tar.xz
kernel-uprobes-d91eda5d7b0383e6a0c83e0146ff141ff3b1355b.zip
fedora kernel: 5290429908ff3ac614a416fab4a6e2f99b759e6bv3.4.4-3
Signed-off-by: Anton Arapov <anton@redhat.com>
Diffstat (limited to 'include/linux/tracehook.h')
-rw-r--r--include/linux/tracehook.h11
1 files changed, 11 insertions, 0 deletions
diff --git a/include/linux/tracehook.h b/include/linux/tracehook.h
index 51bd91d911c..48c597d2e2d 100644
--- a/include/linux/tracehook.h
+++ b/include/linux/tracehook.h
@@ -49,6 +49,7 @@
#include <linux/sched.h>
#include <linux/ptrace.h>
#include <linux/security.h>
+#include <linux/task_work.h>
struct linux_binprm;
/*
@@ -165,8 +166,10 @@ static inline void tracehook_signal_handler(int sig, siginfo_t *info,
*/
static inline void set_notify_resume(struct task_struct *task)
{
+#ifdef TIF_NOTIFY_RESUME
if (!test_and_set_tsk_thread_flag(task, TIF_NOTIFY_RESUME))
kick_process(task);
+#endif
}
/**
@@ -184,6 +187,14 @@ static inline void set_notify_resume(struct task_struct *task)
*/
static inline void tracehook_notify_resume(struct pt_regs *regs)
{
+ /*
+ * The caller just cleared TIF_NOTIFY_RESUME. This barrier
+ * pairs with task_work_add()->set_notify_resume() after
+ * hlist_add_head(task->task_works);
+ */
+ smp_mb__after_clear_bit();
+ if (unlikely(!hlist_empty(&current->task_works)))
+ task_work_run();
}
#endif /* TIF_NOTIFY_RESUME */