mirror of https://gitee.com/openkylin/linux.git
rcu: Enable DEBUG_OBJECTS_RCU_HEAD from !PREEMPT
The prohibition of DEBUG_OBJECTS_RCU_HEAD from !PREEMPT was due to the fixup actions. So just produce a warning from !PREEMPT. Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> Reviewed-by: Josh Triplett <josh@joshtriplett.org>
This commit is contained in:
parent
5ece5bab3e
commit
fc2ecf7ec7
|
@ -142,7 +142,14 @@ static int rcuhead_fixup_init(void *addr, enum debug_obj_state state)
|
||||||
* Ensure that queued callbacks are all executed.
|
* Ensure that queued callbacks are all executed.
|
||||||
* If we detect that we are nested in a RCU read-side critical
|
* If we detect that we are nested in a RCU read-side critical
|
||||||
* section, we should simply fail, otherwise we would deadlock.
|
* section, we should simply fail, otherwise we would deadlock.
|
||||||
|
* In !PREEMPT configurations, there is no way to tell if we are
|
||||||
|
* in a RCU read-side critical section or not, so we never
|
||||||
|
* attempt any fixup and just print a warning.
|
||||||
*/
|
*/
|
||||||
|
#ifndef CONFIG_PREEMPT
|
||||||
|
WARN_ON(1);
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
if (rcu_preempt_depth() != 0 || preempt_count() != 0 ||
|
if (rcu_preempt_depth() != 0 || preempt_count() != 0 ||
|
||||||
irqs_disabled()) {
|
irqs_disabled()) {
|
||||||
WARN_ON(1);
|
WARN_ON(1);
|
||||||
|
@ -184,7 +191,14 @@ static int rcuhead_fixup_activate(void *addr, enum debug_obj_state state)
|
||||||
* Ensure that queued callbacks are all executed.
|
* Ensure that queued callbacks are all executed.
|
||||||
* If we detect that we are nested in a RCU read-side critical
|
* If we detect that we are nested in a RCU read-side critical
|
||||||
* section, we should simply fail, otherwise we would deadlock.
|
* section, we should simply fail, otherwise we would deadlock.
|
||||||
|
* In !PREEMPT configurations, there is no way to tell if we are
|
||||||
|
* in a RCU read-side critical section or not, so we never
|
||||||
|
* attempt any fixup and just print a warning.
|
||||||
*/
|
*/
|
||||||
|
#ifndef CONFIG_PREEMPT
|
||||||
|
WARN_ON(1);
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
if (rcu_preempt_depth() != 0 || preempt_count() != 0 ||
|
if (rcu_preempt_depth() != 0 || preempt_count() != 0 ||
|
||||||
irqs_disabled()) {
|
irqs_disabled()) {
|
||||||
WARN_ON(1);
|
WARN_ON(1);
|
||||||
|
@ -214,12 +228,14 @@ static int rcuhead_fixup_free(void *addr, enum debug_obj_state state)
|
||||||
* Ensure that queued callbacks are all executed.
|
* Ensure that queued callbacks are all executed.
|
||||||
* If we detect that we are nested in a RCU read-side critical
|
* If we detect that we are nested in a RCU read-side critical
|
||||||
* section, we should simply fail, otherwise we would deadlock.
|
* section, we should simply fail, otherwise we would deadlock.
|
||||||
* Note that the machinery to reliably determine whether
|
* In !PREEMPT configurations, there is no way to tell if we are
|
||||||
* or not we are in an RCU read-side critical section
|
* in a RCU read-side critical section or not, so we never
|
||||||
* exists only in the preemptible RCU implementations
|
* attempt any fixup and just print a warning.
|
||||||
* (TINY_PREEMPT_RCU and TREE_PREEMPT_RCU), which is why
|
|
||||||
* DEBUG_OBJECTS_RCU_HEAD is disallowed if !PREEMPT.
|
|
||||||
*/
|
*/
|
||||||
|
#ifndef CONFIG_PREEMPT
|
||||||
|
WARN_ON(1);
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
if (rcu_preempt_depth() != 0 || preempt_count() != 0 ||
|
if (rcu_preempt_depth() != 0 || preempt_count() != 0 ||
|
||||||
irqs_disabled()) {
|
irqs_disabled()) {
|
||||||
WARN_ON(1);
|
WARN_ON(1);
|
||||||
|
|
|
@ -337,7 +337,7 @@ config DEBUG_OBJECTS_WORK
|
||||||
|
|
||||||
config DEBUG_OBJECTS_RCU_HEAD
|
config DEBUG_OBJECTS_RCU_HEAD
|
||||||
bool "Debug RCU callbacks objects"
|
bool "Debug RCU callbacks objects"
|
||||||
depends on DEBUG_OBJECTS && PREEMPT
|
depends on DEBUG_OBJECTS
|
||||||
help
|
help
|
||||||
Enable this to turn on debugging of RCU list heads (call_rcu() usage).
|
Enable this to turn on debugging of RCU list heads (call_rcu() usage).
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue