diff options
Diffstat (limited to 'kernel/sched.c')
-rw-r--r-- | kernel/sched.c | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 374f42170d6d..a2dd05435534 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -5250,6 +5250,18 @@ static struct ctl_table *sd_alloc_ctl_entry(int n) | |||
5250 | return entry; | 5250 | return entry; |
5251 | } | 5251 | } |
5252 | 5252 | ||
5253 | static void sd_free_ctl_entry(struct ctl_table **tablep) | ||
5254 | { | ||
5255 | struct ctl_table *entry = *tablep; | ||
5256 | |||
5257 | for (entry = *tablep; entry->procname; entry++) | ||
5258 | if (entry->child) | ||
5259 | sd_free_ctl_entry(&entry->child); | ||
5260 | |||
5261 | kfree(*tablep); | ||
5262 | *tablep = NULL; | ||
5263 | } | ||
5264 | |||
5253 | static void | 5265 | static void |
5254 | set_table_entry(struct ctl_table *entry, | 5266 | set_table_entry(struct ctl_table *entry, |
5255 | const char *procname, void *data, int maxlen, | 5267 | const char *procname, void *data, int maxlen, |
@@ -5318,7 +5330,7 @@ static ctl_table *sd_alloc_ctl_cpu_table(int cpu) | |||
5318 | } | 5330 | } |
5319 | 5331 | ||
5320 | static struct ctl_table_header *sd_sysctl_header; | 5332 | static struct ctl_table_header *sd_sysctl_header; |
5321 | static void init_sched_domain_sysctl(void) | 5333 | static void register_sched_domain_sysctl(void) |
5322 | { | 5334 | { |
5323 | int i, cpu_num = num_online_cpus(); | 5335 | int i, cpu_num = num_online_cpus(); |
5324 | struct ctl_table *entry = sd_alloc_ctl_entry(cpu_num + 1); | 5336 | struct ctl_table *entry = sd_alloc_ctl_entry(cpu_num + 1); |
@@ -5335,8 +5347,18 @@ static void init_sched_domain_sysctl(void) | |||
5335 | } | 5347 | } |
5336 | sd_sysctl_header = register_sysctl_table(sd_ctl_root); | 5348 | sd_sysctl_header = register_sysctl_table(sd_ctl_root); |
5337 | } | 5349 | } |
5350 | |||
5351 | static void unregister_sched_domain_sysctl(void) | ||
5352 | { | ||
5353 | unregister_sysctl_table(sd_sysctl_header); | ||
5354 | sd_sysctl_header = NULL; | ||
5355 | sd_free_ctl_entry(&sd_ctl_dir[0].child); | ||
5356 | } | ||
5338 | #else | 5357 | #else |
5339 | static void init_sched_domain_sysctl(void) | 5358 | static void register_sched_domain_sysctl(void) |
5359 | { | ||
5360 | } | ||
5361 | static void unregister_sched_domain_sysctl(void) | ||
5340 | { | 5362 | { |
5341 | } | 5363 | } |
5342 | #endif | 5364 | #endif |
@@ -6271,6 +6293,8 @@ static int arch_init_sched_domains(const cpumask_t *cpu_map) | |||
6271 | 6293 | ||
6272 | err = build_sched_domains(&cpu_default_map); | 6294 | err = build_sched_domains(&cpu_default_map); |
6273 | 6295 | ||
6296 | register_sched_domain_sysctl(); | ||
6297 | |||
6274 | return err; | 6298 | return err; |
6275 | } | 6299 | } |
6276 | 6300 | ||
@@ -6287,6 +6311,8 @@ static void detach_destroy_domains(const cpumask_t *cpu_map) | |||
6287 | { | 6311 | { |
6288 | int i; | 6312 | int i; |
6289 | 6313 | ||
6314 | unregister_sched_domain_sysctl(); | ||
6315 | |||
6290 | for_each_cpu_mask(i, *cpu_map) | 6316 | for_each_cpu_mask(i, *cpu_map) |
6291 | cpu_attach_domain(NULL, i); | 6317 | cpu_attach_domain(NULL, i); |
6292 | synchronize_sched(); | 6318 | synchronize_sched(); |
@@ -6317,6 +6343,8 @@ int partition_sched_domains(cpumask_t *partition1, cpumask_t *partition2) | |||
6317 | if (!err && !cpus_empty(*partition2)) | 6343 | if (!err && !cpus_empty(*partition2)) |
6318 | err = build_sched_domains(partition2); | 6344 | err = build_sched_domains(partition2); |
6319 | 6345 | ||
6346 | register_sched_domain_sysctl(); | ||
6347 | |||
6320 | return err; | 6348 | return err; |
6321 | } | 6349 | } |
6322 | 6350 | ||
@@ -6448,8 +6476,6 @@ void __init sched_init_smp(void) | |||
6448 | /* XXX: Theoretical race here - CPU may be hotplugged now */ | 6476 | /* XXX: Theoretical race here - CPU may be hotplugged now */ |
6449 | hotcpu_notifier(update_sched_domains, 0); | 6477 | hotcpu_notifier(update_sched_domains, 0); |
6450 | 6478 | ||
6451 | init_sched_domain_sysctl(); | ||
6452 | |||
6453 | /* Move init over to a non-isolated CPU */ | 6479 | /* Move init over to a non-isolated CPU */ |
6454 | if (set_cpus_allowed(current, non_isolated_cpus) < 0) | 6480 | if (set_cpus_allowed(current, non_isolated_cpus) < 0) |
6455 | BUG(); | 6481 | BUG(); |