diff options
Diffstat (limited to 'kernel/cpuset.c')
-rw-r--r-- | kernel/cpuset.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index cf8203a5fa71..fc949e4a625c 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
@@ -603,9 +603,7 @@ static void guarantee_online_mems(const struct cpuset *cs, nodemask_t *pmask) | |||
603 | * Do not call this routine if in_interrupt(). | 603 | * Do not call this routine if in_interrupt(). |
604 | * | 604 | * |
605 | * Call without callback_sem or task_lock() held. May be called | 605 | * Call without callback_sem or task_lock() held. May be called |
606 | * with or without manage_sem held. Except in early boot or | 606 | * with or without manage_sem held. Doesn't need task_lock to guard |
607 | * an exiting task, when tsk->cpuset is NULL, this routine will | ||
608 | * acquire task_lock(). We don't need to use task_lock to guard | ||
609 | * against another task changing a non-NULL cpuset pointer to NULL, | 607 | * against another task changing a non-NULL cpuset pointer to NULL, |
610 | * as that is only done by a task on itself, and if the current task | 608 | * as that is only done by a task on itself, and if the current task |
611 | * is here, it is not simultaneously in the exit code NULL'ing its | 609 | * is here, it is not simultaneously in the exit code NULL'ing its |
@@ -631,9 +629,6 @@ void cpuset_update_task_memory_state() | |||
631 | struct task_struct *tsk = current; | 629 | struct task_struct *tsk = current; |
632 | struct cpuset *cs = tsk->cpuset; | 630 | struct cpuset *cs = tsk->cpuset; |
633 | 631 | ||
634 | if (unlikely(!cs)) | ||
635 | return; | ||
636 | |||
637 | task_lock(tsk); | 632 | task_lock(tsk); |
638 | my_cpusets_mem_gen = cs->mems_generation; | 633 | my_cpusets_mem_gen = cs->mems_generation; |
639 | task_unlock(tsk); | 634 | task_unlock(tsk); |
@@ -1836,6 +1831,21 @@ static int cpuset_rmdir(struct inode *unused_dir, struct dentry *dentry) | |||
1836 | return 0; | 1831 | return 0; |
1837 | } | 1832 | } |
1838 | 1833 | ||
1834 | /* | ||
1835 | * cpuset_init_early - just enough so that the calls to | ||
1836 | * cpuset_update_task_memory_state() in early init code | ||
1837 | * are harmless. | ||
1838 | */ | ||
1839 | |||
1840 | int __init cpuset_init_early(void) | ||
1841 | { | ||
1842 | struct task_struct *tsk = current; | ||
1843 | |||
1844 | tsk->cpuset = &top_cpuset; | ||
1845 | tsk->cpuset->mems_generation = atomic_read(&cpuset_mems_generation); | ||
1846 | return 0; | ||
1847 | } | ||
1848 | |||
1839 | /** | 1849 | /** |
1840 | * cpuset_init - initialize cpusets at system boot | 1850 | * cpuset_init - initialize cpusets at system boot |
1841 | * | 1851 | * |