On Wed, Jul 03, 2024 at 02:37:27PM GMT, Xavier <xavier_qy@xxxxxxx> wrote: > @@ -1102,31 +1101,25 @@ static int generate_sched_domains(cpumask_var_t **domains, > if (root_load_balance && (csn == 1)) > goto single_root_domain; > > - for (i = 0; i < csn; i++) > - csa[i]->pn = i; > - ndoms = csn; > - > -restart: > - /* Find the best partition (set of sched domains) */ > - for (i = 0; i < csn; i++) { > - struct cpuset *a = csa[i]; > - int apn = a->pn; > - > - for (j = 0; j < csn; j++) { > - struct cpuset *b = csa[j]; > - int bpn = b->pn; > - > - if (apn != bpn && cpusets_overlap(a, b)) { > - for (k = 0; k < csn; k++) { > - struct cpuset *c = csa[k]; > + if (!cgrpv2) { I'm surprised that original code wasn't branched on this on you add it here. Why is UF used only for v1 code? > + for (i = 0; i < csn; i++) > + uf_node_init(&csa[i]->node); > > - if (c->pn == bpn) > - c->pn = apn; > - } > - ndoms--; /* one less element */ > - goto restart; > + /* Merge overlapping cpusets */ > + for (i = 0; i < csn; i++) { > + for (j = i + 1; j < csn; j++) { > + if (cpusets_overlap(csa[i], csa[j])) > + uf_union(&csa[i]->node, &csa[j]->node); > } > } > + > + /* Count the total number of domains */ > + for (i = 0; i < csn; i++) { > + if (csa[i]->node.parent == &csa[i]->node) > + ndoms++; The naked parent access doesn't hide the UF abstraction well. I'd consider uf_find(&csa[i]->node) == &csa[i]->node or a specific helper like uf_is_representant(&csa[i]->node). Thanks, Michal
Attachment:
signature.asc
Description: PGP signature