From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755678Ab1JQWF7 (ORCPT ); Mon, 17 Oct 2011 18:05:59 -0400 Received: from mx2.mail.elte.hu ([157.181.151.9]:58463 "EHLO mx2.mail.elte.hu" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754185Ab1JQWF4 (ORCPT ); Mon, 17 Oct 2011 18:05:56 -0400 Date: Tue, 18 Oct 2011 00:04:26 +0200 From: Ingo Molnar To: "H. Peter Anvin" Cc: Thomas Gleixner , Linus Torvalds , Simon Kirby , Peter Zijlstra , Linux Kernel Mailing List , Dave Jones , Martin Schwidefsky Subject: Re: Linux 3.1-rc9 Message-ID: <20111017220425.GB18523@elte.hu> References: <20111013232521.GA5654@hostway.ca> <20111017045806.GA11561@elte.hu> <20111017184916.GA5545@elte.hu> <4E9C917B.2050802@zytor.com> <20111017211951.GA8043@elte.hu> <4E9C9CAE.9090207@zytor.com> <20111017213958.GA27126@elte.hu> <20111017220321.GA18523@elte.hu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20111017220321.GA18523@elte.hu> User-Agent: Mutt/1.5.21 (2010-09-15) X-ELTE-SpamScore: -2.0 X-ELTE-SpamLevel: X-ELTE-SpamCheck: no X-ELTE-SpamVersion: ELTE 2.0 X-ELTE-SpamCheck-Details: score=-2.0 required=5.9 tests=BAYES_00 autolearn=no SpamAssassin version=3.3.1 -2.0 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org * Ingo Molnar wrote: > > * Ingo Molnar wrote: > > > > > In particular we could try something like: > > > > > > > > (high*2^32 + low)/1e9 ~== ( high * (2^64/1e9) ) / 2^32 > > > > > > > > ... which reduces it all to a 64-bit multiplication (or two > > > > 32-bit multiplications) with a known constant, at the cost of 1 > > > > nsec imprecision of the result - but that's an OK approximation > > > > in my opinion. > > > > > > > > > > We can do much better than that with reciprocal multiplication. > > > > Yes, 2^64/1e9 is the reciprocal. > > So basically, to extend on the pseudocode above, we could do the > equivalent of: > > /* 2^64/1e9: */ > #define MAGIC 18446744073ULL > > secs_fast = ((nsecs >> 32) * MAGIC) >> 32; > secs_fast += (nsecs & 0xFFFFFFFF)/1000000000; > > to get to the precise 'timeval.secs' field - these are all 32-bit > operations: a 32-bit multiplication and a 32-bit division if i > counted it right. > > (Likewise we can get the remainder as well, for timeval.nsecs.) that's timespec.nsecs - there's timeval.usecs. The same argument applies in both cases. This would deobfuscate a rather important data type in the timer code. Thanks, Ingo