From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757342AbaHEIlm (ORCPT ); Tue, 5 Aug 2014 04:41:42 -0400 Received: from mail.skyhub.de ([78.46.96.112]:45716 "EHLO mail.skyhub.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757245AbaHEIlk (ORCPT ); Tue, 5 Aug 2014 04:41:40 -0400 Date: Tue, 5 Aug 2014 10:41:35 +0200 From: Borislav Petkov To: Lan Tianyu Cc: tglx@linutronix.de, mingo@redhat.com, hpa@zytor.com, x86@kernel.org, toshi.kani@hp.com, imammedo@redhat.com, jan.kiszka@siemens.com, mingo@kernel.org, huawei.libin@huawei.com, prarit@redhat.com, linux-kernel@vger.kernel.org, Peter Zijlstra Subject: Re: [PATCH] X86/CPU: Avoid 100ms sleep for cpu offline during S3 Message-ID: <20140805084135.GB18234@pd.tnic> References: <1407142742-29202-1-git-send-email-tianyu.lan@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <1407142742-29202-1-git-send-email-tianyu.lan@intel.com> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Aug 04, 2014 at 04:59:02PM +0800, Lan Tianyu wrote: > Some test result shows cpu offline consumes more than 100ms during S3. > After some researchs, found native_cpu_die() would fall into 100ms > sleep if cpu idle loop thread marked cpu state slower. What native_cpu_die() > does is that poll cpu state and wait for 100ms if cpu state hasn't been marked > to DEAD. The 100ms sleep doesn't make sense. To avoid such long sleep, this > patch is to add struct completion to each cpu, wait for the completion > in the native_cpu_die() and wakeup the completion when the cpu state is > marked to DEAD. > > Signed-off-by: Lan Tianyu > --- > arch/x86/kernel/smpboot.c | 26 ++++++++++++++------------ > 1 file changed, 14 insertions(+), 12 deletions(-) ... > @@ -1339,18 +1342,16 @@ int native_cpu_disable(void) > void native_cpu_die(unsigned int cpu) > { > /* We don't do anything here: idle task is faking death itself. */ > - unsigned int i; > + wait_for_completion_timeout(&per_cpu(die_complete, cpu), > + msecs_to_jiffies(1000)); One more thing peterz suggested. Just do: wait_for_completion_timeout(&per_cpu(die_complete, cpu), HZ); because HZ is the number of jiffies in a second. Which is what you want here. -- Regards/Gruss, Boris. Sent from a fat crate under my desk. Formatting is fine. --