From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Jan Beulich" Subject: [PATCH] x86: freeze non-current vCPU-s of dom0 before entering S5 Date: Thu, 20 Nov 2008 13:42:30 +0000 Message-ID: <49257756.76E4.0078.0@novell.com> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Return-path: Content-Disposition: inline List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org Also excluding the idle domain from the domains being frozen. This seems to be particularly important for 3.2 and 3.3, -unstable should be fine since the non-idle-vCPU-s are being migrated away from the pCPU-s being torn down. Signed-off-by: Jan Beulich Index: 2008-11-20/xen/arch/x86/acpi/power.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- 2008-11-20.orig/xen/arch/x86/acpi/power.c 2008-11-19 17:37:33.0000000= 00 +0100 +++ 2008-11-20/xen/arch/x86/acpi/power.c 2008-11-20 10:07:54.0000000= 00 +0100 @@ -77,19 +77,51 @@ static void device_power_up(void) static void freeze_domains(void) { struct domain *d; + struct vcpu *v; =20 + rcu_read_lock(&domlist_read_lock); for_each_domain ( d ) - if ( d->domain_id !=3D 0 ) + { + switch ( d->domain_id ) + { + default: domain_pause(d); + break; + case 0: + for_each_vcpu ( d, v ) + if ( v !=3D current ) + vcpu_pause(v); + break; + case IDLE_DOMAIN_ID: + break; + } + } + rcu_read_unlock(&domlist_read_lock); } =20 static void thaw_domains(void) { struct domain *d; + struct vcpu *v; =20 + rcu_read_lock(&domlist_read_lock); for_each_domain ( d ) - if ( d->domain_id !=3D 0 ) + { + switch ( d->domain_id ) + { + default: domain_unpause(d); + break; + case 0: + for_each_vcpu ( d, v ) + if ( v !=3D current ) + vcpu_unpause(v); + break; + case IDLE_DOMAIN_ID: + break; + } + } + rcu_read_unlock(&domlist_read_lock); } =20 static void acpi_sleep_prepare(u32 state)