From: Oleg Nesterov <oleg@tv-sign.ru>
To: "Eric W. Biederman" <ebiederm@xmission.com>,
Andrew Morton <akpm@osdl.org>
Cc: linux-kernel@vger.kernel.org, Ingo Molnar <mingo@elte.hu>,
"Paul E. McKenney" <paulmck@us.ibm.com>,
Linus Torvalds <torvalds@osdl.org>
Subject: Re: [PATCH rc5-mm] pids: kill PIDTYPE_TGID
Date: Thu, 09 Mar 2006 00:46:15 +0300 [thread overview]
Message-ID: <440F50A7.EBAD87D5@tv-sign.ru> (raw)
In-Reply-To: m1irqovh8l.fsf@ebiederm.dsl.xmission.com
Eric W. Biederman wrote:
>
> > p->group_leader = current->group_leader;
> > + list_add_tail_rcu(&p->thread_group, ¤t->thread_group);
> Can this be:
> list_add_tail_rcu(&p->thread_group, ¤t->group_leader->thread_group);
Done.
> That way at least the odds of missing a new task_struct when doing an
> rcu traversal are reduced almost to 0.
Am I understand correctly? This change has effect when we are doing the
traversal starting from ->group_leader in a "best effort" manner lockless,
yes?
[PATCH rc5-mm] pids: kill PIDTYPE_TGID
depends on pidhash-dont-count-idle-threads.patch
This patch kills PIDTYPE_TGID pid_type thus saving one hash table
in kernel/pid.c and speeding up subthreads create/destroy a bit.
It is also a preparation for the further tref/pids rework.
This patch adds 'struct list_head thread_group' to 'struct task_struct'
instead.
We don't detach group leader from PIDTYPE_PID namespace until another
thread inherits it's ->pid == ->tgid, so we are safe wrt premature
free_pidmap(->tgid) call.
Currently there are no users of find_task_by_pid_type(PIDTYPE_TGID).
Should the need arise, we can use find_task_by_pid()->group_leader.
include/linux/pid.h | 1 -
include/linux/sched.h | 11 ++++++++---
kernel/exit.c | 10 +---------
kernel/fork.c | 4 +++-
4 files changed, 12 insertions(+), 14 deletions(-)
Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
--- 2.6.16-rc5/include/linux/pid.h~1_TGID 2006-03-09 00:17:24.000000000 +0300
+++ 2.6.16-rc5/include/linux/pid.h 2006-03-09 03:03:44.000000000 +0300
@@ -4,7 +4,6 @@
enum pid_type
{
PIDTYPE_PID,
- PIDTYPE_TGID,
PIDTYPE_PGID,
PIDTYPE_SID,
PIDTYPE_MAX
--- 2.6.16-rc5/include/linux/sched.h~1_TGID 2006-03-09 00:17:24.000000000 +0300
+++ 2.6.16-rc5/include/linux/sched.h 2006-03-09 03:03:44.000000000 +0300
@@ -748,6 +748,7 @@ struct task_struct {
/* PID/PID hash table linkage. */
struct pid pids[PIDTYPE_MAX];
+ struct list_head thread_group;
struct completion *vfork_done; /* for vfork() */
int __user *set_child_tid; /* CLONE_CHILD_SETTID */
@@ -1181,13 +1182,17 @@ extern void wait_task_inactive(task_t *
#define while_each_thread(g, t) \
while ((t = next_thread(t)) != g)
-extern task_t * FASTCALL(next_thread(const task_t *p));
-
#define thread_group_leader(p) (p->pid == p->tgid)
+static inline task_t *next_thread(task_t *p)
+{
+ return list_entry(rcu_dereference(p->thread_group.next),
+ task_t, thread_group);
+}
+
static inline int thread_group_empty(task_t *p)
{
- return list_empty(&p->pids[PIDTYPE_TGID].pid_list);
+ return list_empty(&p->thread_group);
}
#define delay_group_leader(p) \
--- 2.6.16-rc5/kernel/exit.c~1_TGID 2006-03-09 00:17:24.000000000 +0300
+++ 2.6.16-rc5/kernel/exit.c 2006-03-09 00:42:26.000000000 +0300
@@ -49,7 +49,6 @@ static void __unhash_process(struct task
{
nr_threads--;
detach_pid(p, PIDTYPE_PID);
- detach_pid(p, PIDTYPE_TGID);
if (thread_group_leader(p)) {
detach_pid(p, PIDTYPE_PGID);
detach_pid(p, PIDTYPE_SID);
@@ -57,7 +56,7 @@ static void __unhash_process(struct task
list_del_init(&p->tasks);
__get_cpu_var(process_counts)--;
}
-
+ list_del_rcu(&p->thread_group);
remove_parent(p);
}
@@ -953,13 +952,6 @@ asmlinkage long sys_exit(int error_code)
do_exit((error_code&0xff)<<8);
}
-task_t fastcall *next_thread(const task_t *p)
-{
- return pid_task(p->pids[PIDTYPE_TGID].pid_list.next, PIDTYPE_TGID);
-}
-
-EXPORT_SYMBOL(next_thread);
-
/*
* Take down every thread in the group. This is called by fatal signals
* as well as by sys_exit_group (below).
--- 2.6.16-rc5/kernel/fork.c~1_TGID 2006-03-09 00:17:24.000000000 +0300
+++ 2.6.16-rc5/kernel/fork.c 2006-03-09 03:05:10.000000000 +0300
@@ -1100,6 +1100,7 @@ static task_t *copy_process(unsigned lon
* We dont wake it up yet.
*/
p->group_leader = p;
+ INIT_LIST_HEAD(&p->thread_group);
INIT_LIST_HEAD(&p->ptrace_children);
INIT_LIST_HEAD(&p->ptrace_list);
@@ -1153,7 +1154,9 @@ static task_t *copy_process(unsigned lon
retval = -EAGAIN;
goto bad_fork_cleanup_namespace;
}
+
p->group_leader = current->group_leader;
+ list_add_tail_rcu(&p->thread_group, &p->group_leader->thread_group);
if (current->signal->group_stop_count > 0) {
/*
@@ -1201,7 +1204,6 @@ static task_t *copy_process(unsigned lon
list_add_tail(&p->tasks, &init_task.tasks);
__get_cpu_var(process_counts)++;
}
- attach_pid(p, PIDTYPE_TGID, p->tgid);
attach_pid(p, PIDTYPE_PID, p->pid);
nr_threads++;
}
next prev parent reply other threads:[~2006-03-08 21:49 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-03-07 20:19 [PATCH rc5-mm] pids: kill PIDTYPE_TGID Oleg Nesterov
2006-03-07 22:42 ` Eric W. Biederman
2006-03-08 14:41 ` Oleg Nesterov
2006-03-08 16:19 ` Eric W. Biederman
2006-03-08 19:23 ` Oleg Nesterov
2006-03-08 20:00 ` Eric W. Biederman
2006-03-08 21:46 ` Oleg Nesterov [this message]
2006-03-08 22:12 ` Eric W. Biederman
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=440F50A7.EBAD87D5@tv-sign.ru \
--to=oleg@tv-sign.ru \
--cc=akpm@osdl.org \
--cc=ebiederm@xmission.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=paulmck@us.ibm.com \
--cc=torvalds@osdl.org \
/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.