changeset 12999:9e5c3f16523e

6965789 Migrated domain hangs if it has cpus that are offline, faulted or spare.
author Haik Aftandilian <Haik.Aftandilian@Oracle.COM>
date Mon, 02 Aug 2010 12:21:53 -0700
parents 04c3fb904c79
children 28d31e0a7784
files usr/src/uts/sun4v/os/suspend.c
diffstat 1 files changed, 7 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/sun4v/os/suspend.c	Mon Aug 02 10:54:24 2010 -0700
+++ b/usr/src/uts/sun4v/os/suspend.c	Mon Aug 02 12:21:53 2010 -0700
@@ -385,13 +385,16 @@
 	 * so while CPUs are paused, call pg_cpu_inactive and swap in the
 	 * bootstrap PG structure saving the original PG structure to be
 	 * fini'd afterwards. This prevents the dispatcher from encountering
-	 * PGs in which all CPUs are inactive.
+	 * PGs in which all CPUs are inactive. Offline CPUs are already
+	 * inactive in their PGs and shouldn't be reactivated, so we must
+	 * not call pg_cpu_inactive or pg_cpu_active for those CPUs.
 	 */
 	pause_cpus(NULL);
 	for (id = 0; id < NCPU; id++) {
 		if ((cp = cpu_get(id)) == NULL)
 			continue;
-		pg_cpu_inactive(cp);
+		if ((cp->cpu_flags & CPU_OFFLINE) == 0)
+			pg_cpu_inactive(cp);
 		pgps[id] = cp->cpu_pg;
 		pg_cpu_bootstrap(cp);
 	}
@@ -432,7 +435,8 @@
 		if ((cp = cpu_get(id)) == NULL)
 			continue;
 		cp->cpu_pg = pgps[id];
-		pg_cpu_active(cp);
+		if ((cp->cpu_flags & CPU_OFFLINE) == 0)
+			pg_cpu_active(cp);
 	}
 	start_cpus();