Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 86f343b5 authored by Paul E. McKenney's avatar Paul E. McKenney Committed by Paul E. McKenney
Browse files

rcu: Fix CONFIG_RCU_FAST_NO_HZ stall warning message



The print_cpu_stall_fast_no_hz() function attempts to print -1 when
the ->idle_gp_timer is not pending, but unsigned arithmetic causes it
to instead print ULONG_MAX, which is 4294967295 on 32-bit systems and
18446744073709551615 on 64-bit systems.  Neither of these are the most
reader-friendly values, so this commit instead causes "timer not pending"
to be printed when ->idle_gp_timer is not pending.

Reported-by: default avatarPaul Walmsley <paul@pwsan.com>
Signed-off-by: default avatarPaul E. McKenney <paul.mckenney@linaro.org>
Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
parent 22a76726
Loading
Loading
Loading
Loading
+8 −8
Original line number Original line Diff line number Diff line
@@ -99,7 +99,7 @@ In kernels with CONFIG_RCU_FAST_NO_HZ, even more information is
printed:
printed:


	INFO: rcu_preempt detected stall on CPU
	INFO: rcu_preempt detected stall on CPU
	0: (64628 ticks this GP) idle=dd5/3fffffffffffffff/0 drain=0 . timer=-1
	0: (64628 ticks this GP) idle=dd5/3fffffffffffffff/0 drain=0 . timer not pending
	   (t=65000 jiffies)
	   (t=65000 jiffies)


The "(64628 ticks this GP)" indicates that this CPU has taken more
The "(64628 ticks this GP)" indicates that this CPU has taken more
@@ -116,13 +116,13 @@ number between the two "/"s is the value of the nesting, which will
be a small positive number if in the idle loop and a very large positive
be a small positive number if in the idle loop and a very large positive
number (as shown above) otherwise.
number (as shown above) otherwise.


For CONFIG_RCU_FAST_NO_HZ kernels, the "drain=0" indicates that the
For CONFIG_RCU_FAST_NO_HZ kernels, the "drain=0" indicates that the CPU is
CPU is not in the process of trying to force itself into dyntick-idle
not in the process of trying to force itself into dyntick-idle state, the
state, the "." indicates that the CPU has not given up forcing RCU
"." indicates that the CPU has not given up forcing RCU into dyntick-idle
into dyntick-idle mode (it would be "H" otherwise), and the "timer=-1"
mode (it would be "H" otherwise), and the "timer not pending" indicates
indicates that the CPU has not recented forced RCU into dyntick-idle
that the CPU has not recently forced RCU into dyntick-idle mode (it
mode (it would otherwise indicate the number of microseconds remaining
would otherwise indicate the number of microseconds remaining in this
in this forced state).
forced state).




Multiple Warnings From One Stall
Multiple Warnings From One Stall
+8 −4
Original line number Original line Diff line number Diff line
@@ -2130,11 +2130,15 @@ static void print_cpu_stall_fast_no_hz(char *cp, int cpu)
{
{
	struct rcu_dynticks *rdtp = &per_cpu(rcu_dynticks, cpu);
	struct rcu_dynticks *rdtp = &per_cpu(rcu_dynticks, cpu);
	struct timer_list *tltp = &rdtp->idle_gp_timer;
	struct timer_list *tltp = &rdtp->idle_gp_timer;
	char c;


	c = rdtp->dyntick_holdoff == jiffies ? 'H' : '.';
	if (timer_pending(tltp))
		sprintf(cp, "drain=%d %c timer=%lu",
		sprintf(cp, "drain=%d %c timer=%lu",
		rdtp->dyntick_drain,
			rdtp->dyntick_drain, c, tltp->expires - jiffies);
		rdtp->dyntick_holdoff == jiffies ? 'H' : '.',
	else
		timer_pending(tltp) ? tltp->expires - jiffies : -1);
		sprintf(cp, "drain=%d %c timer not pending",
			rdtp->dyntick_drain, c);
}
}


#else /* #ifdef CONFIG_RCU_FAST_NO_HZ */
#else /* #ifdef CONFIG_RCU_FAST_NO_HZ */