statically initialize struct pid for swapper
Statically initialize a struct pid for the swapper process (pid_t == 0) and attach it to init_task. This is needed so task_pid(), task_pgrp() and task_session() interfaces work on the swapper process also. Signed-off-by: Sukadev Bhattiprolu <sukadev@us.ibm.com> Cc: Cedric Le Goater <clg@fr.ibm.com> Cc: Dave Hansen <haveblue@us.ibm.com> Cc: Serge Hallyn <serue@us.ibm.com> Cc: Eric Biederman <ebiederm@xmission.com> Cc: Herbert Poetzl <herbert@13thfloor.at> Cc: <containers@lists.osdl.org> Acked-by: Eric W. Biederman <ebiederm@xmission.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
e713d0dab2
Коммит
820e45db23
|
@ -88,6 +88,28 @@ extern struct nsproxy init_nsproxy;
|
|||
|
||||
extern struct group_info init_groups;
|
||||
|
||||
#define INIT_STRUCT_PID { \
|
||||
.count = ATOMIC_INIT(1), \
|
||||
.nr = 0, \
|
||||
/* Don't put this struct pid in pid_hash */ \
|
||||
.pid_chain = { .next = NULL, .pprev = NULL }, \
|
||||
.tasks = { \
|
||||
{ .first = &init_task.pids[PIDTYPE_PID].node }, \
|
||||
{ .first = &init_task.pids[PIDTYPE_PGID].node }, \
|
||||
{ .first = &init_task.pids[PIDTYPE_SID].node }, \
|
||||
}, \
|
||||
.rcu = RCU_HEAD_INIT, \
|
||||
}
|
||||
|
||||
#define INIT_PID_LINK(type) \
|
||||
{ \
|
||||
.node = { \
|
||||
.next = NULL, \
|
||||
.pprev = &init_struct_pid.tasks[type].first, \
|
||||
}, \
|
||||
.pid = &init_struct_pid, \
|
||||
}
|
||||
|
||||
/*
|
||||
* INIT_TASK is used to set up the first task table, touch at
|
||||
* your own risk!. Base=0, limit=0x1fffff (=2MB)
|
||||
|
@ -139,6 +161,11 @@ extern struct group_info init_groups;
|
|||
.cpu_timers = INIT_CPU_TIMERS(tsk.cpu_timers), \
|
||||
.fs_excl = ATOMIC_INIT(0), \
|
||||
.pi_lock = __SPIN_LOCK_UNLOCKED(tsk.pi_lock), \
|
||||
.pids = { \
|
||||
[PIDTYPE_PID] = INIT_PID_LINK(PIDTYPE_PID), \
|
||||
[PIDTYPE_PGID] = INIT_PID_LINK(PIDTYPE_PGID), \
|
||||
[PIDTYPE_SID] = INIT_PID_LINK(PIDTYPE_SID), \
|
||||
}, \
|
||||
INIT_TRACE_IRQFLAGS \
|
||||
INIT_LOCKDEP \
|
||||
}
|
||||
|
|
|
@ -51,6 +51,8 @@ struct pid
|
|||
struct rcu_head rcu;
|
||||
};
|
||||
|
||||
extern struct pid init_struct_pid;
|
||||
|
||||
struct pid_link
|
||||
{
|
||||
struct hlist_node node;
|
||||
|
|
|
@ -27,11 +27,13 @@
|
|||
#include <linux/bootmem.h>
|
||||
#include <linux/hash.h>
|
||||
#include <linux/pid_namespace.h>
|
||||
#include <linux/init_task.h>
|
||||
|
||||
#define pid_hashfn(nr) hash_long((unsigned long)nr, pidhash_shift)
|
||||
static struct hlist_head *pid_hash;
|
||||
static int pidhash_shift;
|
||||
static struct kmem_cache *pid_cachep;
|
||||
struct pid init_struct_pid = INIT_STRUCT_PID;
|
||||
|
||||
int pid_max = PID_MAX_DEFAULT;
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче