*/
static void tracer_hardirqs_on(void *none, unsigned long a0, unsigned long a1)
{
+ /*
+ * Tracepoint probes are expected to be called with preempt disabled,
+ * We don't care about being called with preempt disabled but we need
+ * to know in the future if that changes so we can remove the next
+ * preempt_enable.
+ */
+ WARN_ON_ONCE(!preempt_count());
+
+ /* Tracepoint probes disable preemption atleast once, account for that */
+ preempt_enable_notrace();
+
if (!preempt_trace() && irq_trace())
stop_critical_timing(a0, a1);
+
+ preempt_disable_notrace();
}
static void tracer_hardirqs_off(void *none, unsigned long a0, unsigned long a1)
{
+ /*
+ * Tracepoint probes are expected to be called with preempt disabled,
+ * We don't care about being called with preempt disabled but we need
+ * to know in the future if that changes so we can remove the next
+ * preempt_enable.
+ */
+ WARN_ON_ONCE(!preempt_count());
+
+ /* Tracepoint probes disable preemption atleast once, account for that */
+ preempt_enable_notrace();
+
if (!preempt_trace() && irq_trace())
start_critical_timing(a0, a1);
+
+ preempt_disable_notrace();
}
static int irqsoff_tracer_init(struct trace_array *tr)