From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753069AbbFIJaK (ORCPT ); Tue, 9 Jun 2015 05:30:10 -0400 Received: from casper.infradead.org ([85.118.1.10]:49193 "EHLO casper.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752228AbbFIJaB (ORCPT ); Tue, 9 Jun 2015 05:30:01 -0400 Date: Tue, 9 Jun 2015 11:29:52 +0200 From: Peter Zijlstra To: Huang Rui Cc: Borislav Petkov , Andy Lutomirski , Thomas Gleixner , "Rafael J. Wysocki" , Len Brown , John Stultz , =?iso-8859-1?Q?Fr=E9d=E9ric?= Weisbecker , linux-kernel@vger.kernel.org, x86@kernel.org, Fengguang Wu , Aaron Lu , Suravee Suthikulanit , Tony Li , Ken Xue Subject: Re: [PATCH v2 3/4] x86, mwaitt: introduce mwaix delay with a configurable timer Message-ID: <20150609092952.GR3644@twins.programming.kicks-ass.net> References: <1433819621-15093-1-git-send-email-ray.huang@amd.com> <1433819621-15093-4-git-send-email-ray.huang@amd.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1433819621-15093-4-git-send-email-ray.huang@amd.com> User-Agent: Mutt/1.5.21 (2012-12-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Jun 09, 2015 at 11:13:40AM +0800, Huang Rui wrote: > +static void delay_mwaitx(unsigned long __loops) > +{ > + u32 end, now, delay, addr; > + > + delay = __loops; > + rdtsc_barrier(); > + rdtscl(end); > + end += delay; > + > + while (1) { > + __monitorx(&addr, 0, 0); > + mwaitx(delay, true); > + > + rdtsc_barrier(); > + rdtscl(now); > + if (end <= now) > + break; > + delay = end - now; > + } How about you think instead and do something like: rdtsc(start); rdtsc_barrier(); for (;;) { delay = min(MWAIT_MAX_LOOPS, loops); __monitorx(&addr, 0, 0); mwaitx(delay, true); rdtsc_barrier(); rdtsc(end); rdtsc_barrier(); loops -= end - start; if (loops <= 0) break; start = end; } > +} > + > +/* > * Since we calibrate only once at boot, this > * function should be set once at boot and not changed > */ > @@ -118,7 +145,12 @@ int read_current_timer(unsigned long *timer_val) > > void __delay(unsigned long loops) > { > - delay_fn(loops); > + if (loops > MWAITX_MAX_LOOPS || > + !static_cpu_has_safe(X86_FEATURE_MWAITT) || > + boot_option_delay != DELAY_MWAITX) > + delay_fn(loops); > + else > + delay_mwaitx(loops); > } Then you can do away with that fallback entirely.