|
@@ -546,6 +546,13 @@ void __trace_hcall_entry(unsigned long opcode, unsigned long *args)
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
unsigned int *depth;
|
|
unsigned int *depth;
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * We cannot call tracepoints inside RCU idle regions which
|
|
|
|
+ * means we must not trace H_CEDE.
|
|
|
|
+ */
|
|
|
|
+ if (opcode == H_CEDE)
|
|
|
|
+ return;
|
|
|
|
+
|
|
local_irq_save(flags);
|
|
local_irq_save(flags);
|
|
|
|
|
|
depth = &__get_cpu_var(hcall_trace_depth);
|
|
depth = &__get_cpu_var(hcall_trace_depth);
|
|
@@ -556,8 +563,6 @@ void __trace_hcall_entry(unsigned long opcode, unsigned long *args)
|
|
(*depth)++;
|
|
(*depth)++;
|
|
preempt_disable();
|
|
preempt_disable();
|
|
trace_hcall_entry(opcode, args);
|
|
trace_hcall_entry(opcode, args);
|
|
- if (opcode == H_CEDE)
|
|
|
|
- rcu_idle_enter();
|
|
|
|
(*depth)--;
|
|
(*depth)--;
|
|
|
|
|
|
out:
|
|
out:
|
|
@@ -570,6 +575,9 @@ void __trace_hcall_exit(long opcode, unsigned long retval,
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
unsigned int *depth;
|
|
unsigned int *depth;
|
|
|
|
|
|
|
|
+ if (opcode == H_CEDE)
|
|
|
|
+ return;
|
|
|
|
+
|
|
local_irq_save(flags);
|
|
local_irq_save(flags);
|
|
|
|
|
|
depth = &__get_cpu_var(hcall_trace_depth);
|
|
depth = &__get_cpu_var(hcall_trace_depth);
|
|
@@ -578,8 +586,6 @@ void __trace_hcall_exit(long opcode, unsigned long retval,
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
(*depth)++;
|
|
(*depth)++;
|
|
- if (opcode == H_CEDE)
|
|
|
|
- rcu_idle_exit();
|
|
|
|
trace_hcall_exit(opcode, retval, retbuf);
|
|
trace_hcall_exit(opcode, retval, retbuf);
|
|
preempt_enable();
|
|
preempt_enable();
|
|
(*depth)--;
|
|
(*depth)--;
|