Home | History | Annotate | Download | only in disp
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #include <sys/systm.h>
     27 #include <sys/types.h>
     28 #include <sys/param.h>
     29 #include <sys/thread.h>
     30 #include <sys/cpuvar.h>
     31 #include <sys/cpupart.h>
     32 #include <sys/kmem.h>
     33 #include <sys/cmn_err.h>
     34 #include <sys/kstat.h>
     35 #include <sys/processor.h>
     36 #include <sys/disp.h>
     37 #include <sys/group.h>
     38 #include <sys/pghw.h>
     39 #include <sys/bitset.h>
     40 #include <sys/lgrp.h>
     41 #include <sys/cmt.h>
     42 #include <sys/cpu_pm.h>
     43 
     44 /*
     45  * CMT scheduler / dispatcher support
     46  *
     47  * This file implements CMT scheduler support using Processor Groups.
     48  * The CMT processor group class creates and maintains the CMT class
     49  * specific processor group pg_cmt_t.
     50  *
     51  * ---------------------------- <-- pg_cmt_t *
     52  * | pghw_t                   |
     53  * ----------------------------
     54  * | CMT class specific data  |
     55  * | - hierarchy linkage      |
     56  * | - CMT load balancing data|
     57  * | - active CPU group/bitset|
     58  * ----------------------------
     59  *
     60  * The scheduler/dispatcher leverages knowledge of the performance
     61  * relevant CMT sharing relationships existing between cpus to implement
     62  * optimized affinity, load balancing, and coalescence policies.
     63  *
     64  * Load balancing policy seeks to improve performance by minimizing
     65  * contention over shared processor resources / facilities, Affinity
     66  * policies seek to improve cache and TLB utilization. Coalescence
     67  * policies improve resource utilization and ultimately power efficiency.
     68  *
     69  * The CMT PGs created by this class are already arranged into a
     70  * hierarchy (which is done in the pghw layer). To implement the top-down
     71  * CMT load balancing algorithm, the CMT PGs additionally maintain
     72  * parent, child and sibling hierarchy relationships.
     73  * Parent PGs always contain a superset of their children(s) resources,
     74  * each PG can have at most one parent, and siblings are the group of PGs
     75  * sharing the same parent.
     76  *
     77  * On UMA based systems, the CMT load balancing algorithm begins by balancing
     78  * load across the group of top level PGs in the system hierarchy.
     79  * On NUMA systems, the CMT load balancing algorithm balances load across the
     80  * group of top level PGs in each leaf lgroup...but for root homed threads,
     81  * is willing to balance against all the top level PGs in the system.
     82  *
     83  * Groups of top level PGs are maintained to implement the above, one for each
     84  * leaf lgroup (containing the top level PGs in that lgroup), and one (for the
     85  * root lgroup) that contains all the top level PGs in the system.
     86  */
     87 static cmt_lgrp_t	*cmt_lgrps = NULL;	/* cmt_lgrps list head */
     88 static cmt_lgrp_t	*cpu0_lgrp = NULL;	/* boot CPU's initial lgrp */
     89 						/* used for null_proc_lpa */
     90 cmt_lgrp_t		*cmt_root = NULL;	/* Reference to root cmt pg */
     91 
     92 static int		is_cpu0 = 1; /* true if this is boot CPU context */
     93 
     94 /*
     95  * Array of hardware sharing relationships that are blacklisted.
     96  * CMT scheduling optimizations won't be performed for blacklisted sharing
     97  * relationships.
     98  */
     99 static int		cmt_hw_blacklisted[PGHW_NUM_COMPONENTS];
    100 
    101 /*
    102  * Set this to non-zero to disable CMT scheduling
    103  * This must be done via kmdb -d, as /etc/system will be too late
    104  */
    105 int			cmt_sched_disabled = 0;
    106 
    107 /*
    108  * Status codes for CMT lineage validation
    109  * See pg_cmt_lineage_validate() below
    110  */
    111 typedef enum cmt_lineage_validation {
    112 	CMT_LINEAGE_VALID,
    113 	CMT_LINEAGE_NON_CONCENTRIC,
    114 	CMT_LINEAGE_PG_SPANS_LGRPS,
    115 	CMT_LINEAGE_NON_PROMOTABLE,
    116 	CMT_LINEAGE_REPAIRED,
    117 	CMT_LINEAGE_UNRECOVERABLE
    118 } cmt_lineage_validation_t;
    119 
    120 /*
    121  * Status of the current lineage under construction.
    122  * One must be holding cpu_lock to change this.
    123  */
    124 cmt_lineage_validation_t	cmt_lineage_status = CMT_LINEAGE_VALID;
    125 
    126 /*
    127  * Power domain definitions (on x86) are defined by ACPI, and
    128  * therefore may be subject to BIOS bugs.
    129  */
    130 #define	PG_CMT_HW_SUSPECT(hw)	PGHW_IS_PM_DOMAIN(hw)
    131 
    132 /*
    133  * Macro to test if PG is managed by the CMT PG class
    134  */
    135 #define	IS_CMT_PG(pg)	(((pg_t *)(pg))->pg_class->pgc_id == pg_cmt_class_id)
    136 
    137 static pg_cid_t		pg_cmt_class_id;		/* PG class id */
    138 
    139 static pg_t		*pg_cmt_alloc();
    140 static void		pg_cmt_free(pg_t *);
    141 static void		pg_cmt_cpu_init(cpu_t *, cpu_pg_t *);
    142 static void		pg_cmt_cpu_fini(cpu_t *, cpu_pg_t *);
    143 static void		pg_cmt_cpu_active(cpu_t *);
    144 static void		pg_cmt_cpu_inactive(cpu_t *);
    145 static void		pg_cmt_cpupart_in(cpu_t *, cpupart_t *);
    146 static void		pg_cmt_cpupart_move(cpu_t *, cpupart_t *, cpupart_t *);
    147 static char		*pg_cmt_policy_name(pg_t *);
    148 static void		pg_cmt_hier_sort(pg_cmt_t **, int);
    149 static pg_cmt_t		*pg_cmt_hier_rank(pg_cmt_t *, pg_cmt_t *);
    150 static int		pg_cmt_cpu_belongs(pg_t *, cpu_t *);
    151 static int		pg_cmt_hw(pghw_type_t);
    152 static cmt_lgrp_t	*pg_cmt_find_lgrp(lgrp_handle_t);
    153 static cmt_lgrp_t	*pg_cmt_lgrp_create(lgrp_handle_t);
    154 static void		cmt_ev_thread_swtch(pg_t *, cpu_t *, hrtime_t,
    155 			    kthread_t *, kthread_t *);
    156 static void		cmt_ev_thread_swtch_pwr(pg_t *, cpu_t *, hrtime_t,
    157 			    kthread_t *, kthread_t *);
    158 static void		cmt_ev_thread_remain_pwr(pg_t *, cpu_t *, kthread_t *);
    159 static cmt_lineage_validation_t	pg_cmt_lineage_validate(pg_cmt_t **, int *,
    160 			    cpu_pg_t *);
    161 
    162 /*
    163  * CMT PG ops
    164  */
    165 struct pg_ops pg_ops_cmt = {
    166 	pg_cmt_alloc,
    167 	pg_cmt_free,
    168 	pg_cmt_cpu_init,
    169 	pg_cmt_cpu_fini,
    170 	pg_cmt_cpu_active,
    171 	pg_cmt_cpu_inactive,
    172 	pg_cmt_cpupart_in,
    173 	NULL,			/* cpupart_out */
    174 	pg_cmt_cpupart_move,
    175 	pg_cmt_cpu_belongs,
    176 	pg_cmt_policy_name,
    177 };
    178 
    179 /*
    180  * Initialize the CMT PG class
    181  */
    182 void
    183 pg_cmt_class_init(void)
    184 {
    185 	if (cmt_sched_disabled)
    186 		return;
    187 
    188 	pg_cmt_class_id = pg_class_register("cmt", &pg_ops_cmt, PGR_PHYSICAL);
    189 }
    190 
    191 /*
    192  * Called to indicate a new CPU has started up so
    193  * that either t0 or the slave startup thread can
    194  * be accounted for.
    195  */
    196 void
    197 pg_cmt_cpu_startup(cpu_t *cp)
    198 {
    199 	pg_ev_thread_swtch(cp, gethrtime_unscaled(), cp->cpu_idle_thread,
    200 	    cp->cpu_thread);
    201 }
    202 
    203 /*
    204  * Return non-zero if thread can migrate between "from" and "to"
    205  * without a performance penalty
    206  */
    207 int
    208 pg_cmt_can_migrate(cpu_t *from, cpu_t *to)
    209 {
    210 	if (from->cpu_physid->cpu_cacheid ==
    211 	    to->cpu_physid->cpu_cacheid)
    212 		return (1);
    213 	return (0);
    214 }
    215 
    216 /*
    217  * CMT class specific PG allocation
    218  */
    219 static pg_t *
    220 pg_cmt_alloc(void)
    221 {
    222 	return (kmem_zalloc(sizeof (pg_cmt_t), KM_NOSLEEP));
    223 }
    224 
    225 /*
    226  * Class specific PG de-allocation
    227  */
    228 static void
    229 pg_cmt_free(pg_t *pg)
    230 {
    231 	ASSERT(pg != NULL);
    232 	ASSERT(IS_CMT_PG(pg));
    233 
    234 	kmem_free((pg_cmt_t *)pg, sizeof (pg_cmt_t));
    235 }
    236 
    237 /*
    238  * Given a hardware sharing relationship, return which dispatcher
    239  * policies should be implemented to optimize performance and efficiency
    240  */
    241 static pg_cmt_policy_t
    242 pg_cmt_policy(pghw_type_t hw)
    243 {
    244 	pg_cmt_policy_t p;
    245 
    246 	/*
    247 	 * Give the platform a chance to override the default
    248 	 */
    249 	if ((p = pg_plat_cmt_policy(hw)) != CMT_NO_POLICY)
    250 		return (p);
    251 
    252 	switch (hw) {
    253 	case PGHW_IPIPE:
    254 	case PGHW_FPU:
    255 	case PGHW_PROCNODE:
    256 	case PGHW_CHIP:
    257 		return (CMT_BALANCE);
    258 	case PGHW_CACHE:
    259 		return (CMT_AFFINITY);
    260 	case PGHW_POW_ACTIVE:
    261 	case PGHW_POW_IDLE:
    262 		return (CMT_BALANCE);
    263 	default:
    264 		return (CMT_NO_POLICY);
    265 	}
    266 }
    267 
    268 /*
    269  * Rank the importance of optimizing for the pg1 relationship vs.
    270  * the pg2 relationship.
    271  */
    272 static pg_cmt_t *
    273 pg_cmt_hier_rank(pg_cmt_t *pg1, pg_cmt_t *pg2)
    274 {
    275 	pghw_type_t hw1 = ((pghw_t *)pg1)->pghw_hw;
    276 	pghw_type_t hw2 = ((pghw_t *)pg2)->pghw_hw;
    277 
    278 	/*
    279 	 * A power domain is only important if CPUPM is enabled.
    280 	 */
    281 	if (cpupm_get_policy() == CPUPM_POLICY_DISABLED) {
    282 		if (PGHW_IS_PM_DOMAIN(hw1) && !PGHW_IS_PM_DOMAIN(hw2))
    283 			return (pg2);
    284 		if (PGHW_IS_PM_DOMAIN(hw2) && !PGHW_IS_PM_DOMAIN(hw1))
    285 			return (pg1);
    286 	}
    287 
    288 	/*
    289 	 * Otherwise, ask the platform
    290 	 */
    291 	if (pg_plat_hw_rank(hw1, hw2) == hw1)
    292 		return (pg1);
    293 	else
    294 		return (pg2);
    295 }
    296 
    297 /*
    298  * Initialize CMT callbacks for the given PG
    299  */
    300 static void
    301 cmt_callback_init(pg_t *pg)
    302 {
    303 	/*
    304 	 * Stick with the default callbacks if there isn't going to be
    305 	 * any CMT thread placement optimizations implemented.
    306 	 */
    307 	if (((pg_cmt_t *)pg)->cmt_policy == CMT_NO_POLICY)
    308 		return;
    309 
    310 	switch (((pghw_t *)pg)->pghw_hw) {
    311 	case PGHW_POW_ACTIVE:
    312 		pg->pg_cb.thread_swtch = cmt_ev_thread_swtch_pwr;
    313 		pg->pg_cb.thread_remain = cmt_ev_thread_remain_pwr;
    314 		break;
    315 	default:
    316 		pg->pg_cb.thread_swtch = cmt_ev_thread_swtch;
    317 
    318 	}
    319 }
    320 
    321 /*
    322  * Promote PG above it's current parent.
    323  * This is only legal if PG has an equal or greater number of CPUs than its
    324  * parent.
    325  *
    326  * This routine operates on the CPU specific processor group data (for the CPUs
    327  * in the PG being promoted), and may be invoked from a context where one CPU's
    328  * PG data is under construction. In this case the argument "pgdata", if not
    329  * NULL, is a reference to the CPU's under-construction PG data.
    330  */
    331 static void
    332 cmt_hier_promote(pg_cmt_t *pg, cpu_pg_t *pgdata)
    333 {
    334 	pg_cmt_t	*parent;
    335 	group_t		*children;
    336 	cpu_t		*cpu;
    337 	group_iter_t	iter;
    338 	pg_cpu_itr_t	cpu_iter;
    339 	int		r;
    340 	int		err;
    341 	int		nchildren;
    342 
    343 	ASSERT(MUTEX_HELD(&cpu_lock));
    344 
    345 	parent = pg->cmt_parent;
    346 	if (parent == NULL) {
    347 		/*
    348 		 * Nothing to do
    349 		 */
    350 		return;
    351 	}
    352 
    353 	ASSERT(PG_NUM_CPUS((pg_t *)pg) >= PG_NUM_CPUS((pg_t *)parent));
    354 
    355 	/*
    356 	 * We're changing around the hierarchy, which is actively traversed
    357 	 * by the dispatcher. Pause CPUS to ensure exclusivity.
    358 	 */
    359 	pause_cpus(NULL);
    360 
    361 	/*
    362 	 * If necessary, update the parent's sibling set, replacing parent
    363 	 * with PG.
    364 	 */
    365 	if (parent->cmt_siblings) {
    366 		if (group_remove(parent->cmt_siblings, parent, GRP_NORESIZE)
    367 		    != -1) {
    368 			r = group_add(parent->cmt_siblings, pg, GRP_NORESIZE);
    369 			ASSERT(r != -1);
    370 		}
    371 	}
    372 
    373 	/*
    374 	 * If the parent is at the top of the hierarchy, replace it's entry
    375 	 * in the root lgroup's group of top level PGs.
    376 	 */
    377 	if (parent->cmt_parent == NULL &&
    378 	    parent->cmt_siblings != &cmt_root->cl_pgs) {
    379 		if (group_remove(&cmt_root->cl_pgs, parent, GRP_NORESIZE)
    380 		    != -1) {
    381 			r = group_add(&cmt_root->cl_pgs, pg, GRP_NORESIZE);
    382 			ASSERT(r != -1);
    383 		}
    384 	}
    385 
    386 	/*
    387 	 * We assume (and therefore assert) that the PG being promoted is an
    388 	 * only child of it's parent. Update the parent's children set
    389 	 * replacing PG's entry with the parent (since the parent is becoming
    390 	 * the child). Then have PG and the parent swap children sets and
    391 	 * children counts.
    392 	 */
    393 	ASSERT(GROUP_SIZE(parent->cmt_children) <= 1);
    394 	if (group_remove(parent->cmt_children, pg, GRP_NORESIZE) != -1) {
    395 		r = group_add(parent->cmt_children, parent, GRP_NORESIZE);
    396 		ASSERT(r != -1);
    397 	}
    398 
    399 	children = pg->cmt_children;
    400 	pg->cmt_children = parent->cmt_children;
    401 	parent->cmt_children = children;
    402 
    403 	nchildren = pg->cmt_nchildren;
    404 	pg->cmt_nchildren = parent->cmt_nchildren;
    405 	parent->cmt_nchildren = nchildren;
    406 
    407 	/*
    408 	 * Update the sibling references for PG and it's parent
    409 	 */
    410 	pg->cmt_siblings = parent->cmt_siblings;
    411 	parent->cmt_siblings = pg->cmt_children;
    412 
    413 	/*
    414 	 * Update any cached lineages in the per CPU pg data.
    415 	 */
    416 	PG_CPU_ITR_INIT(pg, cpu_iter);
    417 	while ((cpu = pg_cpu_next(&cpu_iter)) != NULL) {
    418 		int		idx;
    419 		int		sz;
    420 		pg_cmt_t	*cpu_pg;
    421 		cpu_pg_t	*pgd;	/* CPU's PG data */
    422 
    423 		/*
    424 		 * The CPU's whose lineage is under construction still
    425 		 * references the bootstrap CPU PG data structure.
    426 		 */
    427 		if (pg_cpu_is_bootstrapped(cpu))
    428 			pgd = pgdata;
    429 		else
    430 			pgd = cpu->cpu_pg;
    431 
    432 		/*
    433 		 * Iterate over the CPU's PGs updating the children
    434 		 * of the PG being promoted, since they have a new parent.
    435 		 */
    436 		group_iter_init(&iter);
    437 		while ((cpu_pg = group_iterate(&pgd->cmt_pgs, &iter)) != NULL) {
    438 			if (cpu_pg->cmt_parent == pg) {
    439 				cpu_pg->cmt_parent = parent;
    440 			}
    441 		}
    442 
    443 		/*
    444 		 * Update the CMT load balancing lineage
    445 		 */
    446 		if ((idx = group_find(&pgd->cmt_pgs, (void *)pg)) == -1) {
    447 			/*
    448 			 * Unless this is the CPU who's lineage is being
    449 			 * constructed, the PG being promoted should be
    450 			 * in the lineage.
    451 			 */
    452 			ASSERT(pg_cpu_is_bootstrapped(cpu));
    453 			continue;
    454 		}
    455 
    456 		ASSERT(idx > 0);
    457 		ASSERT(GROUP_ACCESS(&pgd->cmt_pgs, idx - 1) == parent);
    458 
    459 		/*
    460 		 * Have the child and the parent swap places in the CPU's
    461 		 * lineage
    462 		 */
    463 		group_remove_at(&pgd->cmt_pgs, idx);
    464 		group_remove_at(&pgd->cmt_pgs, idx - 1);
    465 		err = group_add_at(&pgd->cmt_pgs, parent, idx);
    466 		ASSERT(err == 0);
    467 		err = group_add_at(&pgd->cmt_pgs, pg, idx - 1);
    468 		ASSERT(err == 0);
    469 
    470 		/*
    471 		 * Ensure cmt_lineage references CPU's leaf PG.
    472 		 * Since cmt_pgs is top-down ordered, the bottom is the last
    473 		 * element.
    474 		 */
    475 		if ((sz = GROUP_SIZE(&pgd->cmt_pgs)) > 0)
    476 			pgd->cmt_lineage = GROUP_ACCESS(&pgd->cmt_pgs, sz - 1);
    477 	}
    478 
    479 	/*
    480 	 * Update the parent references for PG and it's parent
    481 	 */
    482 	pg->cmt_parent = parent->cmt_parent;
    483 	parent->cmt_parent = pg;
    484 
    485 	start_cpus();
    486 }
    487 
    488 /*
    489  * CMT class callback for a new CPU entering the system
    490  *
    491  * This routine operates on the CPU specific processor group data (for the CPU
    492  * being initialized). The argument "pgdata" is a reference to the CPU's PG
    493  * data to be constructed.
    494  *
    495  * cp->cpu_pg is used by the dispatcher to access the CPU's PG data
    496  * references a "bootstrap" structure. pg_cmt_cpu_init() and the routines it
    497  * calls must be careful to operate only on the "pgdata" argument, and not
    498  * cp->cpu_pg.
    499  */
    500 static void
    501 pg_cmt_cpu_init(cpu_t *cp, cpu_pg_t *pgdata)
    502 {
    503 	pg_cmt_t	*pg;
    504 	group_t		*cmt_pgs;
    505 	int		levels, level;
    506 	pghw_type_t	hw;
    507 	pg_t		*pg_cache = NULL;
    508 	pg_cmt_t	*cpu_cmt_hier[PGHW_NUM_COMPONENTS];
    509 	lgrp_handle_t	lgrp_handle;
    510 	cmt_lgrp_t	*lgrp;
    511 	cmt_lineage_validation_t	lineage_status;
    512 
    513 	ASSERT(MUTEX_HELD(&cpu_lock));
    514 	ASSERT(pg_cpu_is_bootstrapped(cp));
    515 
    516 	if (cmt_sched_disabled)
    517 		return;
    518 
    519 	/*
    520 	 * A new CPU is coming into the system.
    521 	 * Interrogate the platform to see if the CPU
    522 	 * has any performance or efficiency relevant
    523 	 * sharing relationships
    524 	 */
    525 	cmt_pgs = &pgdata->cmt_pgs;
    526 	pgdata->cmt_lineage = NULL;
    527 
    528 	bzero(cpu_cmt_hier, sizeof (cpu_cmt_hier));
    529 	levels = 0;
    530 	for (hw = PGHW_START; hw < PGHW_NUM_COMPONENTS; hw++) {
    531 
    532 		pg_cmt_policy_t	policy;
    533 
    534 		/*
    535 		 * We're only interested in the hw sharing relationships
    536 		 * for which we know how to optimize.
    537 		 */
    538 		policy = pg_cmt_policy(hw);
    539 		if (policy == CMT_NO_POLICY ||
    540 		    pg_plat_hw_shared(cp, hw) == 0)
    541 			continue;
    542 
    543 		/*
    544 		 * We will still create the PGs for hardware sharing
    545 		 * relationships that have been blacklisted, but won't
    546 		 * implement CMT thread placement optimizations against them.
    547 		 */
    548 		if (cmt_hw_blacklisted[hw] == 1)
    549 			policy = CMT_NO_POLICY;
    550 
    551 		/*
    552 		 * Find (or create) the PG associated with
    553 		 * the hw sharing relationship in which cp
    554 		 * belongs.
    555 		 *
    556 		 * Determine if a suitable PG already
    557 		 * exists, or if one needs to be created.
    558 		 */
    559 		pg = (pg_cmt_t *)pghw_place_cpu(cp, hw);
    560 		if (pg == NULL) {
    561 			/*
    562 			 * Create a new one.
    563 			 * Initialize the common...
    564 			 */
    565 			pg = (pg_cmt_t *)pg_create(pg_cmt_class_id);
    566 
    567 			/* ... physical ... */
    568 			pghw_init((pghw_t *)pg, cp, hw);
    569 
    570 			/*
    571 			 * ... and CMT specific portions of the
    572 			 * structure.
    573 			 */
    574 			pg->cmt_policy = policy;
    575 
    576 			/* CMT event callbacks */
    577 			cmt_callback_init((pg_t *)pg);
    578 
    579 			bitset_init(&pg->cmt_cpus_actv_set);
    580 			group_create(&pg->cmt_cpus_actv);
    581 		} else {
    582 			ASSERT(IS_CMT_PG(pg));
    583 		}
    584 
    585 		((pghw_t *)pg)->pghw_generation++;
    586 
    587 		/* Add the CPU to the PG */
    588 		pg_cpu_add((pg_t *)pg, cp, pgdata);
    589 
    590 		/*
    591 		 * Ensure capacity of the active CPU group/bitset
    592 		 */
    593 		group_expand(&pg->cmt_cpus_actv,
    594 		    GROUP_SIZE(&((pg_t *)pg)->pg_cpus));
    595 
    596 		if (cp->cpu_seqid >=
    597 		    bitset_capacity(&pg->cmt_cpus_actv_set)) {
    598 			bitset_resize(&pg->cmt_cpus_actv_set,
    599 			    cp->cpu_seqid + 1);
    600 		}
    601 
    602 		/*
    603 		 * Build a lineage of CMT PGs for load balancing / coalescence
    604 		 */
    605 		if (policy & (CMT_BALANCE | CMT_COALESCE)) {
    606 			cpu_cmt_hier[levels++] = pg;
    607 		}
    608 
    609 		/* Cache this for later */
    610 		if (hw == PGHW_CACHE)
    611 			pg_cache = (pg_t *)pg;
    612 	}
    613 
    614 	group_expand(cmt_pgs, levels);
    615 
    616 	if (cmt_root == NULL)
    617 		cmt_root = pg_cmt_lgrp_create(lgrp_plat_root_hand());
    618 
    619 	/*
    620 	 * Find the lgrp that encapsulates this CPU's CMT hierarchy
    621 	 */
    622 	lgrp_handle = lgrp_plat_cpu_to_hand(cp->cpu_id);
    623 	if ((lgrp = pg_cmt_find_lgrp(lgrp_handle)) == NULL)
    624 		lgrp = pg_cmt_lgrp_create(lgrp_handle);
    625 
    626 	/*
    627 	 * Ascendingly sort the PGs in the lineage by number of CPUs
    628 	 */
    629 	pg_cmt_hier_sort(cpu_cmt_hier, levels);
    630 
    631 	/*
    632 	 * Examine the lineage and validate it.
    633 	 * This routine will also try to fix the lineage along with the
    634 	 * rest of the PG hierarchy should it detect an issue.
    635 	 *
    636 	 * If it returns anything other than VALID or REPAIRED, an
    637 	 * unrecoverable error has occurred, and we cannot proceed.
    638 	 */
    639 	lineage_status = pg_cmt_lineage_validate(cpu_cmt_hier, &levels, pgdata);
    640 	if ((lineage_status != CMT_LINEAGE_VALID) &&
    641 	    (lineage_status != CMT_LINEAGE_REPAIRED)) {
    642 		/*
    643 		 * In the case of an unrecoverable error where CMT scheduling
    644 		 * has been disabled, assert that the under construction CPU's
    645 		 * PG data has an empty CMT load balancing lineage.
    646 		 */
    647 		ASSERT((cmt_sched_disabled == 0) ||
    648 		    (GROUP_SIZE(&(pgdata->cmt_pgs)) == 0));
    649 		return;
    650 	}
    651 
    652 	/*
    653 	 * For existing PGs in the lineage, verify that the parent is
    654 	 * correct, as the generation in the lineage may have changed
    655 	 * as a result of the sorting. Start the traversal at the top
    656 	 * of the lineage, moving down.
    657 	 */
    658 	for (level = levels - 1; level >= 0; ) {
    659 		int reorg;
    660 
    661 		reorg = 0;
    662 		pg = cpu_cmt_hier[level];
    663 
    664 		/*
    665 		 * Promote PGs at an incorrect generation into place.
    666 		 */
    667 		while (pg->cmt_parent &&
    668 		    pg->cmt_parent != cpu_cmt_hier[level + 1]) {
    669 			cmt_hier_promote(pg, pgdata);
    670 			reorg++;
    671 		}
    672 		if (reorg > 0)
    673 			level = levels - 1;
    674 		else
    675 			level--;
    676 	}
    677 
    678 	/*
    679 	 * For each of the PGs in the CPU's lineage:
    680 	 *	- Add an entry in the CPU sorted CMT PG group
    681 	 *	  which is used for top down CMT load balancing
    682 	 *	- Tie the PG into the CMT hierarchy by connecting
    683 	 *	  it to it's parent and siblings.
    684 	 */
    685 	for (level = 0; level < levels; level++) {
    686 		uint_t		children;
    687 		int		err;
    688 
    689 		pg = cpu_cmt_hier[level];
    690 		err = group_add_at(cmt_pgs, pg, levels - level - 1);
    691 		ASSERT(err == 0);
    692 
    693 		if (level == 0)
    694 			pgdata->cmt_lineage = (pg_t *)pg;
    695 
    696 		if (pg->cmt_siblings != NULL) {
    697 			/* Already initialized */
    698 			ASSERT(pg->cmt_parent == NULL ||
    699 			    pg->cmt_parent == cpu_cmt_hier[level + 1]);
    700 			ASSERT(pg->cmt_siblings == &lgrp->cl_pgs ||
    701 			    ((pg->cmt_parent != NULL) &&
    702 			    pg->cmt_siblings == pg->cmt_parent->cmt_children));
    703 			continue;
    704 		}
    705 
    706 		if ((level + 1) == levels) {
    707 			pg->cmt_parent = NULL;
    708 
    709 			pg->cmt_siblings = &lgrp->cl_pgs;
    710 			children = ++lgrp->cl_npgs;
    711 			if (cmt_root != lgrp)
    712 				cmt_root->cl_npgs++;
    713 		} else {
    714 			pg->cmt_parent = cpu_cmt_hier[level + 1];
    715 
    716 			/*
    717 			 * A good parent keeps track of their children.
    718 			 * The parent's children group is also the PG's
    719 			 * siblings.
    720 			 */
    721 			if (pg->cmt_parent->cmt_children == NULL) {
    722 				pg->cmt_parent->cmt_children =
    723 				    kmem_zalloc(sizeof (group_t), KM_SLEEP);
    724 				group_create(pg->cmt_parent->cmt_children);
    725 			}
    726 			pg->cmt_siblings = pg->cmt_parent->cmt_children;
    727 			children = ++pg->cmt_parent->cmt_nchildren;
    728 		}
    729 
    730 		group_expand(pg->cmt_siblings, children);
    731 		group_expand(&cmt_root->cl_pgs, cmt_root->cl_npgs);
    732 	}
    733 
    734 	/*
    735 	 * Cache the chip and core IDs in the cpu_t->cpu_physid structure
    736 	 * for fast lookups later.
    737 	 */
    738 	if (cp->cpu_physid) {
    739 		cp->cpu_physid->cpu_chipid =
    740 		    pg_plat_hw_instance_id(cp, PGHW_CHIP);
    741 		cp->cpu_physid->cpu_coreid = pg_plat_get_core_id(cp);
    742 
    743 		/*
    744 		 * If this cpu has a PG representing shared cache, then set
    745 		 * cpu_cacheid to that PG's logical id
    746 		 */
    747 		if (pg_cache)
    748 			cp->cpu_physid->cpu_cacheid = pg_cache->pg_id;
    749 	}
    750 
    751 	/* CPU0 only initialization */
    752 	if (is_cpu0) {
    753 		is_cpu0 = 0;
    754 		cpu0_lgrp = lgrp;
    755 	}
    756 
    757 }
    758 
    759 /*
    760  * Class callback when a CPU is leaving the system (deletion)
    761  *
    762  * "pgdata" is a reference to the CPU's PG data to be deconstructed.
    763  *
    764  * cp->cpu_pg is used by the dispatcher to access the CPU's PG data
    765  * references a "bootstrap" structure across this function's invocation.
    766  * pg_cmt_cpu_fini() and the routines it calls must be careful to operate only
    767  * on the "pgdata" argument, and not cp->cpu_pg.
    768  */
    769 static void
    770 pg_cmt_cpu_fini(cpu_t *cp, cpu_pg_t *pgdata)
    771 {
    772 	group_iter_t	i;
    773 	pg_cmt_t	*pg;
    774 	group_t		*pgs, *cmt_pgs;
    775 	lgrp_handle_t	lgrp_handle;
    776 	cmt_lgrp_t	*lgrp;
    777 
    778 	if (cmt_sched_disabled)
    779 		return;
    780 
    781 	ASSERT(pg_cpu_is_bootstrapped(cp));
    782 
    783 	pgs = &pgdata->pgs;
    784 	cmt_pgs = &pgdata->cmt_pgs;
    785 
    786 	/*
    787 	 * Find the lgroup that encapsulates this CPU's CMT hierarchy
    788 	 */
    789 	lgrp_handle = lgrp_plat_cpu_to_hand(cp->cpu_id);
    790 
    791 	lgrp = pg_cmt_find_lgrp(lgrp_handle);
    792 	if (ncpus == 1 && lgrp != cpu0_lgrp) {
    793 		/*
    794 		 * One might wonder how we could be deconfiguring the
    795 		 * only CPU in the system.
    796 		 *
    797 		 * On Starcat systems when null_proc_lpa is detected,
    798 		 * the boot CPU (which is already configured into a leaf
    799 		 * lgroup), is moved into the root lgroup. This is done by
    800 		 * deconfiguring it from both lgroups and processor
    801 		 * groups), and then later reconfiguring it back in.  This
    802 		 * call to pg_cmt_cpu_fini() is part of that deconfiguration.
    803 		 *
    804 		 * This special case is detected by noting that the platform
    805 		 * has changed the CPU's lgrp affiliation (since it now
    806 		 * belongs in the root). In this case, use the cmt_lgrp_t
    807 		 * cached for the boot CPU, since this is what needs to be
    808 		 * torn down.
    809 		 */
    810 		lgrp = cpu0_lgrp;
    811 	}
    812 
    813 	ASSERT(lgrp != NULL);
    814 
    815 	/*
    816 	 * First, clean up anything load balancing specific for each of
    817 	 * the CPU's PGs that participated in CMT load balancing
    818 	 */
    819 	pg = (pg_cmt_t *)pgdata->cmt_lineage;
    820 	while (pg != NULL) {
    821 
    822 		((pghw_t *)pg)->pghw_generation++;
    823 
    824 		/*
    825 		 * Remove the PG from the CPU's load balancing lineage
    826 		 */
    827 		(void) group_remove(cmt_pgs, pg, GRP_RESIZE);
    828 
    829 		/*
    830 		 * If it's about to become empty, destroy it's children
    831 		 * group, and remove it's reference from it's siblings.
    832 		 * This is done here (rather than below) to avoid removing
    833 		 * our reference from a PG that we just eliminated.
    834 		 */
    835 		if (GROUP_SIZE(&((pg_t *)pg)->pg_cpus) == 1) {
    836 			if (pg->cmt_children != NULL)
    837 				group_destroy(pg->cmt_children);
    838 			if (pg->cmt_siblings != NULL) {
    839 				if (pg->cmt_siblings == &lgrp->cl_pgs)
    840 					lgrp->cl_npgs--;
    841 				else
    842 					pg->cmt_parent->cmt_nchildren--;
    843 			}
    844 		}
    845 		pg = pg->cmt_parent;
    846 	}
    847 	ASSERT(GROUP_SIZE(cmt_pgs) == 0);
    848 
    849 	/*
    850 	 * Now that the load balancing lineage updates have happened,
    851 	 * remove the CPU from all it's PGs (destroying any that become
    852 	 * empty).
    853 	 */
    854 	group_iter_init(&i);
    855 	while ((pg = group_iterate(pgs, &i)) != NULL) {
    856 		if (IS_CMT_PG(pg) == 0)
    857 			continue;
    858 
    859 		pg_cpu_delete((pg_t *)pg, cp, pgdata);
    860 		/*
    861 		 * Deleting the CPU from the PG changes the CPU's
    862 		 * PG group over which we are actively iterating
    863 		 * Re-initialize the iteration
    864 		 */
    865 		group_iter_init(&i);
    866 
    867 		if (GROUP_SIZE(&((pg_t *)pg)->pg_cpus) == 0) {
    868 
    869 			/*
    870 			 * The PG has become zero sized, so destroy it.
    871 			 */
    872 			group_destroy(&pg->cmt_cpus_actv);
    873 			bitset_fini(&pg->cmt_cpus_actv_set);
    874 			pghw_fini((pghw_t *)pg);
    875 
    876 			pg_destroy((pg_t *)pg);
    877 		}
    878 	}
    879 }
    880 
    881 /*
    882  * Class callback when a CPU is entering a cpu partition
    883  */
    884 static void
    885 pg_cmt_cpupart_in(cpu_t *cp, cpupart_t *pp)
    886 {
    887 	group_t		*pgs;
    888 	pg_t		*pg;
    889 	group_iter_t	i;
    890 
    891 	ASSERT(MUTEX_HELD(&cpu_lock));
    892 
    893 	if (cmt_sched_disabled)
    894 		return;
    895 
    896 	pgs = &cp->cpu_pg->pgs;
    897 
    898 	/*
    899 	 * Ensure that the new partition's PG bitset
    900 	 * is large enough for all CMT PG's to which cp
    901 	 * belongs
    902 	 */
    903 	group_iter_init(&i);
    904 	while ((pg = group_iterate(pgs, &i)) != NULL) {
    905 		if (IS_CMT_PG(pg) == 0)
    906 			continue;
    907 
    908 		if (bitset_capacity(&pp->cp_cmt_pgs) <= pg->pg_id)
    909 			bitset_resize(&pp->cp_cmt_pgs, pg->pg_id + 1);
    910 	}
    911 }
    912 
    913 /*
    914  * Class callback when a CPU is actually moving partitions
    915  */
    916 static void
    917 pg_cmt_cpupart_move(cpu_t *cp, cpupart_t *oldpp, cpupart_t *newpp)
    918 {
    919 	cpu_t		*cpp;
    920 	group_t		*pgs;
    921 	pg_t		*pg;
    922 	group_iter_t	pg_iter;
    923 	pg_cpu_itr_t	cpu_iter;
    924 	boolean_t	found;
    925 
    926 	ASSERT(MUTEX_HELD(&cpu_lock));
    927 
    928 	if (cmt_sched_disabled)
    929 		return;
    930 
    931 	pgs = &cp->cpu_pg->pgs;
    932 	group_iter_init(&pg_iter);
    933 
    934 	/*
    935 	 * Iterate over the CPUs CMT PGs
    936 	 */
    937 	while ((pg = group_iterate(pgs, &pg_iter)) != NULL) {
    938 
    939 		if (IS_CMT_PG(pg) == 0)
    940 			continue;
    941 
    942 		/*
    943 		 * Add the PG to the bitset in the new partition.
    944 		 */
    945 		bitset_add(&newpp->cp_cmt_pgs, pg->pg_id);
    946 
    947 		/*
    948 		 * Remove the PG from the bitset in the old partition
    949 		 * if the last of the PG's CPUs have left.
    950 		 */
    951 		found = B_FALSE;
    952 		PG_CPU_ITR_INIT(pg, cpu_iter);
    953 		while ((cpp = pg_cpu_next(&cpu_iter)) != NULL) {
    954 			if (cpp == cp)
    955 				continue;
    956 			if (CPU_ACTIVE(cpp) &&
    957 			    cpp->cpu_part->cp_id == oldpp->cp_id) {
    958 				found = B_TRUE;
    959 				break;
    960 			}
    961 		}
    962 		if (!found)
    963 			bitset_del(&cp->cpu_part->cp_cmt_pgs, pg->pg_id);
    964 	}
    965 }
    966 
    967 /*
    968  * Class callback when a CPU becomes active (online)
    969  *
    970  * This is called in a context where CPUs are paused
    971  */
    972 static void
    973 pg_cmt_cpu_active(cpu_t *cp)
    974 {
    975 	int		err;
    976 	group_iter_t	i;
    977 	pg_cmt_t	*pg;
    978 	group_t		*pgs;
    979 
    980 	ASSERT(MUTEX_HELD(&cpu_lock));
    981 
    982 	if (cmt_sched_disabled)
    983 		return;
    984 
    985 	pgs = &cp->cpu_pg->pgs;
    986 	group_iter_init(&i);
    987 
    988 	/*
    989 	 * Iterate over the CPU's PGs
    990 	 */
    991 	while ((pg = group_iterate(pgs, &i)) != NULL) {
    992 
    993 		if (IS_CMT_PG(pg) == 0)
    994 			continue;
    995 
    996 		/*
    997 		 * Move to the next generation since topology is changing
    998 		 */
    999 		((pghw_t *)pg)->pghw_generation++;
   1000 
   1001 		err = group_add(&pg->cmt_cpus_actv, cp, GRP_NORESIZE);
   1002 		ASSERT(err == 0);
   1003 
   1004 		/*
   1005 		 * If this is the first active CPU in the PG, and it
   1006 		 * represents a hardware sharing relationship over which
   1007 		 * CMT load balancing is performed, add it as a candidate
   1008 		 * for balancing with it's siblings.
   1009 		 */
   1010 		if (GROUP_SIZE(&pg->cmt_cpus_actv) == 1 &&
   1011 		    (pg->cmt_policy & (CMT_BALANCE | CMT_COALESCE))) {
   1012 			err = group_add(pg->cmt_siblings, pg, GRP_NORESIZE);
   1013 			ASSERT(err == 0);
   1014 
   1015 			/*
   1016 			 * If this is a top level PG, add it as a balancing
   1017 			 * candidate when balancing within the root lgroup.
   1018 			 */
   1019 			if (pg->cmt_parent == NULL &&
   1020 			    pg->cmt_siblings != &cmt_root->cl_pgs) {
   1021 				err = group_add(&cmt_root->cl_pgs, pg,
   1022 				    GRP_NORESIZE);
   1023 				ASSERT(err == 0);
   1024 			}
   1025 		}
   1026 
   1027 		/*
   1028 		 * Notate the CPU in the PGs active CPU bitset.
   1029 		 * Also notate the PG as being active in it's associated
   1030 		 * partition
   1031 		 */
   1032 		bitset_add(&pg->cmt_cpus_actv_set, cp->cpu_seqid);
   1033 		bitset_add(&cp->cpu_part->cp_cmt_pgs, ((pg_t *)pg)->pg_id);
   1034 	}
   1035 }
   1036 
   1037 /*
   1038  * Class callback when a CPU goes inactive (offline)
   1039  *
   1040  * This is called in a context where CPUs are paused
   1041  */
   1042 static void
   1043 pg_cmt_cpu_inactive(cpu_t *cp)
   1044 {
   1045 	int		err;
   1046 	group_t		*pgs;
   1047 	pg_cmt_t	*pg;
   1048 	cpu_t		*cpp;
   1049 	group_iter_t	i;
   1050 	pg_cpu_itr_t	cpu_itr;
   1051 	boolean_t	found;
   1052 
   1053 	ASSERT(MUTEX_HELD(&cpu_lock));
   1054 
   1055 	if (cmt_sched_disabled)
   1056 		return;
   1057 
   1058 	pgs = &cp->cpu_pg->pgs;
   1059 	group_iter_init(&i);
   1060 
   1061 	while ((pg = group_iterate(pgs, &i)) != NULL) {
   1062 
   1063 		if (IS_CMT_PG(pg) == 0)
   1064 			continue;
   1065 
   1066 		/*
   1067 		 * Move to the next generation since topology is changing
   1068 		 */
   1069 		((pghw_t *)pg)->pghw_generation++;
   1070 
   1071 		/*
   1072 		 * Remove the CPU from the CMT PGs active CPU group
   1073 		 * bitmap
   1074 		 */
   1075 		err = group_remove(&pg->cmt_cpus_actv, cp, GRP_NORESIZE);
   1076 		ASSERT(err == 0);
   1077 
   1078 		bitset_del(&pg->cmt_cpus_actv_set, cp->cpu_seqid);
   1079 
   1080 		/*
   1081 		 * If there are no more active CPUs in this PG over which
   1082 		 * load was balanced, remove it as a balancing candidate.
   1083 		 */
   1084 		if (GROUP_SIZE(&pg->cmt_cpus_actv) == 0 &&
   1085 		    (pg->cmt_policy & (CMT_BALANCE | CMT_COALESCE))) {
   1086 			err = group_remove(pg->cmt_siblings, pg, GRP_NORESIZE);
   1087 			ASSERT(err == 0);
   1088 
   1089 			if (pg->cmt_parent == NULL &&
   1090 			    pg->cmt_siblings != &cmt_root->cl_pgs) {
   1091 				err = group_remove(&cmt_root->cl_pgs, pg,
   1092 				    GRP_NORESIZE);
   1093 				ASSERT(err == 0);
   1094 			}
   1095 		}
   1096 
   1097 		/*
   1098 		 * Assert the number of active CPUs does not exceed
   1099 		 * the total number of CPUs in the PG
   1100 		 */
   1101 		ASSERT(GROUP_SIZE(&pg->cmt_cpus_actv) <=
   1102 		    GROUP_SIZE(&((pg_t *)pg)->pg_cpus));
   1103 
   1104 		/*
   1105 		 * Update the PG bitset in the CPU's old partition
   1106 		 */
   1107 		found = B_FALSE;
   1108 		PG_CPU_ITR_INIT(pg, cpu_itr);
   1109 		while ((cpp = pg_cpu_next(&cpu_itr)) != NULL) {
   1110 			if (cpp == cp)
   1111 				continue;
   1112 			if (CPU_ACTIVE(cpp) &&
   1113 			    cpp->cpu_part->cp_id == cp->cpu_part->cp_id) {
   1114 				found = B_TRUE;
   1115 				break;
   1116 			}
   1117 		}
   1118 		if (!found) {
   1119 			bitset_del(&cp->cpu_part->cp_cmt_pgs,
   1120 			    ((pg_t *)pg)->pg_id);
   1121 		}
   1122 	}
   1123 }
   1124 
   1125 /*
   1126  * Return non-zero if the CPU belongs in the given PG
   1127  */
   1128 static int
   1129 pg_cmt_cpu_belongs(pg_t *pg, cpu_t *cp)
   1130 {
   1131 	cpu_t	*pg_cpu;
   1132 
   1133 	pg_cpu = GROUP_ACCESS(&pg->pg_cpus, 0);
   1134 
   1135 	ASSERT(pg_cpu != NULL);
   1136 
   1137 	/*
   1138 	 * The CPU belongs if, given the nature of the hardware sharing
   1139 	 * relationship represented by the PG, the CPU has that
   1140 	 * relationship with some other CPU already in the PG
   1141 	 */
   1142 	if (pg_plat_cpus_share(cp, pg_cpu, ((pghw_t *)pg)->pghw_hw))
   1143 		return (1);
   1144 
   1145 	return (0);
   1146 }
   1147 
   1148 /*
   1149  * Sort the CPUs CMT hierarchy, where "size" is the number of levels.
   1150  */
   1151 static void
   1152 pg_cmt_hier_sort(pg_cmt_t **hier, int size)
   1153 {
   1154 	int		i, j, inc, sz;
   1155 	int		start, end;
   1156 	pg_t		*tmp;
   1157 	pg_t		**h = (pg_t **)hier;
   1158 
   1159 	/*
   1160 	 * First sort by number of CPUs
   1161 	 */
   1162 	inc = size / 2;
   1163 	while (inc > 0) {
   1164 		for (i = inc; i < size; i++) {
   1165 			j = i;
   1166 			tmp = h[i];
   1167 			while ((j >= inc) &&
   1168 			    (PG_NUM_CPUS(h[j - inc]) > PG_NUM_CPUS(tmp))) {
   1169 				h[j] = h[j - inc];
   1170 				j = j - inc;
   1171 			}
   1172 			h[j] = tmp;
   1173 		}
   1174 		if (inc == 2)
   1175 			inc = 1;
   1176 		else
   1177 			inc = (inc * 5) / 11;
   1178 	}
   1179 
   1180 	/*
   1181 	 * Break ties by asking the platform.
   1182 	 * Determine if h[i] outranks h[i + 1] and if so, swap them.
   1183 	 */
   1184 	for (start = 0; start < size; start++) {
   1185 
   1186 		/*
   1187 		 * Find various contiguous sets of elements,
   1188 		 * in the array, with the same number of cpus
   1189 		 */
   1190 		end = start;
   1191 		sz = PG_NUM_CPUS(h[start]);
   1192 		while ((end < size) && (sz == PG_NUM_CPUS(h[end])))
   1193 			end++;
   1194 		/*
   1195 		 * Sort each such set of the array by rank
   1196 		 */
   1197 		for (i = start + 1; i < end; i++) {
   1198 			j = i - 1;
   1199 			tmp = h[i];
   1200 			while (j >= start &&
   1201 			    pg_cmt_hier_rank(hier[j],
   1202 			    (pg_cmt_t *)tmp) == hier[j]) {
   1203 				h[j + 1] = h[j];
   1204 				j--;
   1205 			}
   1206 			h[j + 1] = tmp;
   1207 		}
   1208 	}
   1209 }
   1210 
   1211 /*
   1212  * Return a cmt_lgrp_t * given an lgroup handle.
   1213  */
   1214 static cmt_lgrp_t *
   1215 pg_cmt_find_lgrp(lgrp_handle_t hand)
   1216 {
   1217 	cmt_lgrp_t	*lgrp;
   1218 
   1219 	ASSERT(MUTEX_HELD(&cpu_lock));
   1220 
   1221 	lgrp = cmt_lgrps;
   1222 	while (lgrp != NULL) {
   1223 		if (lgrp->cl_hand == hand)
   1224 			break;
   1225 		lgrp = lgrp->cl_next;
   1226 	}
   1227 	return (lgrp);
   1228 }
   1229 
   1230 /*
   1231  * Create a cmt_lgrp_t with the specified handle.
   1232  */
   1233 static cmt_lgrp_t *
   1234 pg_cmt_lgrp_create(lgrp_handle_t hand)
   1235 {
   1236 	cmt_lgrp_t	*lgrp;
   1237 
   1238 	ASSERT(MUTEX_HELD(&cpu_lock));
   1239 
   1240 	lgrp = kmem_zalloc(sizeof (cmt_lgrp_t), KM_SLEEP);
   1241 
   1242 	lgrp->cl_hand = hand;
   1243 	lgrp->cl_npgs = 0;
   1244 	lgrp->cl_next = cmt_lgrps;
   1245 	cmt_lgrps = lgrp;
   1246 	group_create(&lgrp->cl_pgs);
   1247 
   1248 	return (lgrp);
   1249 }
   1250 
   1251 /*
   1252  * Interfaces to enable and disable power aware dispatching
   1253  * The caller must be holding cpu_lock.
   1254  *
   1255  * Return 0 on success and -1 on failure.
   1256  */
   1257 int
   1258 cmt_pad_enable(pghw_type_t type)
   1259 {
   1260 	group_t		*hwset;
   1261 	group_iter_t	iter;
   1262 	pg_cmt_t	*pg;
   1263 
   1264 	ASSERT(PGHW_IS_PM_DOMAIN(type));
   1265 	ASSERT(MUTEX_HELD(&cpu_lock));
   1266 
   1267 	if ((hwset = pghw_set_lookup(type)) == NULL ||
   1268 	    cmt_hw_blacklisted[type]) {
   1269 		/*
   1270 		 * Unable to find any instances of the specified type
   1271 		 * of power domain, or the power domains have been blacklisted.
   1272 		 */
   1273 		return (-1);
   1274 	}
   1275 
   1276 	/*
   1277 	 * Iterate over the power domains, setting the default dispatcher
   1278 	 * policy for power/performance optimization.
   1279 	 *
   1280 	 * Simply setting the policy isn't enough in the case where the power
   1281 	 * domain is an only child of another PG. Because the dispatcher walks
   1282 	 * the PG hierarchy in a top down fashion, the higher up PG's policy
   1283 	 * will dominate. So promote the power domain above it's parent if both
   1284 	 * PG and it's parent have the same CPUs to ensure it's policy
   1285 	 * dominates.
   1286 	 */
   1287 	group_iter_init(&iter);
   1288 	while ((pg = group_iterate(hwset, &iter)) != NULL) {
   1289 		/*
   1290 		 * If the power domain is an only child to a parent
   1291 		 * not implementing the same policy, promote the child
   1292 		 * above the parent to activate the policy.
   1293 		 */
   1294 		pg->cmt_policy = pg_cmt_policy(((pghw_t *)pg)->pghw_hw);
   1295 		while ((pg->cmt_parent != NULL) &&
   1296 		    (pg->cmt_parent->cmt_policy != pg->cmt_policy) &&
   1297 		    (PG_NUM_CPUS((pg_t *)pg) ==
   1298 		    PG_NUM_CPUS((pg_t *)pg->cmt_parent))) {
   1299 			cmt_hier_promote(pg, NULL);
   1300 		}
   1301 	}
   1302 
   1303 	return (0);
   1304 }
   1305 
   1306 int
   1307 cmt_pad_disable(pghw_type_t type)
   1308 {
   1309 	group_t		*hwset;
   1310 	group_iter_t	iter;
   1311 	pg_cmt_t	*pg;
   1312 	pg_cmt_t	*child;
   1313 
   1314 	ASSERT(PGHW_IS_PM_DOMAIN(type));
   1315 	ASSERT(MUTEX_HELD(&cpu_lock));
   1316 
   1317 	if ((hwset = pghw_set_lookup(type)) == NULL) {
   1318 		/*
   1319 		 * Unable to find any instances of the specified type of
   1320 		 * power domain.
   1321 		 */
   1322 		return (-1);
   1323 	}
   1324 	/*
   1325 	 * Iterate over the power domains, setting the default dispatcher
   1326 	 * policy for performance optimization (load balancing).
   1327 	 */
   1328 	group_iter_init(&iter);
   1329 	while ((pg = group_iterate(hwset, &iter)) != NULL) {
   1330 
   1331 		/*
   1332 		 * If the power domain has an only child that implements
   1333 		 * policy other than load balancing, promote the child
   1334 		 * above the power domain to ensure it's policy dominates.
   1335 		 */
   1336 		if (pg->cmt_children != NULL &&
   1337 		    GROUP_SIZE(pg->cmt_children) == 1) {
   1338 			child = GROUP_ACCESS(pg->cmt_children, 0);
   1339 			if ((child->cmt_policy & CMT_BALANCE) == 0) {
   1340 				cmt_hier_promote(child, NULL);
   1341 			}
   1342 		}
   1343 		pg->cmt_policy = CMT_BALANCE;
   1344 	}
   1345 	return (0);
   1346 }
   1347 
   1348 /* ARGSUSED */
   1349 static void
   1350 cmt_ev_thread_swtch(pg_t *pg, cpu_t *cp, hrtime_t now, kthread_t *old,
   1351 		    kthread_t *new)
   1352 {
   1353 	pg_cmt_t	*cmt_pg = (pg_cmt_t *)pg;
   1354 
   1355 	if (old == cp->cpu_idle_thread) {
   1356 		atomic_add_32(&cmt_pg->cmt_utilization, 1);
   1357 	} else if (new == cp->cpu_idle_thread) {
   1358 		atomic_add_32(&cmt_pg->cmt_utilization, -1);
   1359 	}
   1360 }
   1361 
   1362 /*
   1363  * Macro to test whether a thread is currently runnable on a CPU in a PG.
   1364  */
   1365 #define	THREAD_RUNNABLE_IN_PG(t, pg)					\
   1366 	((t)->t_state == TS_RUN &&					\
   1367 	    (t)->t_disp_queue->disp_cpu &&				\
   1368 	    bitset_in_set(&(pg)->cmt_cpus_actv_set,			\
   1369 	    (t)->t_disp_queue->disp_cpu->cpu_seqid))
   1370 
   1371 static void
   1372 cmt_ev_thread_swtch_pwr(pg_t *pg, cpu_t *cp, hrtime_t now, kthread_t *old,
   1373     kthread_t *new)
   1374 {
   1375 	pg_cmt_t	*cmt = (pg_cmt_t *)pg;
   1376 	cpupm_domain_t	*dom;
   1377 	uint32_t	u;
   1378 
   1379 	if (old == cp->cpu_idle_thread) {
   1380 		ASSERT(new != cp->cpu_idle_thread);
   1381 		u = atomic_add_32_nv(&cmt->cmt_utilization, 1);
   1382 		if (u == 1) {
   1383 			/*
   1384 			 * Notify the CPU power manager that the domain
   1385 			 * is non-idle.
   1386 			 */
   1387 			dom = (cpupm_domain_t *)cmt->cmt_pg.pghw_handle;
   1388 			cpupm_utilization_event(cp, now, dom,
   1389 			    CPUPM_DOM_BUSY_FROM_IDLE);
   1390 		}
   1391 	} else if (new == cp->cpu_idle_thread) {
   1392 		ASSERT(old != cp->cpu_idle_thread);
   1393 		u = atomic_add_32_nv(&cmt->cmt_utilization, -1);
   1394 		if (u == 0) {
   1395 			/*
   1396 			 * The domain is idle, notify the CPU power
   1397 			 * manager.
   1398 			 *
   1399 			 * Avoid notifying if the thread is simply migrating
   1400 			 * between CPUs in the domain.
   1401 			 */
   1402 			if (!THREAD_RUNNABLE_IN_PG(old, cmt)) {
   1403 				dom = (cpupm_domain_t *)cmt->cmt_pg.pghw_handle;
   1404 				cpupm_utilization_event(cp, now, dom,
   1405 				    CPUPM_DOM_IDLE_FROM_BUSY);
   1406 			}
   1407 		}
   1408 	}
   1409 }
   1410 
   1411 /* ARGSUSED */
   1412 static void
   1413 cmt_ev_thread_remain_pwr(pg_t *pg, cpu_t *cp, kthread_t *t)
   1414 {
   1415 	pg_cmt_t	*cmt = (pg_cmt_t *)pg;
   1416 	cpupm_domain_t	*dom;
   1417 
   1418 	dom = (cpupm_domain_t *)cmt->cmt_pg.pghw_handle;
   1419 	cpupm_utilization_event(cp, (hrtime_t)0, dom, CPUPM_DOM_REMAIN_BUSY);
   1420 }
   1421 
   1422 /*
   1423  * Return the name of the CMT scheduling policy
   1424  * being implemented across this PG
   1425  */
   1426 static char *
   1427 pg_cmt_policy_name(pg_t *pg)
   1428 {
   1429 	pg_cmt_policy_t policy;
   1430 
   1431 	policy = ((pg_cmt_t *)pg)->cmt_policy;
   1432 
   1433 	if (policy & CMT_AFFINITY) {
   1434 		if (policy & CMT_BALANCE)
   1435 			return ("Load Balancing & Affinity");
   1436 		else if (policy & CMT_COALESCE)
   1437 			return ("Load Coalescence & Affinity");
   1438 		else
   1439 			return ("Affinity");
   1440 	} else {
   1441 		if (policy & CMT_BALANCE)
   1442 			return ("Load Balancing");
   1443 		else if (policy & CMT_COALESCE)
   1444 			return ("Load Coalescence");
   1445 		else
   1446 			return ("None");
   1447 	}
   1448 }
   1449 
   1450 /*
   1451  * Prune PG, and all other instances of PG's hardware sharing relationship
   1452  * from the CMT PG hierarchy.
   1453  *
   1454  * This routine operates on the CPU specific processor group data (for the CPUs
   1455  * in the PG being pruned), and may be invoked from a context where one CPU's
   1456  * PG data is under construction. In this case the argument "pgdata", if not
   1457  * NULL, is a reference to the CPU's under-construction PG data.
   1458  */
   1459 static int
   1460 pg_cmt_prune(pg_cmt_t *pg_bad, pg_cmt_t **lineage, int *sz, cpu_pg_t *pgdata)
   1461 {
   1462 	group_t		*hwset, *children;
   1463 	int		i, j, r, size = *sz;
   1464 	group_iter_t	hw_iter, child_iter;
   1465 	pg_cpu_itr_t	cpu_iter;
   1466 	pg_cmt_t	*pg, *child;
   1467 	cpu_t		*cpu;
   1468 	int		cap_needed;
   1469 	pghw_type_t	hw;
   1470 
   1471 	ASSERT(MUTEX_HELD(&cpu_lock));
   1472 
   1473 	hw = ((pghw_t *)pg_bad)->pghw_hw;
   1474 
   1475 	if (hw == PGHW_POW_ACTIVE) {
   1476 		cmn_err(CE_NOTE, "!Active CPUPM domain groups look suspect. "
   1477 		    "Event Based CPUPM Unavailable");
   1478 	} else if (hw == PGHW_POW_IDLE) {
   1479 		cmn_err(CE_NOTE, "!Idle CPUPM domain groups look suspect. "
   1480 		    "Dispatcher assisted CPUPM disabled.");
   1481 	}
   1482 
   1483 	/*
   1484 	 * Find and eliminate the PG from the lineage.
   1485 	 */
   1486 	for (i = 0; i < size; i++) {
   1487 		if (lineage[i] == pg_bad) {
   1488 			for (j = i; j < size - 1; j++)
   1489 				lineage[j] = lineage[j + 1];
   1490 			*sz = size - 1;
   1491 			break;
   1492 		}
   1493 	}
   1494 
   1495 	/*
   1496 	 * We'll prune all instances of the hardware sharing relationship
   1497 	 * represented by pg. But before we do that (and pause CPUs) we need
   1498 	 * to ensure the hierarchy's groups are properly sized.
   1499 	 */
   1500 	hwset = pghw_set_lookup(hw);
   1501 
   1502 	/*
   1503 	 * Blacklist the hardware so future processor groups of this type won't
   1504 	 * participate in CMT thread placement.
   1505 	 *
   1506 	 * XXX
   1507 	 * For heterogeneous system configurations, this might be overkill.
   1508 	 * We may only need to blacklist the illegal PGs, and other instances
   1509 	 * of this hardware sharing relationship may be ok.
   1510 	 */
   1511 	cmt_hw_blacklisted[hw] = 1;
   1512 
   1513 	/*
   1514 	 * For each of the PGs being pruned, ensure sufficient capacity in
   1515 	 * the siblings set for the PG's children
   1516 	 */
   1517 	group_iter_init(&hw_iter);
   1518 	while ((pg = group_iterate(hwset, &hw_iter)) != NULL) {
   1519 		/*
   1520 		 * PG is being pruned, but if it is bringing up more than
   1521 		 * one child, ask for more capacity in the siblings group.
   1522 		 */
   1523 		cap_needed = 0;
   1524 		if (pg->cmt_children &&
   1525 		    GROUP_SIZE(pg->cmt_children) > 1) {
   1526 			cap_needed = GROUP_SIZE(pg->cmt_children) - 1;
   1527 
   1528 			group_expand(pg->cmt_siblings,
   1529 			    GROUP_SIZE(pg->cmt_siblings) + cap_needed);
   1530 
   1531 			/*
   1532 			 * If this is a top level group, also ensure the
   1533 			 * capacity in the root lgrp level CMT grouping.
   1534 			 */
   1535 			if (pg->cmt_parent == NULL &&
   1536 			    pg->cmt_siblings != &cmt_root->cl_pgs) {
   1537 				group_expand(&cmt_root->cl_pgs,
   1538 				    GROUP_SIZE(&cmt_root->cl_pgs) + cap_needed);
   1539 				cmt_root->cl_npgs += cap_needed;
   1540 			}
   1541 		}
   1542 	}
   1543 
   1544 	/*
   1545 	 * We're operating on the PG hierarchy. Pause CPUs to ensure
   1546 	 * exclusivity with respect to the dispatcher.
   1547 	 */
   1548 	pause_cpus(NULL);
   1549 
   1550 	/*
   1551 	 * Prune all PG instances of the hardware sharing relationship
   1552 	 * represented by pg.
   1553 	 */
   1554 	group_iter_init(&hw_iter);
   1555 	while ((pg = group_iterate(hwset, &hw_iter)) != NULL) {
   1556 
   1557 		/*
   1558 		 * Remove PG from it's group of siblings, if it's there.
   1559 		 */
   1560 		if (pg->cmt_siblings) {
   1561 			(void) group_remove(pg->cmt_siblings, pg, GRP_NORESIZE);
   1562 		}
   1563 		if (pg->cmt_parent == NULL &&
   1564 		    pg->cmt_siblings != &cmt_root->cl_pgs) {
   1565 			(void) group_remove(&cmt_root->cl_pgs, pg,
   1566 			    GRP_NORESIZE);
   1567 		}
   1568 
   1569 		/*
   1570 		 * Indicate that no CMT policy will be implemented across
   1571 		 * this PG.
   1572 		 */
   1573 		pg->cmt_policy = CMT_NO_POLICY;
   1574 
   1575 		/*
   1576 		 * Move PG's children from it's children set to it's parent's
   1577 		 * children set. Note that the parent's children set, and PG's
   1578 		 * siblings set are the same thing.
   1579 		 *
   1580 		 * Because we are iterating over the same group that we are
   1581 		 * operating on (removing the children), first add all of PG's
   1582 		 * children to the parent's children set, and once we are done
   1583 		 * iterating, empty PG's children set.
   1584 		 */
   1585 		if (pg->cmt_children != NULL) {
   1586 			children = pg->cmt_children;
   1587 
   1588 			group_iter_init(&child_iter);
   1589 			while ((child = group_iterate(children, &child_iter))
   1590 			    != NULL) {
   1591 				if (pg->cmt_siblings != NULL) {
   1592 					r = group_add(pg->cmt_siblings, child,
   1593 					    GRP_NORESIZE);
   1594 					ASSERT(r == 0);
   1595 
   1596 					if (pg->cmt_parent == NULL &&
   1597 					    pg->cmt_siblings !=
   1598 					    &cmt_root->cl_pgs) {
   1599 						r = group_add(&cmt_root->cl_pgs,
   1600 						    child, GRP_NORESIZE);
   1601 						ASSERT(r == 0);
   1602 					}
   1603 				}
   1604 			}
   1605 			group_empty(pg->cmt_children);
   1606 		}
   1607 
   1608 		/*
   1609 		 * Reset the callbacks to the defaults
   1610 		 */
   1611 		pg_callback_set_defaults((pg_t *)pg);
   1612 
   1613 		/*
   1614 		 * Update all the CPU lineages in each of PG's CPUs
   1615 		 */
   1616 		PG_CPU_ITR_INIT(pg, cpu_iter);
   1617 		while ((cpu = pg_cpu_next(&cpu_iter)) != NULL) {
   1618 			pg_cmt_t	*cpu_pg;
   1619 			group_iter_t	liter;	/* Iterator for the lineage */
   1620 			cpu_pg_t	*cpd;	/* CPU's PG data */
   1621 
   1622 			/*
   1623 			 * The CPU's lineage is under construction still
   1624 			 * references the bootstrap CPU PG data structure.
   1625 			 */
   1626 			if (pg_cpu_is_bootstrapped(cpu))
   1627 				cpd = pgdata;
   1628 			else
   1629 				cpd = cpu->cpu_pg;
   1630 
   1631 			/*
   1632 			 * Iterate over the CPU's PGs updating the children
   1633 			 * of the PG being promoted, since they have a new
   1634 			 * parent and siblings set.
   1635 			 */
   1636 			group_iter_init(&liter);
   1637 			while ((cpu_pg = group_iterate(&cpd->pgs,
   1638 			    &liter)) != NULL) {
   1639 				if (cpu_pg->cmt_parent == pg) {
   1640 					cpu_pg->cmt_parent = pg->cmt_parent;
   1641 					cpu_pg->cmt_siblings = pg->cmt_siblings;
   1642 				}
   1643 			}
   1644 
   1645 			/*
   1646 			 * Update the CPU's lineages
   1647 			 *
   1648 			 * Remove the PG from the CPU's group used for CMT
   1649 			 * scheduling.
   1650 			 */
   1651 			(void) group_remove(&cpd->cmt_pgs, pg, GRP_NORESIZE);
   1652 		}
   1653 	}
   1654 	start_cpus();
   1655 	return (0);
   1656 }
   1657 
   1658 /*
   1659  * Disable CMT scheduling
   1660  */
   1661 static void
   1662 pg_cmt_disable(void)
   1663 {
   1664 	cpu_t		*cpu;
   1665 
   1666 	ASSERT(MUTEX_HELD(&cpu_lock));
   1667 
   1668 	pause_cpus(NULL);
   1669 	cpu = cpu_list;
   1670 
   1671 	do {
   1672 		if (cpu->cpu_pg)
   1673 			group_empty(&cpu->cpu_pg->cmt_pgs);
   1674 	} while ((cpu = cpu->cpu_next) != cpu_list);
   1675 
   1676 	cmt_sched_disabled = 1;
   1677 	start_cpus();
   1678 	cmn_err(CE_NOTE, "!CMT thread placement optimizations unavailable");
   1679 }
   1680 
   1681 /*
   1682  * CMT lineage validation
   1683  *
   1684  * This routine is invoked by pg_cmt_cpu_init() to validate the integrity
   1685  * of the PGs in a CPU's lineage. This is necessary because it's possible that
   1686  * some groupings (power domain groupings in particular) may be defined by
   1687  * sources that are buggy (e.g. BIOS bugs). In such cases, it may not be
   1688  * possible to integrate those groupings into the CMT PG hierarchy, if doing
   1689  * so would violate the subset invariant of the hierarchy, which says that
   1690  * a PG must be subset of its parent (if it has one).
   1691  *
   1692  * pg_cmt_lineage_validate()'s purpose is to detect grouping definitions that
   1693  * would result in a violation of this invariant. If a violation is found,
   1694  * and the PG is of a grouping type who's definition is known to originate from
   1695  * suspect sources (BIOS), then pg_cmt_prune() will be invoked to prune the
   1696  * PG (and all other instances PG's sharing relationship type) from the CMT
   1697  * hierarchy. Further, future instances of that sharing relationship type won't
   1698  * be added. If the grouping definition doesn't originate from suspect
   1699  * sources, then pg_cmt_disable() will be invoked to log an error, and disable
   1700  * CMT scheduling altogether.
   1701  *
   1702  * This routine is invoked after the CPU has been added to the PGs in which
   1703  * it belongs, but before those PGs have been added to (or had their place
   1704  * adjusted in) the CMT PG hierarchy.
   1705  *
   1706  * The first argument is the CPUs PG lineage (essentially an array of PGs in
   1707  * which the CPU belongs) that has already been sorted in ascending order
   1708  * by CPU count. Some of the PGs in the CPUs lineage may already have other
   1709  * CPUs in them, and have already been integrated into the CMT hierarchy.
   1710  *
   1711  * The addition of this new CPU to these pre-existing PGs means that those
   1712  * PGs may need to be promoted up in the hierarchy to satisfy the subset
   1713  * invariant. In additon to testing the subset invariant for the lineage,
   1714  * this routine also verifies that the addition of the new CPU to the
   1715  * existing PGs wouldn't cause the subset invariant to be violated in
   1716  * the exiting lineages.
   1717  *
   1718  * This routine will normally return one of the following:
   1719  * CMT_LINEAGE_VALID - There were no problems detected with the lineage.
   1720  * CMT_LINEAGE_REPAIRED - Problems were detected, but repaired via pruning.
   1721  *
   1722  * Otherwise, this routine will return a value indicating which error it
   1723  * was unable to recover from (and set cmt_lineage_status along the way).
   1724  *
   1725  * This routine operates on the CPU specific processor group data (for the CPU
   1726  * whose lineage is being validated), which is under-construction.
   1727  * "pgdata" is a reference to the CPU's under-construction PG data.
   1728  * This routine must be careful to operate only on "pgdata", and not cp->cpu_pg.
   1729  */
   1730 static cmt_lineage_validation_t
   1731 pg_cmt_lineage_validate(pg_cmt_t **lineage, int *sz, cpu_pg_t *pgdata)
   1732 {
   1733 	int		i, j, size;
   1734 	pg_cmt_t	*pg, *pg_next, *pg_bad, *pg_tmp, *parent;
   1735 	cpu_t		*cp;
   1736 	pg_cpu_itr_t	cpu_iter;
   1737 	lgrp_handle_t	lgrp;
   1738 
   1739 	ASSERT(MUTEX_HELD(&cpu_lock));
   1740 
   1741 revalidate:
   1742 	size = *sz;
   1743 	pg_bad = NULL;
   1744 	lgrp = LGRP_NULL_HANDLE;
   1745 	for (i = 0; i < size; i++) {
   1746 
   1747 		pg = lineage[i];
   1748 		if (i < size - 1)
   1749 			pg_next = lineage[i + 1];
   1750 		else
   1751 			pg_next = NULL;
   1752 
   1753 		/*
   1754 		 * We assume that the lineage has already been sorted
   1755 		 * by the number of CPUs. In fact, we depend on it.
   1756 		 */
   1757 		ASSERT(pg_next == NULL ||
   1758 		    (PG_NUM_CPUS((pg_t *)pg) <= PG_NUM_CPUS((pg_t *)pg_next)));
   1759 
   1760 		/*
   1761 		 * The CPUs PG lineage was passed as the first argument to
   1762 		 * this routine and contains the sorted list of the CPU's
   1763 		 * PGs. Ultimately, the ordering of the PGs in that list, and
   1764 		 * the ordering as traversed by the cmt_parent list must be
   1765 		 * the same. PG promotion will be used as the mechanism to
   1766 		 * achieve this, but first we need to look for cases where
   1767 		 * promotion will be necessary, and validate that will be
   1768 		 * possible without violating the subset invarient described
   1769 		 * above.
   1770 		 *
   1771 		 * Since the PG topology is in the middle of being changed, we
   1772 		 * need to check whether the PG's existing parent (if any) is
   1773 		 * part of this CPU's lineage (and therefore should contain
   1774 		 * the new CPU). If not, it means that the addition of the
   1775 		 * new CPU should have made this PG have more CPUs than its
   1776 		 * parent (and other ancestors not in the same lineage) and
   1777 		 * will need to be promoted into place.
   1778 		 *
   1779 		 * We need to verify all of this to defend against a buggy
   1780 		 * BIOS giving bad power domain CPU groupings. Sigh.
   1781 		 */
   1782 		parent = pg->cmt_parent;
   1783 		while (parent != NULL) {
   1784 			/*
   1785 			 * Determine if the parent/ancestor is in this lineage
   1786 			 */
   1787 			pg_tmp = NULL;
   1788 			for (j = 0; (j < size) && (pg_tmp != parent); j++) {
   1789 				pg_tmp = lineage[j];
   1790 			}
   1791 			if (pg_tmp == parent) {
   1792 				/*
   1793 				 * It's in the lineage. The concentricity
   1794 				 * checks will handle the rest.
   1795 				 */
   1796 				break;
   1797 			}
   1798 			/*
   1799 			 * If it is not in the lineage, PG will eventually
   1800 			 * need to be promoted above it. Verify the ancestor
   1801 			 * is a proper subset. There is still an error if
   1802 			 * the ancestor has the same number of CPUs as PG,
   1803 			 * since that would imply it should be in the lineage,
   1804 			 * and we already know it isn't.
   1805 			 */
   1806 			if (PG_NUM_CPUS((pg_t *)parent) >=
   1807 			    PG_NUM_CPUS((pg_t *)pg)) {
   1808 				/*
   1809 				 * Not a proper subset if the parent/ancestor
   1810 				 * has the same or more CPUs than PG.
   1811 				 */
   1812 				cmt_lineage_status = CMT_LINEAGE_NON_PROMOTABLE;
   1813 				goto handle_error;
   1814 			}
   1815 			parent = parent->cmt_parent;
   1816 		}
   1817 
   1818 		/*
   1819 		 * Walk each of the CPUs in the PGs group and perform
   1820 		 * consistency checks along the way.
   1821 		 */
   1822 		PG_CPU_ITR_INIT((pg_t *)pg, cpu_iter);
   1823 		while ((cp = pg_cpu_next(&cpu_iter)) != NULL) {
   1824 			/*
   1825 			 * Verify that there aren't any CPUs contained in PG
   1826 			 * that the next PG in the lineage (which is larger
   1827 			 * or same size) doesn't also contain.
   1828 			 */
   1829 			if (pg_next != NULL &&
   1830 			    pg_cpu_find((pg_t *)pg_next, cp) == B_FALSE) {
   1831 				cmt_lineage_status = CMT_LINEAGE_NON_CONCENTRIC;
   1832 				goto handle_error;
   1833 			}
   1834 
   1835 			/*
   1836 			 * Verify that all the CPUs in the PG are in the same
   1837 			 * lgroup.
   1838 			 */
   1839 			if (lgrp == LGRP_NULL_HANDLE) {
   1840 				lgrp = lgrp_plat_cpu_to_hand(cp->cpu_id);
   1841 			} else if (lgrp_plat_cpu_to_hand(cp->cpu_id) != lgrp) {
   1842 				cmt_lineage_status = CMT_LINEAGE_PG_SPANS_LGRPS;
   1843 				goto handle_error;
   1844 			}
   1845 		}
   1846 	}
   1847 
   1848 handle_error:
   1849 	/*
   1850 	 * Some of these validation errors can result when the CPU grouping
   1851 	 * information is derived from buggy sources (for example, incorrect
   1852 	 * ACPI tables on x86 systems).
   1853 	 *
   1854 	 * We'll try to recover in such cases by pruning out the illegal
   1855 	 * groupings from the PG hierarchy, which means that we won't optimize
   1856 	 * for those levels, but we will for the remaining ones.
   1857 	 */
   1858 	switch (cmt_lineage_status) {
   1859 	case CMT_LINEAGE_VALID:
   1860 	case CMT_LINEAGE_REPAIRED:
   1861 		break;
   1862 	case CMT_LINEAGE_PG_SPANS_LGRPS:
   1863 		/*
   1864 		 * We've detected a PG whose CPUs span lgroups.
   1865 		 *
   1866 		 * This isn't supported, as the dispatcher isn't allowed to
   1867 		 * to do CMT thread placement across lgroups, as this would
   1868 		 * conflict with policies implementing MPO thread affinity.
   1869 		 *
   1870 		 * If the PG is of a sharing relationship type known to
   1871 		 * legitimately span lgroups, specify that no CMT thread
   1872 		 * placement policy should be implemented, and prune the PG
   1873 		 * from the existing CMT PG hierarchy.
   1874 		 *
   1875 		 * Otherwise, fall though to the case below for handling.
   1876 		 */
   1877 		if (((pghw_t *)pg)->pghw_hw == PGHW_CHIP) {
   1878 			if (pg_cmt_prune(pg, lineage, sz, pgdata) == 0) {
   1879 				cmt_lineage_status = CMT_LINEAGE_REPAIRED;
   1880 				goto revalidate;
   1881 			}
   1882 		}
   1883 		/*LINTED*/
   1884 	case CMT_LINEAGE_NON_PROMOTABLE:
   1885 		/*
   1886 		 * We've detected a PG that already exists in another CPU's
   1887 		 * lineage that cannot cannot legally be promoted into place
   1888 		 * without breaking the invariants of the hierarchy.
   1889 		 */
   1890 		if (PG_CMT_HW_SUSPECT(((pghw_t *)pg)->pghw_hw)) {
   1891 			if (pg_cmt_prune(pg, lineage, sz, pgdata) == 0) {
   1892 				cmt_lineage_status = CMT_LINEAGE_REPAIRED;
   1893 				goto revalidate;
   1894 			}
   1895 		}
   1896 		/*
   1897 		 * Something went wrong trying to prune out the bad level.
   1898 		 * Disable CMT scheduling altogether.
   1899 		 */
   1900 		pg_cmt_disable();
   1901 		break;
   1902 	case CMT_LINEAGE_NON_CONCENTRIC:
   1903 		/*
   1904 		 * We've detected a non-concentric PG lineage, which means that
   1905 		 * there's a PG in the lineage that has CPUs that the next PG
   1906 		 * over in the lineage (which is the same size or larger)
   1907 		 * doesn't have.
   1908 		 *
   1909 		 * In this case, we examine the two PGs to see if either
   1910 		 * grouping is defined by potentially buggy sources.
   1911 		 *
   1912 		 * If one has less CPUs than the other, and contains CPUs
   1913 		 * not found in the parent, and it is an untrusted enumeration,
   1914 		 * then prune it. If both have the same number of CPUs, then
   1915 		 * prune the one that is untrusted.
   1916 		 *
   1917 		 * This process repeats until we have a concentric lineage,
   1918 		 * or we would have to prune out level derived from what we
   1919 		 * thought was a reliable source, in which case CMT scheduling
   1920 		 * is disabled altogether.
   1921 		 */
   1922 		if ((PG_NUM_CPUS((pg_t *)pg) < PG_NUM_CPUS((pg_t *)pg_next)) &&
   1923 		    (PG_CMT_HW_SUSPECT(((pghw_t *)pg)->pghw_hw))) {
   1924 			pg_bad = pg;
   1925 		} else if (PG_NUM_CPUS((pg_t *)pg) ==
   1926 		    PG_NUM_CPUS((pg_t *)pg_next)) {
   1927 			if (PG_CMT_HW_SUSPECT(((pghw_t *)pg_next)->pghw_hw)) {
   1928 				pg_bad = pg_next;
   1929 			} else if (PG_CMT_HW_SUSPECT(((pghw_t *)pg)->pghw_hw)) {
   1930 				pg_bad = pg;
   1931 			}
   1932 		}
   1933 		if (pg_bad) {
   1934 			if (pg_cmt_prune(pg_bad, lineage, sz, pgdata) == 0) {
   1935 				cmt_lineage_status = CMT_LINEAGE_REPAIRED;
   1936 				goto revalidate;
   1937 			}
   1938 		}
   1939 		/*
   1940 		 * Something went wrong trying to identify and/or prune out
   1941 		 * the bad level. Disable CMT scheduling altogether.
   1942 		 */
   1943 		pg_cmt_disable();
   1944 		break;
   1945 	default:
   1946 		/*
   1947 		 * If we're here, we've encountered a validation error for
   1948 		 * which we don't know how to recover. In this case, disable
   1949 		 * CMT scheduling altogether.
   1950 		 */
   1951 		cmt_lineage_status = CMT_LINEAGE_UNRECOVERABLE;
   1952 		pg_cmt_disable();
   1953 	}
   1954 	return (cmt_lineage_status);
   1955 }
   1956