On Fri, Jan 26, 2018 at 10:21:58AM +0100, Arnd Bergmann wrote: > On Fri, Jan 26, 2018 at 4:03 AM, Baolin Wang <baolin.w...@linaro.org> 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 <baolin.w...@linaro.org> > > --- > > 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.