0001
0002
0003
0004
0005
0006 DEFINE_MUTEX(sched_domains_mutex);
0007
0008
0009 static cpumask_var_t sched_domains_tmpmask;
0010 static cpumask_var_t sched_domains_tmpmask2;
0011
0012 #ifdef CONFIG_SCHED_DEBUG
0013
0014 static int __init sched_debug_setup(char *str)
0015 {
0016 sched_debug_verbose = true;
0017
0018 return 0;
0019 }
0020 early_param("sched_verbose", sched_debug_setup);
0021
0022 static inline bool sched_debug(void)
0023 {
0024 return sched_debug_verbose;
0025 }
0026
0027 #define SD_FLAG(_name, mflags) [__##_name] = { .meta_flags = mflags, .name = #_name },
0028 const struct sd_flag_debug sd_flag_debug[] = {
0029 #include <linux/sched/sd_flags.h>
0030 };
0031 #undef SD_FLAG
0032
0033 static int sched_domain_debug_one(struct sched_domain *sd, int cpu, int level,
0034 struct cpumask *groupmask)
0035 {
0036 struct sched_group *group = sd->groups;
0037 unsigned long flags = sd->flags;
0038 unsigned int idx;
0039
0040 cpumask_clear(groupmask);
0041
0042 printk(KERN_DEBUG "%*s domain-%d: ", level, "", level);
0043 printk(KERN_CONT "span=%*pbl level=%s\n",
0044 cpumask_pr_args(sched_domain_span(sd)), sd->name);
0045
0046 if (!cpumask_test_cpu(cpu, sched_domain_span(sd))) {
0047 printk(KERN_ERR "ERROR: domain->span does not contain CPU%d\n", cpu);
0048 }
0049 if (group && !cpumask_test_cpu(cpu, sched_group_span(group))) {
0050 printk(KERN_ERR "ERROR: domain->groups does not contain CPU%d\n", cpu);
0051 }
0052
0053 for_each_set_bit(idx, &flags, __SD_FLAG_CNT) {
0054 unsigned int flag = BIT(idx);
0055 unsigned int meta_flags = sd_flag_debug[idx].meta_flags;
0056
0057 if ((meta_flags & SDF_SHARED_CHILD) && sd->child &&
0058 !(sd->child->flags & flag))
0059 printk(KERN_ERR "ERROR: flag %s set here but not in child\n",
0060 sd_flag_debug[idx].name);
0061
0062 if ((meta_flags & SDF_SHARED_PARENT) && sd->parent &&
0063 !(sd->parent->flags & flag))
0064 printk(KERN_ERR "ERROR: flag %s set here but not in parent\n",
0065 sd_flag_debug[idx].name);
0066 }
0067
0068 printk(KERN_DEBUG "%*s groups:", level + 1, "");
0069 do {
0070 if (!group) {
0071 printk("\n");
0072 printk(KERN_ERR "ERROR: group is NULL\n");
0073 break;
0074 }
0075
0076 if (cpumask_empty(sched_group_span(group))) {
0077 printk(KERN_CONT "\n");
0078 printk(KERN_ERR "ERROR: empty group\n");
0079 break;
0080 }
0081
0082 if (!(sd->flags & SD_OVERLAP) &&
0083 cpumask_intersects(groupmask, sched_group_span(group))) {
0084 printk(KERN_CONT "\n");
0085 printk(KERN_ERR "ERROR: repeated CPUs\n");
0086 break;
0087 }
0088
0089 cpumask_or(groupmask, groupmask, sched_group_span(group));
0090
0091 printk(KERN_CONT " %d:{ span=%*pbl",
0092 group->sgc->id,
0093 cpumask_pr_args(sched_group_span(group)));
0094
0095 if ((sd->flags & SD_OVERLAP) &&
0096 !cpumask_equal(group_balance_mask(group), sched_group_span(group))) {
0097 printk(KERN_CONT " mask=%*pbl",
0098 cpumask_pr_args(group_balance_mask(group)));
0099 }
0100
0101 if (group->sgc->capacity != SCHED_CAPACITY_SCALE)
0102 printk(KERN_CONT " cap=%lu", group->sgc->capacity);
0103
0104 if (group == sd->groups && sd->child &&
0105 !cpumask_equal(sched_domain_span(sd->child),
0106 sched_group_span(group))) {
0107 printk(KERN_ERR "ERROR: domain->groups does not match domain->child\n");
0108 }
0109
0110 printk(KERN_CONT " }");
0111
0112 group = group->next;
0113
0114 if (group != sd->groups)
0115 printk(KERN_CONT ",");
0116
0117 } while (group != sd->groups);
0118 printk(KERN_CONT "\n");
0119
0120 if (!cpumask_equal(sched_domain_span(sd), groupmask))
0121 printk(KERN_ERR "ERROR: groups don't span domain->span\n");
0122
0123 if (sd->parent &&
0124 !cpumask_subset(groupmask, sched_domain_span(sd->parent)))
0125 printk(KERN_ERR "ERROR: parent span is not a superset of domain->span\n");
0126 return 0;
0127 }
0128
0129 static void sched_domain_debug(struct sched_domain *sd, int cpu)
0130 {
0131 int level = 0;
0132
0133 if (!sched_debug_verbose)
0134 return;
0135
0136 if (!sd) {
0137 printk(KERN_DEBUG "CPU%d attaching NULL sched-domain.\n", cpu);
0138 return;
0139 }
0140
0141 printk(KERN_DEBUG "CPU%d attaching sched-domain(s):\n", cpu);
0142
0143 for (;;) {
0144 if (sched_domain_debug_one(sd, cpu, level, sched_domains_tmpmask))
0145 break;
0146 level++;
0147 sd = sd->parent;
0148 if (!sd)
0149 break;
0150 }
0151 }
0152 #else
0153
0154 # define sched_debug_verbose 0
0155 # define sched_domain_debug(sd, cpu) do { } while (0)
0156 static inline bool sched_debug(void)
0157 {
0158 return false;
0159 }
0160 #endif
0161
0162
0163 #define SD_FLAG(name, mflags) (name * !!((mflags) & SDF_NEEDS_GROUPS)) |
0164 static const unsigned int SD_DEGENERATE_GROUPS_MASK =
0165 #include <linux/sched/sd_flags.h>
0166 0;
0167 #undef SD_FLAG
0168
0169 static int sd_degenerate(struct sched_domain *sd)
0170 {
0171 if (cpumask_weight(sched_domain_span(sd)) == 1)
0172 return 1;
0173
0174
0175 if ((sd->flags & SD_DEGENERATE_GROUPS_MASK) &&
0176 (sd->groups != sd->groups->next))
0177 return 0;
0178
0179
0180 if (sd->flags & (SD_WAKE_AFFINE))
0181 return 0;
0182
0183 return 1;
0184 }
0185
0186 static int
0187 sd_parent_degenerate(struct sched_domain *sd, struct sched_domain *parent)
0188 {
0189 unsigned long cflags = sd->flags, pflags = parent->flags;
0190
0191 if (sd_degenerate(parent))
0192 return 1;
0193
0194 if (!cpumask_equal(sched_domain_span(sd), sched_domain_span(parent)))
0195 return 0;
0196
0197
0198 if (parent->groups == parent->groups->next)
0199 pflags &= ~SD_DEGENERATE_GROUPS_MASK;
0200
0201 if (~cflags & pflags)
0202 return 0;
0203
0204 return 1;
0205 }
0206
0207 #if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL)
0208 DEFINE_STATIC_KEY_FALSE(sched_energy_present);
0209 static unsigned int sysctl_sched_energy_aware = 1;
0210 DEFINE_MUTEX(sched_energy_mutex);
0211 bool sched_energy_update;
0212
0213 void rebuild_sched_domains_energy(void)
0214 {
0215 mutex_lock(&sched_energy_mutex);
0216 sched_energy_update = true;
0217 rebuild_sched_domains();
0218 sched_energy_update = false;
0219 mutex_unlock(&sched_energy_mutex);
0220 }
0221
0222 #ifdef CONFIG_PROC_SYSCTL
0223 static int sched_energy_aware_handler(struct ctl_table *table, int write,
0224 void *buffer, size_t *lenp, loff_t *ppos)
0225 {
0226 int ret, state;
0227
0228 if (write && !capable(CAP_SYS_ADMIN))
0229 return -EPERM;
0230
0231 ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
0232 if (!ret && write) {
0233 state = static_branch_unlikely(&sched_energy_present);
0234 if (state != sysctl_sched_energy_aware)
0235 rebuild_sched_domains_energy();
0236 }
0237
0238 return ret;
0239 }
0240
0241 static struct ctl_table sched_energy_aware_sysctls[] = {
0242 {
0243 .procname = "sched_energy_aware",
0244 .data = &sysctl_sched_energy_aware,
0245 .maxlen = sizeof(unsigned int),
0246 .mode = 0644,
0247 .proc_handler = sched_energy_aware_handler,
0248 .extra1 = SYSCTL_ZERO,
0249 .extra2 = SYSCTL_ONE,
0250 },
0251 {}
0252 };
0253
0254 static int __init sched_energy_aware_sysctl_init(void)
0255 {
0256 register_sysctl_init("kernel", sched_energy_aware_sysctls);
0257 return 0;
0258 }
0259
0260 late_initcall(sched_energy_aware_sysctl_init);
0261 #endif
0262
0263 static void free_pd(struct perf_domain *pd)
0264 {
0265 struct perf_domain *tmp;
0266
0267 while (pd) {
0268 tmp = pd->next;
0269 kfree(pd);
0270 pd = tmp;
0271 }
0272 }
0273
0274 static struct perf_domain *find_pd(struct perf_domain *pd, int cpu)
0275 {
0276 while (pd) {
0277 if (cpumask_test_cpu(cpu, perf_domain_span(pd)))
0278 return pd;
0279 pd = pd->next;
0280 }
0281
0282 return NULL;
0283 }
0284
0285 static struct perf_domain *pd_init(int cpu)
0286 {
0287 struct em_perf_domain *obj = em_cpu_get(cpu);
0288 struct perf_domain *pd;
0289
0290 if (!obj) {
0291 if (sched_debug())
0292 pr_info("%s: no EM found for CPU%d\n", __func__, cpu);
0293 return NULL;
0294 }
0295
0296 pd = kzalloc(sizeof(*pd), GFP_KERNEL);
0297 if (!pd)
0298 return NULL;
0299 pd->em_pd = obj;
0300
0301 return pd;
0302 }
0303
0304 static void perf_domain_debug(const struct cpumask *cpu_map,
0305 struct perf_domain *pd)
0306 {
0307 if (!sched_debug() || !pd)
0308 return;
0309
0310 printk(KERN_DEBUG "root_domain %*pbl:", cpumask_pr_args(cpu_map));
0311
0312 while (pd) {
0313 printk(KERN_CONT " pd%d:{ cpus=%*pbl nr_pstate=%d }",
0314 cpumask_first(perf_domain_span(pd)),
0315 cpumask_pr_args(perf_domain_span(pd)),
0316 em_pd_nr_perf_states(pd->em_pd));
0317 pd = pd->next;
0318 }
0319
0320 printk(KERN_CONT "\n");
0321 }
0322
0323 static void destroy_perf_domain_rcu(struct rcu_head *rp)
0324 {
0325 struct perf_domain *pd;
0326
0327 pd = container_of(rp, struct perf_domain, rcu);
0328 free_pd(pd);
0329 }
0330
0331 static void sched_energy_set(bool has_eas)
0332 {
0333 if (!has_eas && static_branch_unlikely(&sched_energy_present)) {
0334 if (sched_debug())
0335 pr_info("%s: stopping EAS\n", __func__);
0336 static_branch_disable_cpuslocked(&sched_energy_present);
0337 } else if (has_eas && !static_branch_unlikely(&sched_energy_present)) {
0338 if (sched_debug())
0339 pr_info("%s: starting EAS\n", __func__);
0340 static_branch_enable_cpuslocked(&sched_energy_present);
0341 }
0342 }
0343
0344
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354
0355
0356
0357
0358
0359
0360
0361
0362
0363
0364
0365
0366
0367
0368
0369 #define EM_MAX_COMPLEXITY 2048
0370
0371 extern struct cpufreq_governor schedutil_gov;
0372 static bool build_perf_domains(const struct cpumask *cpu_map)
0373 {
0374 int i, nr_pd = 0, nr_ps = 0, nr_cpus = cpumask_weight(cpu_map);
0375 struct perf_domain *pd = NULL, *tmp;
0376 int cpu = cpumask_first(cpu_map);
0377 struct root_domain *rd = cpu_rq(cpu)->rd;
0378 struct cpufreq_policy *policy;
0379 struct cpufreq_governor *gov;
0380
0381 if (!sysctl_sched_energy_aware)
0382 goto free;
0383
0384
0385 if (!per_cpu(sd_asym_cpucapacity, cpu)) {
0386 if (sched_debug()) {
0387 pr_info("rd %*pbl: CPUs do not have asymmetric capacities\n",
0388 cpumask_pr_args(cpu_map));
0389 }
0390 goto free;
0391 }
0392
0393
0394 if (sched_smt_active()) {
0395 pr_warn("rd %*pbl: Disabling EAS, SMT is not supported\n",
0396 cpumask_pr_args(cpu_map));
0397 goto free;
0398 }
0399
0400 if (!arch_scale_freq_invariant()) {
0401 if (sched_debug()) {
0402 pr_warn("rd %*pbl: Disabling EAS: frequency-invariant load tracking not yet supported",
0403 cpumask_pr_args(cpu_map));
0404 }
0405 goto free;
0406 }
0407
0408 for_each_cpu(i, cpu_map) {
0409
0410 if (find_pd(pd, i))
0411 continue;
0412
0413
0414 policy = cpufreq_cpu_get(i);
0415 if (!policy)
0416 goto free;
0417 gov = policy->governor;
0418 cpufreq_cpu_put(policy);
0419 if (gov != &schedutil_gov) {
0420 if (rd->pd)
0421 pr_warn("rd %*pbl: Disabling EAS, schedutil is mandatory\n",
0422 cpumask_pr_args(cpu_map));
0423 goto free;
0424 }
0425
0426
0427 tmp = pd_init(i);
0428 if (!tmp)
0429 goto free;
0430 tmp->next = pd;
0431 pd = tmp;
0432
0433
0434
0435
0436
0437 nr_pd++;
0438 nr_ps += em_pd_nr_perf_states(pd->em_pd);
0439 }
0440
0441
0442 if (nr_pd * (nr_ps + nr_cpus) > EM_MAX_COMPLEXITY) {
0443 WARN(1, "rd %*pbl: Failed to start EAS, EM complexity is too high\n",
0444 cpumask_pr_args(cpu_map));
0445 goto free;
0446 }
0447
0448 perf_domain_debug(cpu_map, pd);
0449
0450
0451 tmp = rd->pd;
0452 rcu_assign_pointer(rd->pd, pd);
0453 if (tmp)
0454 call_rcu(&tmp->rcu, destroy_perf_domain_rcu);
0455
0456 return !!pd;
0457
0458 free:
0459 free_pd(pd);
0460 tmp = rd->pd;
0461 rcu_assign_pointer(rd->pd, NULL);
0462 if (tmp)
0463 call_rcu(&tmp->rcu, destroy_perf_domain_rcu);
0464
0465 return false;
0466 }
0467 #else
0468 static void free_pd(struct perf_domain *pd) { }
0469 #endif
0470
0471 static void free_rootdomain(struct rcu_head *rcu)
0472 {
0473 struct root_domain *rd = container_of(rcu, struct root_domain, rcu);
0474
0475 cpupri_cleanup(&rd->cpupri);
0476 cpudl_cleanup(&rd->cpudl);
0477 free_cpumask_var(rd->dlo_mask);
0478 free_cpumask_var(rd->rto_mask);
0479 free_cpumask_var(rd->online);
0480 free_cpumask_var(rd->span);
0481 free_pd(rd->pd);
0482 kfree(rd);
0483 }
0484
0485 void rq_attach_root(struct rq *rq, struct root_domain *rd)
0486 {
0487 struct root_domain *old_rd = NULL;
0488 unsigned long flags;
0489
0490 raw_spin_rq_lock_irqsave(rq, flags);
0491
0492 if (rq->rd) {
0493 old_rd = rq->rd;
0494
0495 if (cpumask_test_cpu(rq->cpu, old_rd->online))
0496 set_rq_offline(rq);
0497
0498 cpumask_clear_cpu(rq->cpu, old_rd->span);
0499
0500
0501
0502
0503
0504
0505 if (!atomic_dec_and_test(&old_rd->refcount))
0506 old_rd = NULL;
0507 }
0508
0509 atomic_inc(&rd->refcount);
0510 rq->rd = rd;
0511
0512 cpumask_set_cpu(rq->cpu, rd->span);
0513 if (cpumask_test_cpu(rq->cpu, cpu_active_mask))
0514 set_rq_online(rq);
0515
0516 raw_spin_rq_unlock_irqrestore(rq, flags);
0517
0518 if (old_rd)
0519 call_rcu(&old_rd->rcu, free_rootdomain);
0520 }
0521
0522 void sched_get_rd(struct root_domain *rd)
0523 {
0524 atomic_inc(&rd->refcount);
0525 }
0526
0527 void sched_put_rd(struct root_domain *rd)
0528 {
0529 if (!atomic_dec_and_test(&rd->refcount))
0530 return;
0531
0532 call_rcu(&rd->rcu, free_rootdomain);
0533 }
0534
0535 static int init_rootdomain(struct root_domain *rd)
0536 {
0537 if (!zalloc_cpumask_var(&rd->span, GFP_KERNEL))
0538 goto out;
0539 if (!zalloc_cpumask_var(&rd->online, GFP_KERNEL))
0540 goto free_span;
0541 if (!zalloc_cpumask_var(&rd->dlo_mask, GFP_KERNEL))
0542 goto free_online;
0543 if (!zalloc_cpumask_var(&rd->rto_mask, GFP_KERNEL))
0544 goto free_dlo_mask;
0545
0546 #ifdef HAVE_RT_PUSH_IPI
0547 rd->rto_cpu = -1;
0548 raw_spin_lock_init(&rd->rto_lock);
0549 rd->rto_push_work = IRQ_WORK_INIT_HARD(rto_push_irq_work_func);
0550 #endif
0551
0552 rd->visit_gen = 0;
0553 init_dl_bw(&rd->dl_bw);
0554 if (cpudl_init(&rd->cpudl) != 0)
0555 goto free_rto_mask;
0556
0557 if (cpupri_init(&rd->cpupri) != 0)
0558 goto free_cpudl;
0559 return 0;
0560
0561 free_cpudl:
0562 cpudl_cleanup(&rd->cpudl);
0563 free_rto_mask:
0564 free_cpumask_var(rd->rto_mask);
0565 free_dlo_mask:
0566 free_cpumask_var(rd->dlo_mask);
0567 free_online:
0568 free_cpumask_var(rd->online);
0569 free_span:
0570 free_cpumask_var(rd->span);
0571 out:
0572 return -ENOMEM;
0573 }
0574
0575
0576
0577
0578
0579 struct root_domain def_root_domain;
0580
0581 void init_defrootdomain(void)
0582 {
0583 init_rootdomain(&def_root_domain);
0584
0585 atomic_set(&def_root_domain.refcount, 1);
0586 }
0587
0588 static struct root_domain *alloc_rootdomain(void)
0589 {
0590 struct root_domain *rd;
0591
0592 rd = kzalloc(sizeof(*rd), GFP_KERNEL);
0593 if (!rd)
0594 return NULL;
0595
0596 if (init_rootdomain(rd) != 0) {
0597 kfree(rd);
0598 return NULL;
0599 }
0600
0601 return rd;
0602 }
0603
0604 static void free_sched_groups(struct sched_group *sg, int free_sgc)
0605 {
0606 struct sched_group *tmp, *first;
0607
0608 if (!sg)
0609 return;
0610
0611 first = sg;
0612 do {
0613 tmp = sg->next;
0614
0615 if (free_sgc && atomic_dec_and_test(&sg->sgc->ref))
0616 kfree(sg->sgc);
0617
0618 if (atomic_dec_and_test(&sg->ref))
0619 kfree(sg);
0620 sg = tmp;
0621 } while (sg != first);
0622 }
0623
0624 static void destroy_sched_domain(struct sched_domain *sd)
0625 {
0626
0627
0628
0629
0630
0631 free_sched_groups(sd->groups, 1);
0632
0633 if (sd->shared && atomic_dec_and_test(&sd->shared->ref))
0634 kfree(sd->shared);
0635 kfree(sd);
0636 }
0637
0638 static void destroy_sched_domains_rcu(struct rcu_head *rcu)
0639 {
0640 struct sched_domain *sd = container_of(rcu, struct sched_domain, rcu);
0641
0642 while (sd) {
0643 struct sched_domain *parent = sd->parent;
0644 destroy_sched_domain(sd);
0645 sd = parent;
0646 }
0647 }
0648
0649 static void destroy_sched_domains(struct sched_domain *sd)
0650 {
0651 if (sd)
0652 call_rcu(&sd->rcu, destroy_sched_domains_rcu);
0653 }
0654
0655
0656
0657
0658
0659
0660
0661
0662
0663
0664 DEFINE_PER_CPU(struct sched_domain __rcu *, sd_llc);
0665 DEFINE_PER_CPU(int, sd_llc_size);
0666 DEFINE_PER_CPU(int, sd_llc_id);
0667 DEFINE_PER_CPU(struct sched_domain_shared __rcu *, sd_llc_shared);
0668 DEFINE_PER_CPU(struct sched_domain __rcu *, sd_numa);
0669 DEFINE_PER_CPU(struct sched_domain __rcu *, sd_asym_packing);
0670 DEFINE_PER_CPU(struct sched_domain __rcu *, sd_asym_cpucapacity);
0671 DEFINE_STATIC_KEY_FALSE(sched_asym_cpucapacity);
0672
0673 static void update_top_cache_domain(int cpu)
0674 {
0675 struct sched_domain_shared *sds = NULL;
0676 struct sched_domain *sd;
0677 int id = cpu;
0678 int size = 1;
0679
0680 sd = highest_flag_domain(cpu, SD_SHARE_PKG_RESOURCES);
0681 if (sd) {
0682 id = cpumask_first(sched_domain_span(sd));
0683 size = cpumask_weight(sched_domain_span(sd));
0684 sds = sd->shared;
0685 }
0686
0687 rcu_assign_pointer(per_cpu(sd_llc, cpu), sd);
0688 per_cpu(sd_llc_size, cpu) = size;
0689 per_cpu(sd_llc_id, cpu) = id;
0690 rcu_assign_pointer(per_cpu(sd_llc_shared, cpu), sds);
0691
0692 sd = lowest_flag_domain(cpu, SD_NUMA);
0693 rcu_assign_pointer(per_cpu(sd_numa, cpu), sd);
0694
0695 sd = highest_flag_domain(cpu, SD_ASYM_PACKING);
0696 rcu_assign_pointer(per_cpu(sd_asym_packing, cpu), sd);
0697
0698 sd = lowest_flag_domain(cpu, SD_ASYM_CPUCAPACITY_FULL);
0699 rcu_assign_pointer(per_cpu(sd_asym_cpucapacity, cpu), sd);
0700 }
0701
0702
0703
0704
0705
0706 static void
0707 cpu_attach_domain(struct sched_domain *sd, struct root_domain *rd, int cpu)
0708 {
0709 struct rq *rq = cpu_rq(cpu);
0710 struct sched_domain *tmp;
0711
0712
0713 for (tmp = sd; tmp; ) {
0714 struct sched_domain *parent = tmp->parent;
0715 if (!parent)
0716 break;
0717
0718 if (sd_parent_degenerate(tmp, parent)) {
0719 tmp->parent = parent->parent;
0720 if (parent->parent)
0721 parent->parent->child = tmp;
0722
0723
0724
0725
0726
0727 if (parent->flags & SD_PREFER_SIBLING)
0728 tmp->flags |= SD_PREFER_SIBLING;
0729 destroy_sched_domain(parent);
0730 } else
0731 tmp = tmp->parent;
0732 }
0733
0734 if (sd && sd_degenerate(sd)) {
0735 tmp = sd;
0736 sd = sd->parent;
0737 destroy_sched_domain(tmp);
0738 if (sd) {
0739 struct sched_group *sg = sd->groups;
0740
0741
0742
0743
0744
0745
0746 do {
0747 sg->flags = 0;
0748 } while (sg != sd->groups);
0749
0750 sd->child = NULL;
0751 }
0752 }
0753
0754 sched_domain_debug(sd, cpu);
0755
0756 rq_attach_root(rq, rd);
0757 tmp = rq->sd;
0758 rcu_assign_pointer(rq->sd, sd);
0759 dirty_sched_domain_sysctl(cpu);
0760 destroy_sched_domains(tmp);
0761
0762 update_top_cache_domain(cpu);
0763 }
0764
0765 struct s_data {
0766 struct sched_domain * __percpu *sd;
0767 struct root_domain *rd;
0768 };
0769
0770 enum s_alloc {
0771 sa_rootdomain,
0772 sa_sd,
0773 sa_sd_storage,
0774 sa_none,
0775 };
0776
0777
0778
0779
0780
0781
0782
0783
0784
0785
0786 int group_balance_cpu(struct sched_group *sg)
0787 {
0788 return cpumask_first(group_balance_mask(sg));
0789 }
0790
0791
0792
0793
0794
0795
0796
0797
0798
0799
0800
0801
0802
0803
0804
0805
0806
0807
0808
0809
0810
0811
0812
0813
0814
0815
0816
0817
0818
0819
0820
0821
0822
0823
0824
0825
0826
0827
0828
0829
0830
0831
0832
0833
0834
0835
0836
0837
0838
0839
0840
0841
0842
0843
0844
0845
0846
0847
0848
0849
0850
0851
0852
0853
0854
0855
0856
0857
0858
0859
0860
0861
0862
0863
0864
0865
0866
0867
0868
0869
0870
0871
0872
0873
0874
0875
0876
0877
0878
0879
0880
0881
0882
0883
0884
0885
0886
0887
0888
0889
0890
0891
0892
0893
0894
0895
0896
0897 static void
0898 build_balance_mask(struct sched_domain *sd, struct sched_group *sg, struct cpumask *mask)
0899 {
0900 const struct cpumask *sg_span = sched_group_span(sg);
0901 struct sd_data *sdd = sd->private;
0902 struct sched_domain *sibling;
0903 int i;
0904
0905 cpumask_clear(mask);
0906
0907 for_each_cpu(i, sg_span) {
0908 sibling = *per_cpu_ptr(sdd->sd, i);
0909
0910
0911
0912
0913
0914
0915 if (!sibling->child)
0916 continue;
0917
0918
0919 if (!cpumask_equal(sg_span, sched_domain_span(sibling->child)))
0920 continue;
0921
0922 cpumask_set_cpu(i, mask);
0923 }
0924
0925
0926 WARN_ON_ONCE(cpumask_empty(mask));
0927 }
0928
0929
0930
0931
0932
0933
0934 static struct sched_group *
0935 build_group_from_child_sched_domain(struct sched_domain *sd, int cpu)
0936 {
0937 struct sched_group *sg;
0938 struct cpumask *sg_span;
0939
0940 sg = kzalloc_node(sizeof(struct sched_group) + cpumask_size(),
0941 GFP_KERNEL, cpu_to_node(cpu));
0942
0943 if (!sg)
0944 return NULL;
0945
0946 sg_span = sched_group_span(sg);
0947 if (sd->child) {
0948 cpumask_copy(sg_span, sched_domain_span(sd->child));
0949 sg->flags = sd->child->flags;
0950 } else {
0951 cpumask_copy(sg_span, sched_domain_span(sd));
0952 }
0953
0954 atomic_inc(&sg->ref);
0955 return sg;
0956 }
0957
0958 static void init_overlap_sched_group(struct sched_domain *sd,
0959 struct sched_group *sg)
0960 {
0961 struct cpumask *mask = sched_domains_tmpmask2;
0962 struct sd_data *sdd = sd->private;
0963 struct cpumask *sg_span;
0964 int cpu;
0965
0966 build_balance_mask(sd, sg, mask);
0967 cpu = cpumask_first(mask);
0968
0969 sg->sgc = *per_cpu_ptr(sdd->sgc, cpu);
0970 if (atomic_inc_return(&sg->sgc->ref) == 1)
0971 cpumask_copy(group_balance_mask(sg), mask);
0972 else
0973 WARN_ON_ONCE(!cpumask_equal(group_balance_mask(sg), mask));
0974
0975
0976
0977
0978
0979
0980 sg_span = sched_group_span(sg);
0981 sg->sgc->capacity = SCHED_CAPACITY_SCALE * cpumask_weight(sg_span);
0982 sg->sgc->min_capacity = SCHED_CAPACITY_SCALE;
0983 sg->sgc->max_capacity = SCHED_CAPACITY_SCALE;
0984 }
0985
0986 static struct sched_domain *
0987 find_descended_sibling(struct sched_domain *sd, struct sched_domain *sibling)
0988 {
0989
0990
0991
0992
0993 while (sibling->child &&
0994 !cpumask_subset(sched_domain_span(sibling->child),
0995 sched_domain_span(sd)))
0996 sibling = sibling->child;
0997
0998
0999
1000
1001
1002
1003 while (sibling->child &&
1004 cpumask_equal(sched_domain_span(sibling->child),
1005 sched_domain_span(sibling)))
1006 sibling = sibling->child;
1007
1008 return sibling;
1009 }
1010
1011 static int
1012 build_overlap_sched_groups(struct sched_domain *sd, int cpu)
1013 {
1014 struct sched_group *first = NULL, *last = NULL, *sg;
1015 const struct cpumask *span = sched_domain_span(sd);
1016 struct cpumask *covered = sched_domains_tmpmask;
1017 struct sd_data *sdd = sd->private;
1018 struct sched_domain *sibling;
1019 int i;
1020
1021 cpumask_clear(covered);
1022
1023 for_each_cpu_wrap(i, span, cpu) {
1024 struct cpumask *sg_span;
1025
1026 if (cpumask_test_cpu(i, covered))
1027 continue;
1028
1029 sibling = *per_cpu_ptr(sdd->sd, i);
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041 if (!cpumask_test_cpu(i, sched_domain_span(sibling)))
1042 continue;
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075 if (sibling->child &&
1076 !cpumask_subset(sched_domain_span(sibling->child), span))
1077 sibling = find_descended_sibling(sd, sibling);
1078
1079 sg = build_group_from_child_sched_domain(sibling, cpu);
1080 if (!sg)
1081 goto fail;
1082
1083 sg_span = sched_group_span(sg);
1084 cpumask_or(covered, covered, sg_span);
1085
1086 init_overlap_sched_group(sibling, sg);
1087
1088 if (!first)
1089 first = sg;
1090 if (last)
1091 last->next = sg;
1092 last = sg;
1093 last->next = first;
1094 }
1095 sd->groups = first;
1096
1097 return 0;
1098
1099 fail:
1100 free_sched_groups(first, 0);
1101
1102 return -ENOMEM;
1103 }
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177 static struct sched_group *get_group(int cpu, struct sd_data *sdd)
1178 {
1179 struct sched_domain *sd = *per_cpu_ptr(sdd->sd, cpu);
1180 struct sched_domain *child = sd->child;
1181 struct sched_group *sg;
1182 bool already_visited;
1183
1184 if (child)
1185 cpu = cpumask_first(sched_domain_span(child));
1186
1187 sg = *per_cpu_ptr(sdd->sg, cpu);
1188 sg->sgc = *per_cpu_ptr(sdd->sgc, cpu);
1189
1190
1191 already_visited = atomic_inc_return(&sg->ref) > 1;
1192
1193 WARN_ON(already_visited != (atomic_inc_return(&sg->sgc->ref) > 1));
1194
1195
1196 if (already_visited)
1197 return sg;
1198
1199 if (child) {
1200 cpumask_copy(sched_group_span(sg), sched_domain_span(child));
1201 cpumask_copy(group_balance_mask(sg), sched_group_span(sg));
1202 sg->flags = child->flags;
1203 } else {
1204 cpumask_set_cpu(cpu, sched_group_span(sg));
1205 cpumask_set_cpu(cpu, group_balance_mask(sg));
1206 }
1207
1208 sg->sgc->capacity = SCHED_CAPACITY_SCALE * cpumask_weight(sched_group_span(sg));
1209 sg->sgc->min_capacity = SCHED_CAPACITY_SCALE;
1210 sg->sgc->max_capacity = SCHED_CAPACITY_SCALE;
1211
1212 return sg;
1213 }
1214
1215
1216
1217
1218
1219
1220
1221
1222 static int
1223 build_sched_groups(struct sched_domain *sd, int cpu)
1224 {
1225 struct sched_group *first = NULL, *last = NULL;
1226 struct sd_data *sdd = sd->private;
1227 const struct cpumask *span = sched_domain_span(sd);
1228 struct cpumask *covered;
1229 int i;
1230
1231 lockdep_assert_held(&sched_domains_mutex);
1232 covered = sched_domains_tmpmask;
1233
1234 cpumask_clear(covered);
1235
1236 for_each_cpu_wrap(i, span, cpu) {
1237 struct sched_group *sg;
1238
1239 if (cpumask_test_cpu(i, covered))
1240 continue;
1241
1242 sg = get_group(i, sdd);
1243
1244 cpumask_or(covered, covered, sched_group_span(sg));
1245
1246 if (!first)
1247 first = sg;
1248 if (last)
1249 last->next = sg;
1250 last = sg;
1251 }
1252 last->next = first;
1253 sd->groups = first;
1254
1255 return 0;
1256 }
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268 static void init_sched_groups_capacity(int cpu, struct sched_domain *sd)
1269 {
1270 struct sched_group *sg = sd->groups;
1271
1272 WARN_ON(!sg);
1273
1274 do {
1275 int cpu, max_cpu = -1;
1276
1277 sg->group_weight = cpumask_weight(sched_group_span(sg));
1278
1279 if (!(sd->flags & SD_ASYM_PACKING))
1280 goto next;
1281
1282 for_each_cpu(cpu, sched_group_span(sg)) {
1283 if (max_cpu < 0)
1284 max_cpu = cpu;
1285 else if (sched_asym_prefer(cpu, max_cpu))
1286 max_cpu = cpu;
1287 }
1288 sg->asym_prefer_cpu = max_cpu;
1289
1290 next:
1291 sg = sg->next;
1292 } while (sg != sd->groups);
1293
1294 if (cpu != group_balance_cpu(sg))
1295 return;
1296
1297 update_group_capacity(sd, cpu);
1298 }
1299
1300
1301
1302
1303 struct asym_cap_data {
1304 struct list_head link;
1305 unsigned long capacity;
1306 unsigned long cpus[];
1307 };
1308
1309
1310
1311
1312
1313
1314
1315 static LIST_HEAD(asym_cap_list);
1316
1317 #define cpu_capacity_span(asym_data) to_cpumask((asym_data)->cpus)
1318
1319
1320
1321
1322
1323 static inline int
1324 asym_cpu_capacity_classify(const struct cpumask *sd_span,
1325 const struct cpumask *cpu_map)
1326 {
1327 struct asym_cap_data *entry;
1328 int count = 0, miss = 0;
1329
1330
1331
1332
1333
1334
1335
1336 list_for_each_entry(entry, &asym_cap_list, link) {
1337 if (cpumask_intersects(sd_span, cpu_capacity_span(entry)))
1338 ++count;
1339 else if (cpumask_intersects(cpu_map, cpu_capacity_span(entry)))
1340 ++miss;
1341 }
1342
1343 WARN_ON_ONCE(!count && !list_empty(&asym_cap_list));
1344
1345
1346 if (count < 2)
1347 return 0;
1348
1349 if (miss)
1350 return SD_ASYM_CPUCAPACITY;
1351
1352
1353 return SD_ASYM_CPUCAPACITY | SD_ASYM_CPUCAPACITY_FULL;
1354
1355 }
1356
1357 static inline void asym_cpu_capacity_update_data(int cpu)
1358 {
1359 unsigned long capacity = arch_scale_cpu_capacity(cpu);
1360 struct asym_cap_data *entry = NULL;
1361
1362 list_for_each_entry(entry, &asym_cap_list, link) {
1363 if (capacity == entry->capacity)
1364 goto done;
1365 }
1366
1367 entry = kzalloc(sizeof(*entry) + cpumask_size(), GFP_KERNEL);
1368 if (WARN_ONCE(!entry, "Failed to allocate memory for asymmetry data\n"))
1369 return;
1370 entry->capacity = capacity;
1371 list_add(&entry->link, &asym_cap_list);
1372 done:
1373 __cpumask_set_cpu(cpu, cpu_capacity_span(entry));
1374 }
1375
1376
1377
1378
1379
1380
1381 static void asym_cpu_capacity_scan(void)
1382 {
1383 struct asym_cap_data *entry, *next;
1384 int cpu;
1385
1386 list_for_each_entry(entry, &asym_cap_list, link)
1387 cpumask_clear(cpu_capacity_span(entry));
1388
1389 for_each_cpu_and(cpu, cpu_possible_mask, housekeeping_cpumask(HK_TYPE_DOMAIN))
1390 asym_cpu_capacity_update_data(cpu);
1391
1392 list_for_each_entry_safe(entry, next, &asym_cap_list, link) {
1393 if (cpumask_empty(cpu_capacity_span(entry))) {
1394 list_del(&entry->link);
1395 kfree(entry);
1396 }
1397 }
1398
1399
1400
1401
1402
1403 if (list_is_singular(&asym_cap_list)) {
1404 entry = list_first_entry(&asym_cap_list, typeof(*entry), link);
1405 list_del(&entry->link);
1406 kfree(entry);
1407 }
1408 }
1409
1410
1411
1412
1413
1414
1415 static int default_relax_domain_level = -1;
1416 int sched_domain_level_max;
1417
1418 static int __init setup_relax_domain_level(char *str)
1419 {
1420 if (kstrtoint(str, 0, &default_relax_domain_level))
1421 pr_warn("Unable to set relax_domain_level\n");
1422
1423 return 1;
1424 }
1425 __setup("relax_domain_level=", setup_relax_domain_level);
1426
1427 static void set_domain_attribute(struct sched_domain *sd,
1428 struct sched_domain_attr *attr)
1429 {
1430 int request;
1431
1432 if (!attr || attr->relax_domain_level < 0) {
1433 if (default_relax_domain_level < 0)
1434 return;
1435 request = default_relax_domain_level;
1436 } else
1437 request = attr->relax_domain_level;
1438
1439 if (sd->level > request) {
1440
1441 sd->flags &= ~(SD_BALANCE_WAKE|SD_BALANCE_NEWIDLE);
1442 }
1443 }
1444
1445 static void __sdt_free(const struct cpumask *cpu_map);
1446 static int __sdt_alloc(const struct cpumask *cpu_map);
1447
1448 static void __free_domain_allocs(struct s_data *d, enum s_alloc what,
1449 const struct cpumask *cpu_map)
1450 {
1451 switch (what) {
1452 case sa_rootdomain:
1453 if (!atomic_read(&d->rd->refcount))
1454 free_rootdomain(&d->rd->rcu);
1455 fallthrough;
1456 case sa_sd:
1457 free_percpu(d->sd);
1458 fallthrough;
1459 case sa_sd_storage:
1460 __sdt_free(cpu_map);
1461 fallthrough;
1462 case sa_none:
1463 break;
1464 }
1465 }
1466
1467 static enum s_alloc
1468 __visit_domain_allocation_hell(struct s_data *d, const struct cpumask *cpu_map)
1469 {
1470 memset(d, 0, sizeof(*d));
1471
1472 if (__sdt_alloc(cpu_map))
1473 return sa_sd_storage;
1474 d->sd = alloc_percpu(struct sched_domain *);
1475 if (!d->sd)
1476 return sa_sd_storage;
1477 d->rd = alloc_rootdomain();
1478 if (!d->rd)
1479 return sa_sd;
1480
1481 return sa_rootdomain;
1482 }
1483
1484
1485
1486
1487
1488
1489 static void claim_allocations(int cpu, struct sched_domain *sd)
1490 {
1491 struct sd_data *sdd = sd->private;
1492
1493 WARN_ON_ONCE(*per_cpu_ptr(sdd->sd, cpu) != sd);
1494 *per_cpu_ptr(sdd->sd, cpu) = NULL;
1495
1496 if (atomic_read(&(*per_cpu_ptr(sdd->sds, cpu))->ref))
1497 *per_cpu_ptr(sdd->sds, cpu) = NULL;
1498
1499 if (atomic_read(&(*per_cpu_ptr(sdd->sg, cpu))->ref))
1500 *per_cpu_ptr(sdd->sg, cpu) = NULL;
1501
1502 if (atomic_read(&(*per_cpu_ptr(sdd->sgc, cpu))->ref))
1503 *per_cpu_ptr(sdd->sgc, cpu) = NULL;
1504 }
1505
1506 #ifdef CONFIG_NUMA
1507 enum numa_topology_type sched_numa_topology_type;
1508
1509 static int sched_domains_numa_levels;
1510 static int sched_domains_curr_level;
1511
1512 int sched_max_numa_distance;
1513 static int *sched_domains_numa_distance;
1514 static struct cpumask ***sched_domains_numa_masks;
1515 #endif
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533 #define TOPOLOGY_SD_FLAGS \
1534 (SD_SHARE_CPUCAPACITY | \
1535 SD_SHARE_PKG_RESOURCES | \
1536 SD_NUMA | \
1537 SD_ASYM_PACKING)
1538
1539 static struct sched_domain *
1540 sd_init(struct sched_domain_topology_level *tl,
1541 const struct cpumask *cpu_map,
1542 struct sched_domain *child, int cpu)
1543 {
1544 struct sd_data *sdd = &tl->data;
1545 struct sched_domain *sd = *per_cpu_ptr(sdd->sd, cpu);
1546 int sd_id, sd_weight, sd_flags = 0;
1547 struct cpumask *sd_span;
1548
1549 #ifdef CONFIG_NUMA
1550
1551
1552
1553 sched_domains_curr_level = tl->numa_level;
1554 #endif
1555
1556 sd_weight = cpumask_weight(tl->mask(cpu));
1557
1558 if (tl->sd_flags)
1559 sd_flags = (*tl->sd_flags)();
1560 if (WARN_ONCE(sd_flags & ~TOPOLOGY_SD_FLAGS,
1561 "wrong sd_flags in topology description\n"))
1562 sd_flags &= TOPOLOGY_SD_FLAGS;
1563
1564 *sd = (struct sched_domain){
1565 .min_interval = sd_weight,
1566 .max_interval = 2*sd_weight,
1567 .busy_factor = 16,
1568 .imbalance_pct = 117,
1569
1570 .cache_nice_tries = 0,
1571
1572 .flags = 1*SD_BALANCE_NEWIDLE
1573 | 1*SD_BALANCE_EXEC
1574 | 1*SD_BALANCE_FORK
1575 | 0*SD_BALANCE_WAKE
1576 | 1*SD_WAKE_AFFINE
1577 | 0*SD_SHARE_CPUCAPACITY
1578 | 0*SD_SHARE_PKG_RESOURCES
1579 | 0*SD_SERIALIZE
1580 | 1*SD_PREFER_SIBLING
1581 | 0*SD_NUMA
1582 | sd_flags
1583 ,
1584
1585 .last_balance = jiffies,
1586 .balance_interval = sd_weight,
1587 .max_newidle_lb_cost = 0,
1588 .last_decay_max_lb_cost = jiffies,
1589 .child = child,
1590 #ifdef CONFIG_SCHED_DEBUG
1591 .name = tl->name,
1592 #endif
1593 };
1594
1595 sd_span = sched_domain_span(sd);
1596 cpumask_and(sd_span, cpu_map, tl->mask(cpu));
1597 sd_id = cpumask_first(sd_span);
1598
1599 sd->flags |= asym_cpu_capacity_classify(sd_span, cpu_map);
1600
1601 WARN_ONCE((sd->flags & (SD_SHARE_CPUCAPACITY | SD_ASYM_CPUCAPACITY)) ==
1602 (SD_SHARE_CPUCAPACITY | SD_ASYM_CPUCAPACITY),
1603 "CPU capacity asymmetry not supported on SMT\n");
1604
1605
1606
1607
1608
1609 if ((sd->flags & SD_ASYM_CPUCAPACITY) && sd->child)
1610 sd->child->flags &= ~SD_PREFER_SIBLING;
1611
1612 if (sd->flags & SD_SHARE_CPUCAPACITY) {
1613 sd->imbalance_pct = 110;
1614
1615 } else if (sd->flags & SD_SHARE_PKG_RESOURCES) {
1616 sd->imbalance_pct = 117;
1617 sd->cache_nice_tries = 1;
1618
1619 #ifdef CONFIG_NUMA
1620 } else if (sd->flags & SD_NUMA) {
1621 sd->cache_nice_tries = 2;
1622
1623 sd->flags &= ~SD_PREFER_SIBLING;
1624 sd->flags |= SD_SERIALIZE;
1625 if (sched_domains_numa_distance[tl->numa_level] > node_reclaim_distance) {
1626 sd->flags &= ~(SD_BALANCE_EXEC |
1627 SD_BALANCE_FORK |
1628 SD_WAKE_AFFINE);
1629 }
1630
1631 #endif
1632 } else {
1633 sd->cache_nice_tries = 1;
1634 }
1635
1636
1637
1638
1639
1640 if (sd->flags & SD_SHARE_PKG_RESOURCES) {
1641 sd->shared = *per_cpu_ptr(sdd->sds, sd_id);
1642 atomic_inc(&sd->shared->ref);
1643 atomic_set(&sd->shared->nr_busy_cpus, sd_weight);
1644 }
1645
1646 sd->private = sdd;
1647
1648 return sd;
1649 }
1650
1651
1652
1653
1654 static struct sched_domain_topology_level default_topology[] = {
1655 #ifdef CONFIG_SCHED_SMT
1656 { cpu_smt_mask, cpu_smt_flags, SD_INIT_NAME(SMT) },
1657 #endif
1658
1659 #ifdef CONFIG_SCHED_CLUSTER
1660 { cpu_clustergroup_mask, cpu_cluster_flags, SD_INIT_NAME(CLS) },
1661 #endif
1662
1663 #ifdef CONFIG_SCHED_MC
1664 { cpu_coregroup_mask, cpu_core_flags, SD_INIT_NAME(MC) },
1665 #endif
1666 { cpu_cpu_mask, SD_INIT_NAME(DIE) },
1667 { NULL, },
1668 };
1669
1670 static struct sched_domain_topology_level *sched_domain_topology =
1671 default_topology;
1672 static struct sched_domain_topology_level *sched_domain_topology_saved;
1673
1674 #define for_each_sd_topology(tl) \
1675 for (tl = sched_domain_topology; tl->mask; tl++)
1676
1677 void set_sched_topology(struct sched_domain_topology_level *tl)
1678 {
1679 if (WARN_ON_ONCE(sched_smp_initialized))
1680 return;
1681
1682 sched_domain_topology = tl;
1683 sched_domain_topology_saved = NULL;
1684 }
1685
1686 #ifdef CONFIG_NUMA
1687
1688 static const struct cpumask *sd_numa_mask(int cpu)
1689 {
1690 return sched_domains_numa_masks[sched_domains_curr_level][cpu_to_node(cpu)];
1691 }
1692
1693 static void sched_numa_warn(const char *str)
1694 {
1695 static int done = false;
1696 int i,j;
1697
1698 if (done)
1699 return;
1700
1701 done = true;
1702
1703 printk(KERN_WARNING "ERROR: %s\n\n", str);
1704
1705 for (i = 0; i < nr_node_ids; i++) {
1706 printk(KERN_WARNING " ");
1707 for (j = 0; j < nr_node_ids; j++) {
1708 if (!node_state(i, N_CPU) || !node_state(j, N_CPU))
1709 printk(KERN_CONT "(%02d) ", node_distance(i,j));
1710 else
1711 printk(KERN_CONT " %02d ", node_distance(i,j));
1712 }
1713 printk(KERN_CONT "\n");
1714 }
1715 printk(KERN_WARNING "\n");
1716 }
1717
1718 bool find_numa_distance(int distance)
1719 {
1720 bool found = false;
1721 int i, *distances;
1722
1723 if (distance == node_distance(0, 0))
1724 return true;
1725
1726 rcu_read_lock();
1727 distances = rcu_dereference(sched_domains_numa_distance);
1728 if (!distances)
1729 goto unlock;
1730 for (i = 0; i < sched_domains_numa_levels; i++) {
1731 if (distances[i] == distance) {
1732 found = true;
1733 break;
1734 }
1735 }
1736 unlock:
1737 rcu_read_unlock();
1738
1739 return found;
1740 }
1741
1742 #define for_each_cpu_node_but(n, nbut) \
1743 for_each_node_state(n, N_CPU) \
1744 if (n == nbut) \
1745 continue; \
1746 else
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767 static void init_numa_topology_type(int offline_node)
1768 {
1769 int a, b, c, n;
1770
1771 n = sched_max_numa_distance;
1772
1773 if (sched_domains_numa_levels <= 2) {
1774 sched_numa_topology_type = NUMA_DIRECT;
1775 return;
1776 }
1777
1778 for_each_cpu_node_but(a, offline_node) {
1779 for_each_cpu_node_but(b, offline_node) {
1780
1781 if (node_distance(a, b) < n)
1782 continue;
1783
1784
1785 for_each_cpu_node_but(c, offline_node) {
1786 if (node_distance(a, c) < n &&
1787 node_distance(b, c) < n) {
1788 sched_numa_topology_type =
1789 NUMA_GLUELESS_MESH;
1790 return;
1791 }
1792 }
1793
1794 sched_numa_topology_type = NUMA_BACKPLANE;
1795 return;
1796 }
1797 }
1798
1799 pr_err("Failed to find a NUMA topology type, defaulting to DIRECT\n");
1800 sched_numa_topology_type = NUMA_DIRECT;
1801 }
1802
1803
1804 #define NR_DISTANCE_VALUES (1 << DISTANCE_BITS)
1805
1806 void sched_init_numa(int offline_node)
1807 {
1808 struct sched_domain_topology_level *tl;
1809 unsigned long *distance_map;
1810 int nr_levels = 0;
1811 int i, j;
1812 int *distances;
1813 struct cpumask ***masks;
1814
1815
1816
1817
1818
1819 distance_map = bitmap_alloc(NR_DISTANCE_VALUES, GFP_KERNEL);
1820 if (!distance_map)
1821 return;
1822
1823 bitmap_zero(distance_map, NR_DISTANCE_VALUES);
1824 for_each_cpu_node_but(i, offline_node) {
1825 for_each_cpu_node_but(j, offline_node) {
1826 int distance = node_distance(i, j);
1827
1828 if (distance < LOCAL_DISTANCE || distance >= NR_DISTANCE_VALUES) {
1829 sched_numa_warn("Invalid distance value range");
1830 bitmap_free(distance_map);
1831 return;
1832 }
1833
1834 bitmap_set(distance_map, distance, 1);
1835 }
1836 }
1837
1838
1839
1840
1841 nr_levels = bitmap_weight(distance_map, NR_DISTANCE_VALUES);
1842
1843 distances = kcalloc(nr_levels, sizeof(int), GFP_KERNEL);
1844 if (!distances) {
1845 bitmap_free(distance_map);
1846 return;
1847 }
1848
1849 for (i = 0, j = 0; i < nr_levels; i++, j++) {
1850 j = find_next_bit(distance_map, NR_DISTANCE_VALUES, j);
1851 distances[i] = j;
1852 }
1853 rcu_assign_pointer(sched_domains_numa_distance, distances);
1854
1855 bitmap_free(distance_map);
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873 sched_domains_numa_levels = 0;
1874
1875 masks = kzalloc(sizeof(void *) * nr_levels, GFP_KERNEL);
1876 if (!masks)
1877 return;
1878
1879
1880
1881
1882
1883 for (i = 0; i < nr_levels; i++) {
1884 masks[i] = kzalloc(nr_node_ids * sizeof(void *), GFP_KERNEL);
1885 if (!masks[i])
1886 return;
1887
1888 for_each_cpu_node_but(j, offline_node) {
1889 struct cpumask *mask = kzalloc(cpumask_size(), GFP_KERNEL);
1890 int k;
1891
1892 if (!mask)
1893 return;
1894
1895 masks[i][j] = mask;
1896
1897 for_each_cpu_node_but(k, offline_node) {
1898 if (sched_debug() && (node_distance(j, k) != node_distance(k, j)))
1899 sched_numa_warn("Node-distance not symmetric");
1900
1901 if (node_distance(j, k) > sched_domains_numa_distance[i])
1902 continue;
1903
1904 cpumask_or(mask, mask, cpumask_of_node(k));
1905 }
1906 }
1907 }
1908 rcu_assign_pointer(sched_domains_numa_masks, masks);
1909
1910
1911 for (i = 0; sched_domain_topology[i].mask; i++);
1912
1913 tl = kzalloc((i + nr_levels + 1) *
1914 sizeof(struct sched_domain_topology_level), GFP_KERNEL);
1915 if (!tl)
1916 return;
1917
1918
1919
1920
1921 for (i = 0; sched_domain_topology[i].mask; i++)
1922 tl[i] = sched_domain_topology[i];
1923
1924
1925
1926
1927 tl[i++] = (struct sched_domain_topology_level){
1928 .mask = sd_numa_mask,
1929 .numa_level = 0,
1930 SD_INIT_NAME(NODE)
1931 };
1932
1933
1934
1935
1936 for (j = 1; j < nr_levels; i++, j++) {
1937 tl[i] = (struct sched_domain_topology_level){
1938 .mask = sd_numa_mask,
1939 .sd_flags = cpu_numa_flags,
1940 .flags = SDTL_OVERLAP,
1941 .numa_level = j,
1942 SD_INIT_NAME(NUMA)
1943 };
1944 }
1945
1946 sched_domain_topology_saved = sched_domain_topology;
1947 sched_domain_topology = tl;
1948
1949 sched_domains_numa_levels = nr_levels;
1950 WRITE_ONCE(sched_max_numa_distance, sched_domains_numa_distance[nr_levels - 1]);
1951
1952 init_numa_topology_type(offline_node);
1953 }
1954
1955
1956 static void sched_reset_numa(void)
1957 {
1958 int nr_levels, *distances;
1959 struct cpumask ***masks;
1960
1961 nr_levels = sched_domains_numa_levels;
1962 sched_domains_numa_levels = 0;
1963 sched_max_numa_distance = 0;
1964 sched_numa_topology_type = NUMA_DIRECT;
1965 distances = sched_domains_numa_distance;
1966 rcu_assign_pointer(sched_domains_numa_distance, NULL);
1967 masks = sched_domains_numa_masks;
1968 rcu_assign_pointer(sched_domains_numa_masks, NULL);
1969 if (distances || masks) {
1970 int i, j;
1971
1972 synchronize_rcu();
1973 kfree(distances);
1974 for (i = 0; i < nr_levels && masks; i++) {
1975 if (!masks[i])
1976 continue;
1977 for_each_node(j)
1978 kfree(masks[i][j]);
1979 kfree(masks[i]);
1980 }
1981 kfree(masks);
1982 }
1983 if (sched_domain_topology_saved) {
1984 kfree(sched_domain_topology);
1985 sched_domain_topology = sched_domain_topology_saved;
1986 sched_domain_topology_saved = NULL;
1987 }
1988 }
1989
1990
1991
1992
1993 void sched_update_numa(int cpu, bool online)
1994 {
1995 int node;
1996
1997 node = cpu_to_node(cpu);
1998
1999
2000
2001
2002 if (cpumask_weight(cpumask_of_node(node)) != 1)
2003 return;
2004
2005 sched_reset_numa();
2006 sched_init_numa(online ? NUMA_NO_NODE : node);
2007 }
2008
2009 void sched_domains_numa_masks_set(unsigned int cpu)
2010 {
2011 int node = cpu_to_node(cpu);
2012 int i, j;
2013
2014 for (i = 0; i < sched_domains_numa_levels; i++) {
2015 for (j = 0; j < nr_node_ids; j++) {
2016 if (!node_state(j, N_CPU))
2017 continue;
2018
2019
2020 if (node_distance(j, node) <= sched_domains_numa_distance[i])
2021 cpumask_set_cpu(cpu, sched_domains_numa_masks[i][j]);
2022 }
2023 }
2024 }
2025
2026 void sched_domains_numa_masks_clear(unsigned int cpu)
2027 {
2028 int i, j;
2029
2030 for (i = 0; i < sched_domains_numa_levels; i++) {
2031 for (j = 0; j < nr_node_ids; j++) {
2032 if (sched_domains_numa_masks[i][j])
2033 cpumask_clear_cpu(cpu, sched_domains_numa_masks[i][j]);
2034 }
2035 }
2036 }
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046 int sched_numa_find_closest(const struct cpumask *cpus, int cpu)
2047 {
2048 int i, j = cpu_to_node(cpu), found = nr_cpu_ids;
2049 struct cpumask ***masks;
2050
2051 rcu_read_lock();
2052 masks = rcu_dereference(sched_domains_numa_masks);
2053 if (!masks)
2054 goto unlock;
2055 for (i = 0; i < sched_domains_numa_levels; i++) {
2056 if (!masks[i][j])
2057 break;
2058 cpu = cpumask_any_and(cpus, masks[i][j]);
2059 if (cpu < nr_cpu_ids) {
2060 found = cpu;
2061 break;
2062 }
2063 }
2064 unlock:
2065 rcu_read_unlock();
2066
2067 return found;
2068 }
2069
2070 #endif
2071
2072 static int __sdt_alloc(const struct cpumask *cpu_map)
2073 {
2074 struct sched_domain_topology_level *tl;
2075 int j;
2076
2077 for_each_sd_topology(tl) {
2078 struct sd_data *sdd = &tl->data;
2079
2080 sdd->sd = alloc_percpu(struct sched_domain *);
2081 if (!sdd->sd)
2082 return -ENOMEM;
2083
2084 sdd->sds = alloc_percpu(struct sched_domain_shared *);
2085 if (!sdd->sds)
2086 return -ENOMEM;
2087
2088 sdd->sg = alloc_percpu(struct sched_group *);
2089 if (!sdd->sg)
2090 return -ENOMEM;
2091
2092 sdd->sgc = alloc_percpu(struct sched_group_capacity *);
2093 if (!sdd->sgc)
2094 return -ENOMEM;
2095
2096 for_each_cpu(j, cpu_map) {
2097 struct sched_domain *sd;
2098 struct sched_domain_shared *sds;
2099 struct sched_group *sg;
2100 struct sched_group_capacity *sgc;
2101
2102 sd = kzalloc_node(sizeof(struct sched_domain) + cpumask_size(),
2103 GFP_KERNEL, cpu_to_node(j));
2104 if (!sd)
2105 return -ENOMEM;
2106
2107 *per_cpu_ptr(sdd->sd, j) = sd;
2108
2109 sds = kzalloc_node(sizeof(struct sched_domain_shared),
2110 GFP_KERNEL, cpu_to_node(j));
2111 if (!sds)
2112 return -ENOMEM;
2113
2114 *per_cpu_ptr(sdd->sds, j) = sds;
2115
2116 sg = kzalloc_node(sizeof(struct sched_group) + cpumask_size(),
2117 GFP_KERNEL, cpu_to_node(j));
2118 if (!sg)
2119 return -ENOMEM;
2120
2121 sg->next = sg;
2122
2123 *per_cpu_ptr(sdd->sg, j) = sg;
2124
2125 sgc = kzalloc_node(sizeof(struct sched_group_capacity) + cpumask_size(),
2126 GFP_KERNEL, cpu_to_node(j));
2127 if (!sgc)
2128 return -ENOMEM;
2129
2130 #ifdef CONFIG_SCHED_DEBUG
2131 sgc->id = j;
2132 #endif
2133
2134 *per_cpu_ptr(sdd->sgc, j) = sgc;
2135 }
2136 }
2137
2138 return 0;
2139 }
2140
2141 static void __sdt_free(const struct cpumask *cpu_map)
2142 {
2143 struct sched_domain_topology_level *tl;
2144 int j;
2145
2146 for_each_sd_topology(tl) {
2147 struct sd_data *sdd = &tl->data;
2148
2149 for_each_cpu(j, cpu_map) {
2150 struct sched_domain *sd;
2151
2152 if (sdd->sd) {
2153 sd = *per_cpu_ptr(sdd->sd, j);
2154 if (sd && (sd->flags & SD_OVERLAP))
2155 free_sched_groups(sd->groups, 0);
2156 kfree(*per_cpu_ptr(sdd->sd, j));
2157 }
2158
2159 if (sdd->sds)
2160 kfree(*per_cpu_ptr(sdd->sds, j));
2161 if (sdd->sg)
2162 kfree(*per_cpu_ptr(sdd->sg, j));
2163 if (sdd->sgc)
2164 kfree(*per_cpu_ptr(sdd->sgc, j));
2165 }
2166 free_percpu(sdd->sd);
2167 sdd->sd = NULL;
2168 free_percpu(sdd->sds);
2169 sdd->sds = NULL;
2170 free_percpu(sdd->sg);
2171 sdd->sg = NULL;
2172 free_percpu(sdd->sgc);
2173 sdd->sgc = NULL;
2174 }
2175 }
2176
2177 static struct sched_domain *build_sched_domain(struct sched_domain_topology_level *tl,
2178 const struct cpumask *cpu_map, struct sched_domain_attr *attr,
2179 struct sched_domain *child, int cpu)
2180 {
2181 struct sched_domain *sd = sd_init(tl, cpu_map, child, cpu);
2182
2183 if (child) {
2184 sd->level = child->level + 1;
2185 sched_domain_level_max = max(sched_domain_level_max, sd->level);
2186 child->parent = sd;
2187
2188 if (!cpumask_subset(sched_domain_span(child),
2189 sched_domain_span(sd))) {
2190 pr_err("BUG: arch topology borken\n");
2191 #ifdef CONFIG_SCHED_DEBUG
2192 pr_err(" the %s domain not a subset of the %s domain\n",
2193 child->name, sd->name);
2194 #endif
2195
2196 cpumask_or(sched_domain_span(sd),
2197 sched_domain_span(sd),
2198 sched_domain_span(child));
2199 }
2200
2201 }
2202 set_domain_attribute(sd, attr);
2203
2204 return sd;
2205 }
2206
2207
2208
2209
2210
2211 static bool topology_span_sane(struct sched_domain_topology_level *tl,
2212 const struct cpumask *cpu_map, int cpu)
2213 {
2214 int i;
2215
2216
2217 if (tl->flags & SDTL_OVERLAP)
2218 return true;
2219
2220
2221
2222
2223
2224
2225
2226 for_each_cpu(i, cpu_map) {
2227 if (i == cpu)
2228 continue;
2229
2230
2231
2232
2233
2234
2235 if (!cpumask_equal(tl->mask(cpu), tl->mask(i)) &&
2236 cpumask_intersects(tl->mask(cpu), tl->mask(i)))
2237 return false;
2238 }
2239
2240 return true;
2241 }
2242
2243
2244
2245
2246
2247 static int
2248 build_sched_domains(const struct cpumask *cpu_map, struct sched_domain_attr *attr)
2249 {
2250 enum s_alloc alloc_state = sa_none;
2251 struct sched_domain *sd;
2252 struct s_data d;
2253 struct rq *rq = NULL;
2254 int i, ret = -ENOMEM;
2255 bool has_asym = false;
2256
2257 if (WARN_ON(cpumask_empty(cpu_map)))
2258 goto error;
2259
2260 alloc_state = __visit_domain_allocation_hell(&d, cpu_map);
2261 if (alloc_state != sa_rootdomain)
2262 goto error;
2263
2264
2265 for_each_cpu(i, cpu_map) {
2266 struct sched_domain_topology_level *tl;
2267
2268 sd = NULL;
2269 for_each_sd_topology(tl) {
2270
2271 if (WARN_ON(!topology_span_sane(tl, cpu_map, i)))
2272 goto error;
2273
2274 sd = build_sched_domain(tl, cpu_map, attr, sd, i);
2275
2276 has_asym |= sd->flags & SD_ASYM_CPUCAPACITY;
2277
2278 if (tl == sched_domain_topology)
2279 *per_cpu_ptr(d.sd, i) = sd;
2280 if (tl->flags & SDTL_OVERLAP)
2281 sd->flags |= SD_OVERLAP;
2282 if (cpumask_equal(cpu_map, sched_domain_span(sd)))
2283 break;
2284 }
2285 }
2286
2287
2288 for_each_cpu(i, cpu_map) {
2289 for (sd = *per_cpu_ptr(d.sd, i); sd; sd = sd->parent) {
2290 sd->span_weight = cpumask_weight(sched_domain_span(sd));
2291 if (sd->flags & SD_OVERLAP) {
2292 if (build_overlap_sched_groups(sd, i))
2293 goto error;
2294 } else {
2295 if (build_sched_groups(sd, i))
2296 goto error;
2297 }
2298 }
2299 }
2300
2301
2302
2303
2304
2305 for_each_cpu(i, cpu_map) {
2306 unsigned int imb = 0;
2307 unsigned int imb_span = 1;
2308
2309 for (sd = *per_cpu_ptr(d.sd, i); sd; sd = sd->parent) {
2310 struct sched_domain *child = sd->child;
2311
2312 if (!(sd->flags & SD_SHARE_PKG_RESOURCES) && child &&
2313 (child->flags & SD_SHARE_PKG_RESOURCES)) {
2314 struct sched_domain __rcu *top_p;
2315 unsigned int nr_llcs;
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337 nr_llcs = sd->span_weight / child->span_weight;
2338 if (nr_llcs == 1)
2339 imb = sd->span_weight >> 3;
2340 else
2341 imb = nr_llcs;
2342 imb = max(1U, imb);
2343 sd->imb_numa_nr = imb;
2344
2345
2346 top_p = sd->parent;
2347 while (top_p && !(top_p->flags & SD_NUMA)) {
2348 top_p = top_p->parent;
2349 }
2350 imb_span = top_p ? top_p->span_weight : sd->span_weight;
2351 } else {
2352 int factor = max(1U, (sd->span_weight / imb_span));
2353
2354 sd->imb_numa_nr = imb * factor;
2355 }
2356 }
2357 }
2358
2359
2360 for (i = nr_cpumask_bits-1; i >= 0; i--) {
2361 if (!cpumask_test_cpu(i, cpu_map))
2362 continue;
2363
2364 for (sd = *per_cpu_ptr(d.sd, i); sd; sd = sd->parent) {
2365 claim_allocations(i, sd);
2366 init_sched_groups_capacity(i, sd);
2367 }
2368 }
2369
2370
2371 rcu_read_lock();
2372 for_each_cpu(i, cpu_map) {
2373 rq = cpu_rq(i);
2374 sd = *per_cpu_ptr(d.sd, i);
2375
2376
2377 if (rq->cpu_capacity_orig > READ_ONCE(d.rd->max_cpu_capacity))
2378 WRITE_ONCE(d.rd->max_cpu_capacity, rq->cpu_capacity_orig);
2379
2380 cpu_attach_domain(sd, d.rd, i);
2381 }
2382 rcu_read_unlock();
2383
2384 if (has_asym)
2385 static_branch_inc_cpuslocked(&sched_asym_cpucapacity);
2386
2387 if (rq && sched_debug_verbose) {
2388 pr_info("root domain span: %*pbl (max cpu_capacity = %lu)\n",
2389 cpumask_pr_args(cpu_map), rq->rd->max_cpu_capacity);
2390 }
2391
2392 ret = 0;
2393 error:
2394 __free_domain_allocs(&d, alloc_state, cpu_map);
2395
2396 return ret;
2397 }
2398
2399
2400 static cpumask_var_t *doms_cur;
2401
2402
2403 static int ndoms_cur;
2404
2405
2406 static struct sched_domain_attr *dattr_cur;
2407
2408
2409
2410
2411
2412
2413 static cpumask_var_t fallback_doms;
2414
2415
2416
2417
2418
2419
2420 int __weak arch_update_cpu_topology(void)
2421 {
2422 return 0;
2423 }
2424
2425 cpumask_var_t *alloc_sched_domains(unsigned int ndoms)
2426 {
2427 int i;
2428 cpumask_var_t *doms;
2429
2430 doms = kmalloc_array(ndoms, sizeof(*doms), GFP_KERNEL);
2431 if (!doms)
2432 return NULL;
2433 for (i = 0; i < ndoms; i++) {
2434 if (!alloc_cpumask_var(&doms[i], GFP_KERNEL)) {
2435 free_sched_domains(doms, i);
2436 return NULL;
2437 }
2438 }
2439 return doms;
2440 }
2441
2442 void free_sched_domains(cpumask_var_t doms[], unsigned int ndoms)
2443 {
2444 unsigned int i;
2445 for (i = 0; i < ndoms; i++)
2446 free_cpumask_var(doms[i]);
2447 kfree(doms);
2448 }
2449
2450
2451
2452
2453
2454 int sched_init_domains(const struct cpumask *cpu_map)
2455 {
2456 int err;
2457
2458 zalloc_cpumask_var(&sched_domains_tmpmask, GFP_KERNEL);
2459 zalloc_cpumask_var(&sched_domains_tmpmask2, GFP_KERNEL);
2460 zalloc_cpumask_var(&fallback_doms, GFP_KERNEL);
2461
2462 arch_update_cpu_topology();
2463 asym_cpu_capacity_scan();
2464 ndoms_cur = 1;
2465 doms_cur = alloc_sched_domains(ndoms_cur);
2466 if (!doms_cur)
2467 doms_cur = &fallback_doms;
2468 cpumask_and(doms_cur[0], cpu_map, housekeeping_cpumask(HK_TYPE_DOMAIN));
2469 err = build_sched_domains(doms_cur[0], NULL);
2470
2471 return err;
2472 }
2473
2474
2475
2476
2477
2478 static void detach_destroy_domains(const struct cpumask *cpu_map)
2479 {
2480 unsigned int cpu = cpumask_any(cpu_map);
2481 int i;
2482
2483 if (rcu_access_pointer(per_cpu(sd_asym_cpucapacity, cpu)))
2484 static_branch_dec_cpuslocked(&sched_asym_cpucapacity);
2485
2486 rcu_read_lock();
2487 for_each_cpu(i, cpu_map)
2488 cpu_attach_domain(NULL, &def_root_domain, i);
2489 rcu_read_unlock();
2490 }
2491
2492
2493 static int dattrs_equal(struct sched_domain_attr *cur, int idx_cur,
2494 struct sched_domain_attr *new, int idx_new)
2495 {
2496 struct sched_domain_attr tmp;
2497
2498
2499 if (!new && !cur)
2500 return 1;
2501
2502 tmp = SD_ATTR_INIT;
2503
2504 return !memcmp(cur ? (cur + idx_cur) : &tmp,
2505 new ? (new + idx_new) : &tmp,
2506 sizeof(struct sched_domain_attr));
2507 }
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535 void partition_sched_domains_locked(int ndoms_new, cpumask_var_t doms_new[],
2536 struct sched_domain_attr *dattr_new)
2537 {
2538 bool __maybe_unused has_eas = false;
2539 int i, j, n;
2540 int new_topology;
2541
2542 lockdep_assert_held(&sched_domains_mutex);
2543
2544
2545 new_topology = arch_update_cpu_topology();
2546
2547 if (new_topology)
2548 asym_cpu_capacity_scan();
2549
2550 if (!doms_new) {
2551 WARN_ON_ONCE(dattr_new);
2552 n = 0;
2553 doms_new = alloc_sched_domains(1);
2554 if (doms_new) {
2555 n = 1;
2556 cpumask_and(doms_new[0], cpu_active_mask,
2557 housekeeping_cpumask(HK_TYPE_DOMAIN));
2558 }
2559 } else {
2560 n = ndoms_new;
2561 }
2562
2563
2564 for (i = 0; i < ndoms_cur; i++) {
2565 for (j = 0; j < n && !new_topology; j++) {
2566 if (cpumask_equal(doms_cur[i], doms_new[j]) &&
2567 dattrs_equal(dattr_cur, i, dattr_new, j)) {
2568 struct root_domain *rd;
2569
2570
2571
2572
2573
2574
2575
2576 rd = cpu_rq(cpumask_any(doms_cur[i]))->rd;
2577 dl_clear_root_domain(rd);
2578 goto match1;
2579 }
2580 }
2581
2582 detach_destroy_domains(doms_cur[i]);
2583 match1:
2584 ;
2585 }
2586
2587 n = ndoms_cur;
2588 if (!doms_new) {
2589 n = 0;
2590 doms_new = &fallback_doms;
2591 cpumask_and(doms_new[0], cpu_active_mask,
2592 housekeeping_cpumask(HK_TYPE_DOMAIN));
2593 }
2594
2595
2596 for (i = 0; i < ndoms_new; i++) {
2597 for (j = 0; j < n && !new_topology; j++) {
2598 if (cpumask_equal(doms_new[i], doms_cur[j]) &&
2599 dattrs_equal(dattr_new, i, dattr_cur, j))
2600 goto match2;
2601 }
2602
2603 build_sched_domains(doms_new[i], dattr_new ? dattr_new + i : NULL);
2604 match2:
2605 ;
2606 }
2607
2608 #if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL)
2609
2610 for (i = 0; i < ndoms_new; i++) {
2611 for (j = 0; j < n && !sched_energy_update; j++) {
2612 if (cpumask_equal(doms_new[i], doms_cur[j]) &&
2613 cpu_rq(cpumask_first(doms_cur[j]))->rd->pd) {
2614 has_eas = true;
2615 goto match3;
2616 }
2617 }
2618
2619 has_eas |= build_perf_domains(doms_new[i]);
2620 match3:
2621 ;
2622 }
2623 sched_energy_set(has_eas);
2624 #endif
2625
2626
2627 if (doms_cur != &fallback_doms)
2628 free_sched_domains(doms_cur, ndoms_cur);
2629
2630 kfree(dattr_cur);
2631 doms_cur = doms_new;
2632 dattr_cur = dattr_new;
2633 ndoms_cur = ndoms_new;
2634
2635 update_sched_domain_debugfs();
2636 }
2637
2638
2639
2640
2641 void partition_sched_domains(int ndoms_new, cpumask_var_t doms_new[],
2642 struct sched_domain_attr *dattr_new)
2643 {
2644 mutex_lock(&sched_domains_mutex);
2645 partition_sched_domains_locked(ndoms_new, doms_new, dattr_new);
2646 mutex_unlock(&sched_domains_mutex);
2647 }