From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758273AbcATJW6 (ORCPT ); Wed, 20 Jan 2016 04:22:58 -0500 Received: from www.linutronix.de ([62.245.132.108]:57486 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751562AbcATJWy (ORCPT ); Wed, 20 Jan 2016 04:22:54 -0500 Date: Wed, 20 Jan 2016 10:21:53 +0100 (CET) From: Thomas Gleixner To: Jeff Merkey cc: LKML , John Stultz Subject: Re: [BUG REPORT] ktime_get_ts64 causes Hard Lockup In-Reply-To: Message-ID: References: User-Agent: Alpine 2.11 (DEB 23 2013-08-11) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Linutronix-Spam-Score: -1.0 X-Linutronix-Spam-Level: - X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,SHORTCIRCUIT=-0.0001 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, 19 Jan 2016, Jeff Merkey wrote: > Nasty bug but trivial fix for this. What happens here is RAX (nsecs) > gets set to a huge value (RAX = 0x17AE7F57C671EA7D) and passed through And how exactly does that happen? 0x17AE7F57C671EA7D = 1.70644e+18 nsec = 1.70644e+09 sec = 2.84407e+07 min = 474011 hrs = 19750.5 days = 54.1109 years That's the real issue, not what you are trying to 'fix' in timespec_add_ns() > Submitting a patch to fix this after I regress and test it. Since it > makes no sense to loop on a simple calculation, fix should be: > > static __always_inline void timespec_add_ns(struct timespec *a, u64 ns) > { > a->tv_sec += div64_u64_rem(a->tv_nsec + ns, NSEC_PER_SEC, &ns); > a->tv_nsec = ns; > } No. It's not that simple, because div64_u64_rem() is expensive on 32bit architectures which have no hardware 64/32 division. And that's going to hurt for the normal tick case where we have at max one iteration. Thanks, tglx