From: Oleg Nesterov <oleg@redhat.com>
To: "Zhang, Yanmin" <yanmin_zhang@linux.intel.com>,
Andrew Morton <akpm@linux-foundation.org>
Cc: Roland McGrath <roland@redhat.com>,
LKML <linux-kernel@vger.kernel.org>,
andi.kleen@intel.com, stable@kernel.org
Subject: [PATCH] ptrace: optimize exit_ptrace() for the likely case
Date: Thu, 29 Jul 2010 17:12:29 +0200 [thread overview]
Message-ID: <20100729151229.GA24754@redhat.com> (raw)
In-Reply-To: <1280193353.2085.15.camel@ymzhang.sh.intel.com>
(replaces ptrace-dont-run-write_locktasklist_lock-if-the-parent-doesnt-ptrace-other-processes.patch)
exit_ptrace() takes tasklist_lock unconditionally. We need this lock
to avoid the race with ptrace_traceme(), it acts as a barrier.
Change its caller, forget_original_parent(), to call exit_ptrace()
under tasklist_lock. Change exit_ptrace() to drop and reacquire this
lock if needed.
This allows us to add the fastpath list_empty(ptraced) check. In the
likely no-tracees case exit_ptrace() just returns and we avoid the
lock() + unlock() sequence.
"Zhang, Yanmin" <yanmin_zhang@linux.intel.com> suggested to add this
check, and he reports that this change adds about 11% improvement in
some tests.
Suggested-and-tested-by: "Zhang, Yanmin" <yanmin_zhang@linux.intel.com>
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
---
kernel/ptrace.c | 12 +++++++++---
kernel/exit.c | 7 +++++--
2 files changed, 14 insertions(+), 5 deletions(-)
--- 35-rc3/kernel/ptrace.c~exit_ptrace_fastpath_check 2010-05-28 13:41:41.000000000 +0200
+++ 35-rc3/kernel/ptrace.c 2010-07-29 16:37:13.000000000 +0200
@@ -324,26 +324,32 @@ int ptrace_detach(struct task_struct *ch
}
/*
- * Detach all tasks we were using ptrace on.
+ * Detach all tasks we were using ptrace on. Called with tasklist held
+ * for writing, and returns with it held too. But note it can release
+ * and reacquire the lock.
*/
void exit_ptrace(struct task_struct *tracer)
{
struct task_struct *p, *n;
LIST_HEAD(ptrace_dead);
- write_lock_irq(&tasklist_lock);
+ if (likely(list_empty(&tracer->ptraced)))
+ return;
+
list_for_each_entry_safe(p, n, &tracer->ptraced, ptrace_entry) {
if (__ptrace_detach(tracer, p))
list_add(&p->ptrace_entry, &ptrace_dead);
}
- write_unlock_irq(&tasklist_lock);
+ write_unlock_irq(&tasklist_lock);
BUG_ON(!list_empty(&tracer->ptraced));
list_for_each_entry_safe(p, n, &ptrace_dead, ptrace_entry) {
list_del_init(&p->ptrace_entry);
release_task(p);
}
+
+ write_lock_irq(&tasklist_lock);
}
int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len)
--- 35-rc3/kernel/exit.c~exit_ptrace_fastpath_check 2010-05-28 13:41:41.000000000 +0200
+++ 35-rc3/kernel/exit.c 2010-07-29 16:38:37.000000000 +0200
@@ -771,9 +771,12 @@ static void forget_original_parent(struc
struct task_struct *p, *n, *reaper;
LIST_HEAD(dead_children);
- exit_ptrace(father);
-
write_lock_irq(&tasklist_lock);
+ /*
+ * Note that exit_ptrace() and find_new_reaper() might
+ * drop tasklist_lock and reacquire it.
+ */
+ exit_ptrace(father);
reaper = find_new_reaper(father);
list_for_each_entry_safe(p, n, &father->children, sibling) {
next prev parent reply other threads:[~2010-07-29 15:15 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-15 6:51 [PATCH] Don't apply for write lock on tasklist_lock if parent doesn't ptrace other processes Zhang, Yanmin
2010-07-15 19:53 ` David Rientjes
2010-07-21 21:49 ` Andrew Morton
2010-07-21 22:25 ` Roland McGrath
2010-07-22 9:05 ` Oleg Nesterov
2010-07-22 19:24 ` Roland McGrath
2010-07-23 17:40 ` Oleg Nesterov
2010-07-23 8:45 ` Zhang, Yanmin
2010-07-23 17:34 ` Oleg Nesterov
2010-07-26 5:05 ` Zhang, Yanmin
2010-07-26 8:53 ` Oleg Nesterov
2010-07-26 9:40 ` Kleen, Andi
2010-07-27 1:15 ` Zhang, Yanmin
2010-07-29 15:12 ` Oleg Nesterov [this message]
2010-07-29 17:40 ` [PATCH] ptrace: optimize exit_ptrace() for the likely case Roland McGrath
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100729151229.GA24754@redhat.com \
--to=oleg@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=andi.kleen@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=roland@redhat.com \
--cc=stable@kernel.org \
--cc=yanmin_zhang@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.