|
@@ -732,7 +732,7 @@ void rcu_user_enter(void)
|
|
|
*
|
|
|
* Exit from an interrupt handler, which might possibly result in entering
|
|
|
* idle mode, in other words, leaving the mode in which read-side critical
|
|
|
- * sections can occur.
|
|
|
+ * sections can occur. The caller must have disabled interrupts.
|
|
|
*
|
|
|
* This code assumes that the idle loop never does anything that might
|
|
|
* result in unbalanced calls to irq_enter() and irq_exit(). If your
|
|
@@ -745,11 +745,10 @@ void rcu_user_enter(void)
|
|
|
*/
|
|
|
void rcu_irq_exit(void)
|
|
|
{
|
|
|
- unsigned long flags;
|
|
|
long long oldval;
|
|
|
struct rcu_dynticks *rdtp;
|
|
|
|
|
|
- local_irq_save(flags);
|
|
|
+ RCU_LOCKDEP_WARN(!irqs_disabled(), "rcu_irq_exit() invoked with irqs enabled!!!");
|
|
|
rdtp = this_cpu_ptr(&rcu_dynticks);
|
|
|
oldval = rdtp->dynticks_nesting;
|
|
|
rdtp->dynticks_nesting--;
|
|
@@ -760,6 +759,17 @@ void rcu_irq_exit(void)
|
|
|
else
|
|
|
rcu_eqs_enter_common(oldval, true);
|
|
|
rcu_sysidle_enter(1);
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Wrapper for rcu_irq_exit() where interrupts are enabled.
|
|
|
+ */
|
|
|
+void rcu_irq_exit_irqson(void)
|
|
|
+{
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ local_irq_save(flags);
|
|
|
+ rcu_irq_exit();
|
|
|
local_irq_restore(flags);
|
|
|
}
|
|
|
|
|
@@ -857,7 +867,7 @@ void rcu_user_exit(void)
|
|
|
*
|
|
|
* Enter an interrupt handler, which might possibly result in exiting
|
|
|
* idle mode, in other words, entering the mode in which read-side critical
|
|
|
- * sections can occur.
|
|
|
+ * sections can occur. The caller must have disabled interrupts.
|
|
|
*
|
|
|
* Note that the Linux kernel is fully capable of entering an interrupt
|
|
|
* handler that it never exits, for example when doing upcalls to
|
|
@@ -873,11 +883,10 @@ void rcu_user_exit(void)
|
|
|
*/
|
|
|
void rcu_irq_enter(void)
|
|
|
{
|
|
|
- unsigned long flags;
|
|
|
struct rcu_dynticks *rdtp;
|
|
|
long long oldval;
|
|
|
|
|
|
- local_irq_save(flags);
|
|
|
+ RCU_LOCKDEP_WARN(!irqs_disabled(), "rcu_irq_enter() invoked with irqs enabled!!!");
|
|
|
rdtp = this_cpu_ptr(&rcu_dynticks);
|
|
|
oldval = rdtp->dynticks_nesting;
|
|
|
rdtp->dynticks_nesting++;
|
|
@@ -888,6 +897,17 @@ void rcu_irq_enter(void)
|
|
|
else
|
|
|
rcu_eqs_exit_common(oldval, true);
|
|
|
rcu_sysidle_exit(1);
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Wrapper for rcu_irq_enter() where interrupts are enabled.
|
|
|
+ */
|
|
|
+void rcu_irq_enter_irqson(void)
|
|
|
+{
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ local_irq_save(flags);
|
|
|
+ rcu_irq_enter();
|
|
|
local_irq_restore(flags);
|
|
|
}
|
|
|
|