From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752930AbeAZOAl (ORCPT ); Fri, 26 Jan 2018 09:00:41 -0500 Received: from mail-wm0-f66.google.com ([74.125.82.66]:54285 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752747AbeAZOAi (ORCPT ); Fri, 26 Jan 2018 09:00:38 -0500 X-Google-Smtp-Source: AH8x226/3j+sw/sfteufku8Gl76l7NA8OEvUaxb4Lc8s5xFWLs7CQKQLuqSi8X0KxMuXMhZgl6DB1w== Date: Fri, 26 Jan 2018 14:00:33 +0000 From: Daniel Thompson To: Arnd Bergmann Cc: Baolin Wang , Jason Wessel , Ingo Molnar , Mark Brown , kgdb-bugreport@lists.sourceforge.net, Linux Kernel Mailing List Subject: Re: [PATCH] kdb: use ktime_get_seconds() instead of ktime_get_ts() Message-ID: <20180126140033.ix2n7j62k6iccmdh@oak.lan> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: NeoMutt/20170113 (1.7.2) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Jan 26, 2018 at 10:21:58AM +0100, Arnd Bergmann wrote: > On Fri, Jan 26, 2018 at 4:03 AM, Baolin Wang wrote: > > The kdb code will print the monotonic time by ktime_get_ts(), but > > the ktime_get_ts() will be protected by a sequence lock, that will > > introduce one deadlock risk if the lock was already held in the > > context from which we entered the debugger. > > > > Since kdb is only interested in the second field, we can use the > > ktime_get_seconds() to get the monotonic time without a lock, > > moreover we can remove the 'struct timespec', which is not y2038 > > safe. > > > > Signed-off-by: Baolin Wang > > --- > > kernel/debug/kdb/kdb_main.c | 4 +--- > > 1 file changed, 1 insertion(+), 3 deletions(-) > > > > diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c > > index 69e70f4..f0fc6f7 100644 > > --- a/kernel/debug/kdb/kdb_main.c > > +++ b/kernel/debug/kdb/kdb_main.c > > @@ -2486,10 +2486,8 @@ static int kdb_kill(int argc, const char **argv) > > */ > > static void kdb_sysinfo(struct sysinfo *val) > > { > > - struct timespec uptime; > > - ktime_get_ts(&uptime); > > memset(val, 0, sizeof(*val)); > > - val->uptime = uptime.tv_sec; > > + val->uptime = ktime_get_seconds(); > > val->loads[0] = avenrun[0]; > > val->loads[1] = avenrun[1]; > > val->loads[2] = avenrun[2]; > > Using ktime_get_seconds() avoids locking problems, but I wonder what > would happen if we trigger the 'WARN_ON(timekeeping_suspended)' > from kdb. Is that a problem? If it is, we have to use ktime_get_mono_fast_ns() > and div_u64() instead. Normally a WARN_ON() doesn't triggered a kgdb_breakpoint() so (apart from bugs) we can start executing the warning. Unfortunately kdb_trap_printk isn't set when we call ktime_get_seconds() so printing the warning isn't safe. If we had no choice of time function we could work around by enabling printk() trapping for the call but since ktime_get_mono_fast_ns() already exists its probably best just to use that. Daniel.