[PATCH 58] introduce context_siginfo() helper
Oleg Nesterov
oleg at redhat.com
Thu Sep 24 00:40:09 UTC 2009
Not sure you will like it, hence the separate patch.
ptrace_{get,set}siginfo() need ACCESS_ONCE() to fix the theoretical
problem, and they also need a comment to explain why it is safe to
dereference ->siginfo under ->siglock.
I think it would be more readable if we add the trivial helper, just
to avoid duplicating the comment.
---
kernel/ptrace.c | 20 +++++++++++++-------
1 file changed, 13 insertions(+), 7 deletions(-)
--- PU/kernel/ptrace.c~58_CONTEXT_SIGINFO 2009-09-24 02:14:17.000000000 +0200
+++ PU/kernel/ptrace.c 2009-09-24 02:26:26.000000000 +0200
@@ -326,6 +326,17 @@ static u32 ptrace_report_exec(enum utrac
return UTRACE_STOP;
}
+static inline siginfo_t *context_siginfo(struct ptrace_context *context)
+{
+ /*
+ * Make sure the compiler reads ->siginfo only once, if we race
+ * with SIGKILL ->siginfo can be cleared under us. But since we
+ * hold ->siglock the memory it points to can't go away, see the
+ * comment in ptrace_report_signal() below.
+ */
+ return ACCESS_ONCE(context->siginfo);
+}
+
static void ptrace_resume_signal(struct utrace_engine *engine,
struct task_struct *tracee, long data)
{
@@ -334,13 +345,8 @@ static void ptrace_resume_signal(struct
if (!lock_task_sighand(tracee, &flags))
return;
- /*
- * Make sure the compiler reads ->siginfo only once, if we race
- * with SIGKILL ->siginfo can be cleared under us. But since we
- * hold ->siglock the memory it points to can't go away, see the
- * comment in ptrace_report_signal() below.
- */
- info = ACCESS_ONCE(ptrace_context(engine)->siginfo);
+
+ info = context_siginfo(ptrace_context(engine));
WARN_ON(!info && !(tracee->signal->flags & SIGNAL_GROUP_EXIT));
if (likely(info) && info->si_signo != data) {
More information about the utrace-devel
mailing list