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

Commit 6d876693 authored by Paul E. McKenney's avatar Paul E. McKenney
Browse files

Merge branches 'doc.2013.03.12a', 'fixes.2013.03.13a' and 'idlenocb.2013.03.26b' into HEAD

doc.2013.03.12a: Documentation changes.

fixes.2013.03.13a: Miscellaneous fixes.

idlenocb.2013.03.26b: Remove restrictions on no-CBs CPUs, make
	RCU_FAST_NO_HZ take advantage of numbered callbacks, add
	callback acceleration based on numbered callbacks.
Loading
Loading
Loading
Loading
+24 −9
Original line number Original line Diff line number Diff line
@@ -92,14 +92,14 @@ If the CONFIG_RCU_CPU_STALL_INFO kernel configuration parameter is set,
more information is printed with the stall-warning message, for example:
more information is printed with the stall-warning message, for example:


	INFO: rcu_preempt detected stall on CPU
	INFO: rcu_preempt detected stall on CPU
	0: (63959 ticks this GP) idle=241/3fffffffffffffff/0
	0: (63959 ticks this GP) idle=241/3fffffffffffffff/0 softirq=82/543
	   (t=65000 jiffies)
	   (t=65000 jiffies)


In kernels with CONFIG_RCU_FAST_NO_HZ, even more information is
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 not pending
	0: (64628 ticks this GP) idle=dd5/3fffffffffffffff/0 softirq=82/543 last_accelerate: a345/d342 nonlazy_posted: 25 .D
	   (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,28 @@ 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 CPU is
The "softirq=" portion of the message tracks the number of RCU softirq
not in the process of trying to force itself into dyntick-idle state, the
handlers that the stalled CPU has executed.  The number before the "/"
"." indicates that the CPU has not given up forcing RCU into dyntick-idle
is the number that had executed since boot at the time that this CPU
mode (it would be "H" otherwise), and the "timer not pending" indicates
last noted the beginning of a grace period, which might be the current
that the CPU has not recently forced RCU into dyntick-idle mode (it
(stalled) grace period, or it might be some earlier grace period (for
would otherwise indicate the number of microseconds remaining in this
example, if the CPU might have been in dyntick-idle mode for an extended
forced state).
time period.  The number after the "/" is the number that have executed
since boot until the current time.  If this latter number stays constant
across repeated stall-warning messages, it is possible that RCU's softirq
handlers are no longer able to execute on this CPU.  This can happen if
the stalled CPU is spinning with interrupts are disabled, or, in -rt
kernels, if a high-priority process is starving RCU's softirq handler.

For CONFIG_RCU_FAST_NO_HZ kernels, the "last_accelerate:" prints the
low-order 16 bits (in hex) of the jiffies counter when this CPU last
invoked rcu_try_advance_all_cbs() from rcu_needs_cpu() or last invoked
rcu_accelerate_cbs() from rcu_prepare_for_idle().  The "nonlazy_posted:"
prints the number of non-lazy callbacks posted since the last call to
rcu_needs_cpu().  Finally, an "L" indicates that there are currently
no non-lazy callbacks ("." is printed otherwise, as shown above) and
"D" indicates that dyntick-idle processing is enabled ("." is printed
otherwise, for example, if disabled via the "nohz=" kernel boot parameter).




Multiple Warnings From One Stall
Multiple Warnings From One Stall
+24 −11
Original line number Original line Diff line number Diff line
@@ -2461,9 +2461,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
			In kernels built with CONFIG_RCU_NOCB_CPU=y, set
			In kernels built with CONFIG_RCU_NOCB_CPU=y, set
			the specified list of CPUs to be no-callback CPUs.
			the specified list of CPUs to be no-callback CPUs.
			Invocation of these CPUs' RCU callbacks will
			Invocation of these CPUs' RCU callbacks will
			be offloaded to "rcuoN" kthreads created for
			be offloaded to "rcuox/N" kthreads created for
			that purpose.  This reduces OS jitter on the
			that purpose, where "x" is "b" for RCU-bh, "p"
			for RCU-preempt, and "s" for RCU-sched, and "N"
			is the CPU number.  This reduces OS jitter on the
			offloaded CPUs, which can be useful for HPC and
			offloaded CPUs, which can be useful for HPC and

			real-time workloads.  It can also improve energy
			real-time workloads.  It can also improve energy
			efficiency for asymmetric multiprocessors.
			efficiency for asymmetric multiprocessors.


@@ -2487,6 +2490,17 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
			leaf rcu_node structure.  Useful for very large
			leaf rcu_node structure.  Useful for very large
			systems.
			systems.


	rcutree.jiffies_till_first_fqs= [KNL,BOOT]
			Set delay from grace-period initialization to
			first attempt to force quiescent states.
			Units are jiffies, minimum value is zero,
			and maximum value is HZ.

	rcutree.jiffies_till_next_fqs= [KNL,BOOT]
			Set delay between subsequent attempts to force
			quiescent states.  Units are jiffies, minimum
			value is one, and maximum value is HZ.

	rcutree.qhimark=	[KNL,BOOT]
	rcutree.qhimark=	[KNL,BOOT]
			Set threshold of queued
			Set threshold of queued
			RCU callbacks over which batch limiting is disabled.
			RCU callbacks over which batch limiting is disabled.
@@ -2501,16 +2515,15 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
	rcutree.rcu_cpu_stall_timeout= [KNL,BOOT]
	rcutree.rcu_cpu_stall_timeout= [KNL,BOOT]
			Set timeout for RCU CPU stall warning messages.
			Set timeout for RCU CPU stall warning messages.


	rcutree.jiffies_till_first_fqs= [KNL,BOOT]
	rcutree.rcu_idle_gp_delay=	[KNL,BOOT]
			Set delay from grace-period initialization to
			Set wakeup interval for idle CPUs that have
			first attempt to force quiescent states.
			RCU callbacks (RCU_FAST_NO_HZ=y).
			Units are jiffies, minimum value is zero,
			and maximum value is HZ.


	rcutree.jiffies_till_next_fqs= [KNL,BOOT]
	rcutree.rcu_idle_lazy_gp_delay=	[KNL,BOOT]
			Set delay between subsequent attempts to force
			Set wakeup interval for idle CPUs that have
			quiescent states.  Units are jiffies, minimum
			only "lazy" RCU callbacks (RCU_FAST_NO_HZ=y).
			value is one, and maximum value is HZ.
			Lazy RCU callbacks are those which RCU can
			prove do nothing more than free memory.


	rcutorture.fqs_duration= [KNL,BOOT]
	rcutorture.fqs_duration= [KNL,BOOT]
			Set duration of force_quiescent_state bursts.
			Set duration of force_quiescent_state bursts.
+5 −0
Original line number Original line Diff line number Diff line
@@ -125,6 +125,11 @@ static inline void hlist_bl_unlock(struct hlist_bl_head *b)
	__bit_spin_unlock(0, (unsigned long *)b);
	__bit_spin_unlock(0, (unsigned long *)b);
}
}


static inline bool hlist_bl_is_locked(struct hlist_bl_head *b)
{
	return bit_spin_is_locked(0, (unsigned long *)b);
}

/**
/**
 * hlist_bl_for_each_entry	- iterate over list of given type
 * hlist_bl_for_each_entry	- iterate over list of given type
 * @tpos:	the type * to use as a loop cursor.
 * @tpos:	the type * to use as a loop cursor.
+1 −1
Original line number Original line Diff line number Diff line
@@ -20,7 +20,7 @@ static inline void hlist_bl_set_first_rcu(struct hlist_bl_head *h,
static inline struct hlist_bl_node *hlist_bl_first_rcu(struct hlist_bl_head *h)
static inline struct hlist_bl_node *hlist_bl_first_rcu(struct hlist_bl_head *h)
{
{
	return (struct hlist_bl_node *)
	return (struct hlist_bl_node *)
		((unsigned long)rcu_dereference(h->first) & ~LIST_BL_LOCKMASK);
		((unsigned long)rcu_dereference_check(h->first, hlist_bl_is_locked(h)) & ~LIST_BL_LOCKMASK);
}
}


/**
/**
+1 −0
Original line number Original line Diff line number Diff line
@@ -80,6 +80,7 @@ extern void do_trace_rcu_torture_read(char *rcutorturename,
#define UINT_CMP_LT(a, b)	(UINT_MAX / 2 < (a) - (b))
#define UINT_CMP_LT(a, b)	(UINT_MAX / 2 < (a) - (b))
#define ULONG_CMP_GE(a, b)	(ULONG_MAX / 2 >= (a) - (b))
#define ULONG_CMP_GE(a, b)	(ULONG_MAX / 2 >= (a) - (b))
#define ULONG_CMP_LT(a, b)	(ULONG_MAX / 2 < (a) - (b))
#define ULONG_CMP_LT(a, b)	(ULONG_MAX / 2 < (a) - (b))
#define ulong2long(a)		(*(long *)(&(a)))


/* Exported common interfaces */
/* Exported common interfaces */


Loading