diff options
Diffstat (limited to 'kernel/cpuset.c')
-rw-r--r-- | kernel/cpuset.c | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index 6313c38c930e..0a6b4d89f9a0 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
@@ -729,9 +729,11 @@ static int validate_change(const struct cpuset *cur, const struct cpuset *trial) | |||
729 | } | 729 | } |
730 | 730 | ||
731 | /* Remaining checks don't apply to root cpuset */ | 731 | /* Remaining checks don't apply to root cpuset */ |
732 | if ((par = cur->parent) == NULL) | 732 | if (cur == &top_cpuset) |
733 | return 0; | 733 | return 0; |
734 | 734 | ||
735 | par = cur->parent; | ||
736 | |||
735 | /* We must be a subset of our parent cpuset */ | 737 | /* We must be a subset of our parent cpuset */ |
736 | if (!is_cpuset_subset(trial, par)) | 738 | if (!is_cpuset_subset(trial, par)) |
737 | return -EACCES; | 739 | return -EACCES; |
@@ -1060,10 +1062,7 @@ static int update_flag(cpuset_flagbits_t bit, struct cpuset *cs, char *buf) | |||
1060 | cpu_exclusive_changed = | 1062 | cpu_exclusive_changed = |
1061 | (is_cpu_exclusive(cs) != is_cpu_exclusive(&trialcs)); | 1063 | (is_cpu_exclusive(cs) != is_cpu_exclusive(&trialcs)); |
1062 | mutex_lock(&callback_mutex); | 1064 | mutex_lock(&callback_mutex); |
1063 | if (turning_on) | 1065 | cs->flags = trialcs.flags; |
1064 | set_bit(bit, &cs->flags); | ||
1065 | else | ||
1066 | clear_bit(bit, &cs->flags); | ||
1067 | mutex_unlock(&callback_mutex); | 1066 | mutex_unlock(&callback_mutex); |
1068 | 1067 | ||
1069 | if (cpu_exclusive_changed) | 1068 | if (cpu_exclusive_changed) |
@@ -1281,7 +1280,8 @@ typedef enum { | |||
1281 | FILE_TASKLIST, | 1280 | FILE_TASKLIST, |
1282 | } cpuset_filetype_t; | 1281 | } cpuset_filetype_t; |
1283 | 1282 | ||
1284 | static ssize_t cpuset_common_file_write(struct file *file, const char __user *userbuf, | 1283 | static ssize_t cpuset_common_file_write(struct file *file, |
1284 | const char __user *userbuf, | ||
1285 | size_t nbytes, loff_t *unused_ppos) | 1285 | size_t nbytes, loff_t *unused_ppos) |
1286 | { | 1286 | { |
1287 | struct cpuset *cs = __d_cs(file->f_dentry->d_parent); | 1287 | struct cpuset *cs = __d_cs(file->f_dentry->d_parent); |
@@ -1292,7 +1292,7 @@ static ssize_t cpuset_common_file_write(struct file *file, const char __user *us | |||
1292 | int retval = 0; | 1292 | int retval = 0; |
1293 | 1293 | ||
1294 | /* Crude upper limit on largest legitimate cpulist user might write. */ | 1294 | /* Crude upper limit on largest legitimate cpulist user might write. */ |
1295 | if (nbytes > 100 + 6 * NR_CPUS) | 1295 | if (nbytes > 100 + 6 * max(NR_CPUS, MAX_NUMNODES)) |
1296 | return -E2BIG; | 1296 | return -E2BIG; |
1297 | 1297 | ||
1298 | /* +1 for nul-terminator */ | 1298 | /* +1 for nul-terminator */ |
@@ -1532,7 +1532,7 @@ static int cpuset_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
1532 | return simple_rename(old_dir, old_dentry, new_dir, new_dentry); | 1532 | return simple_rename(old_dir, old_dentry, new_dir, new_dentry); |
1533 | } | 1533 | } |
1534 | 1534 | ||
1535 | static struct file_operations cpuset_file_operations = { | 1535 | static const struct file_operations cpuset_file_operations = { |
1536 | .read = cpuset_file_read, | 1536 | .read = cpuset_file_read, |
1537 | .write = cpuset_file_write, | 1537 | .write = cpuset_file_write, |
1538 | .llseek = generic_file_llseek, | 1538 | .llseek = generic_file_llseek, |
@@ -2045,7 +2045,6 @@ out: | |||
2045 | return err; | 2045 | return err; |
2046 | } | 2046 | } |
2047 | 2047 | ||
2048 | #if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_MEMORY_HOTPLUG) | ||
2049 | /* | 2048 | /* |
2050 | * If common_cpu_mem_hotplug_unplug(), below, unplugs any CPUs | 2049 | * If common_cpu_mem_hotplug_unplug(), below, unplugs any CPUs |
2051 | * or memory nodes, we need to walk over the cpuset hierarchy, | 2050 | * or memory nodes, we need to walk over the cpuset hierarchy, |
@@ -2109,9 +2108,7 @@ static void common_cpu_mem_hotplug_unplug(void) | |||
2109 | mutex_unlock(&callback_mutex); | 2108 | mutex_unlock(&callback_mutex); |
2110 | mutex_unlock(&manage_mutex); | 2109 | mutex_unlock(&manage_mutex); |
2111 | } | 2110 | } |
2112 | #endif | ||
2113 | 2111 | ||
2114 | #ifdef CONFIG_HOTPLUG_CPU | ||
2115 | /* | 2112 | /* |
2116 | * The top_cpuset tracks what CPUs and Memory Nodes are online, | 2113 | * The top_cpuset tracks what CPUs and Memory Nodes are online, |
2117 | * period. This is necessary in order to make cpusets transparent | 2114 | * period. This is necessary in order to make cpusets transparent |
@@ -2128,7 +2125,6 @@ static int cpuset_handle_cpuhp(struct notifier_block *nb, | |||
2128 | common_cpu_mem_hotplug_unplug(); | 2125 | common_cpu_mem_hotplug_unplug(); |
2129 | return 0; | 2126 | return 0; |
2130 | } | 2127 | } |
2131 | #endif | ||
2132 | 2128 | ||
2133 | #ifdef CONFIG_MEMORY_HOTPLUG | 2129 | #ifdef CONFIG_MEMORY_HOTPLUG |
2134 | /* | 2130 | /* |
@@ -2610,7 +2606,7 @@ static int cpuset_open(struct inode *inode, struct file *file) | |||
2610 | return single_open(file, proc_cpuset_show, pid); | 2606 | return single_open(file, proc_cpuset_show, pid); |
2611 | } | 2607 | } |
2612 | 2608 | ||
2613 | struct file_operations proc_cpuset_operations = { | 2609 | const struct file_operations proc_cpuset_operations = { |
2614 | .open = cpuset_open, | 2610 | .open = cpuset_open, |
2615 | .read = seq_read, | 2611 | .read = seq_read, |
2616 | .llseek = seq_lseek, | 2612 | .llseek = seq_lseek, |