tracing: Fix wakeup tracers on failure of acquiring calltime

The functions wakeup_graph_entry() and wakeup_graph_return() both call
func_prolog_preempt_disable() that will test if the data->disable is
already set and if not, increment it and disable preemption. If it was
set, it returns false and the caller exits.

The caller of this function must decrement the disable counter, but misses
doing so if the calltime fails to be acquired.

Instead of exiting out when calltime is NULL, change the logic to do the
work if it is not NULL and still do the clean up at the end of the
function if it is NULL.

Cc: stable@vger.kernel.org
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Link: https://lore.kernel.org/20251008114835.027b878a@gandalf.local.home
Fixes: a485ea9e3ef3 ("tracing: Fix irqsoff and wakeup latency tracers when using function graph")
Reported-by: Sasha Levin <sashal@kernel.org>
Closes: https://lore.kernel.org/linux-trace-kernel/20251006175848.1906912-1-sashal@kernel.org/
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>

+6 -10
+6 -10
kernel/trace/trace_sched_wakeup.c
··· 138 return 0; 139 140 calltime = fgraph_reserve_data(gops->idx, sizeof(*calltime)); 141 - if (!calltime) 142 - return 0; 143 - 144 - *calltime = trace_clock_local(); 145 - 146 - ret = __trace_graph_entry(tr, trace, trace_ctx); 147 local_dec(&data->disabled); 148 preempt_enable_notrace(); 149 ··· 167 rettime = trace_clock_local(); 168 169 calltime = fgraph_retrieve_data(gops->idx, &size); 170 - if (!calltime) 171 - return; 172 173 - __trace_graph_return(tr, trace, trace_ctx, *calltime, rettime); 174 local_dec(&data->disabled); 175 - 176 preempt_enable_notrace(); 177 return; 178 }
··· 138 return 0; 139 140 calltime = fgraph_reserve_data(gops->idx, sizeof(*calltime)); 141 + if (calltime) { 142 + *calltime = trace_clock_local(); 143 + ret = __trace_graph_entry(tr, trace, trace_ctx); 144 + } 145 local_dec(&data->disabled); 146 preempt_enable_notrace(); 147 ··· 169 rettime = trace_clock_local(); 170 171 calltime = fgraph_retrieve_data(gops->idx, &size); 172 + if (calltime) 173 + __trace_graph_return(tr, trace, trace_ctx, *calltime, rettime); 174 175 local_dec(&data->disabled); 176 preempt_enable_notrace(); 177 return; 178 }