From 75dd0f5603c7880013f85ec147c48ceb3bb96d63 Mon Sep 17 00:00:00 2001 From: Paul Jackson Date: Sun, 8 Jan 2006 01:02:01 -0800 Subject: [PATCH] --- yaml --- r: 16911 b: refs/heads/master c: c417f0242ebe578924a30d4e53d35b5059fed4e7 h: refs/heads/master i: 16909: 73640b6f611af430bea609422934f4a34bf2cfe3 16907: 2994d31ba6c83bff429cb10d49ae4564cf593208 16903: 2c6707d5b92eea4f808517df2635cb5bf0a88ff9 16895: a85d3e6e5abd1aa966e773f78ae5fd6257f8cfd6 v: v3 --- [refs] | 2 +- trunk/include/linux/cpuset.h | 2 ++ trunk/init/main.c | 1 + trunk/kernel/cpuset.c | 22 ++++++++++++++++------ 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index ee690898d57a..834e3b7072a8 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 04c19fa6f16047abff2288ddbc1f0798ede5a849 +refs/heads/master: c417f0242ebe578924a30d4e53d35b5059fed4e7 diff --git a/trunk/include/linux/cpuset.h b/trunk/include/linux/cpuset.h index 34081c168af5..c472f972bd6d 100644 --- a/trunk/include/linux/cpuset.h +++ b/trunk/include/linux/cpuset.h @@ -16,6 +16,7 @@ extern int number_of_cpusets; /* How many cpusets are defined in system? */ +extern int cpuset_init_early(void); extern int cpuset_init(void); extern void cpuset_init_smp(void); extern void cpuset_fork(struct task_struct *p); @@ -49,6 +50,7 @@ extern char *cpuset_task_status_allowed(struct task_struct *task, char *buffer); #else /* !CONFIG_CPUSETS */ +static inline int cpuset_init_early(void) { return 0; } static inline int cpuset_init(void) { return 0; } static inline void cpuset_init_smp(void) {} static inline void cpuset_fork(struct task_struct *p) {} diff --git a/trunk/init/main.c b/trunk/init/main.c index 2ed3638deec7..afe5eb84ad52 100644 --- a/trunk/init/main.c +++ b/trunk/init/main.c @@ -512,6 +512,7 @@ asmlinkage void __init start_kernel(void) } #endif vfs_caches_init_early(); + cpuset_init_early(); mem_init(); kmem_cache_init(); setup_per_cpu_pageset(); diff --git a/trunk/kernel/cpuset.c b/trunk/kernel/cpuset.c index cf8203a5fa71..fc949e4a625c 100644 --- a/trunk/kernel/cpuset.c +++ b/trunk/kernel/cpuset.c @@ -603,9 +603,7 @@ static void guarantee_online_mems(const struct cpuset *cs, nodemask_t *pmask) * Do not call this routine if in_interrupt(). * * Call without callback_sem or task_lock() held. May be called - * with or without manage_sem held. Except in early boot or - * an exiting task, when tsk->cpuset is NULL, this routine will - * acquire task_lock(). We don't need to use task_lock to guard + * with or without manage_sem held. Doesn't need task_lock to guard * against another task changing a non-NULL cpuset pointer to NULL, * as that is only done by a task on itself, and if the current task * is here, it is not simultaneously in the exit code NULL'ing its @@ -631,9 +629,6 @@ void cpuset_update_task_memory_state() struct task_struct *tsk = current; struct cpuset *cs = tsk->cpuset; - if (unlikely(!cs)) - return; - task_lock(tsk); my_cpusets_mem_gen = cs->mems_generation; task_unlock(tsk); @@ -1836,6 +1831,21 @@ static int cpuset_rmdir(struct inode *unused_dir, struct dentry *dentry) return 0; } +/* + * cpuset_init_early - just enough so that the calls to + * cpuset_update_task_memory_state() in early init code + * are harmless. + */ + +int __init cpuset_init_early(void) +{ + struct task_struct *tsk = current; + + tsk->cpuset = &top_cpuset; + tsk->cpuset->mems_generation = atomic_read(&cpuset_mems_generation); + return 0; +} + /** * cpuset_init - initialize cpusets at system boot *