From 6778948f9de86c3cfaf36725a7c87dcff9ba247f Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 11 Dec 2023 08:20:59 +0000
Subject: [PATCH] kernel_5.10 no rt

---
 kernel/kernel/trace/trace_sched_wakeup.c |   71 +++++++++++++++++++----------------
 1 files changed, 38 insertions(+), 33 deletions(-)

diff --git a/kernel/kernel/trace/trace_sched_wakeup.c b/kernel/kernel/trace/trace_sched_wakeup.c
index f1c6033..97b10bb 100644
--- a/kernel/kernel/trace/trace_sched_wakeup.c
+++ b/kernel/kernel/trace/trace_sched_wakeup.c
@@ -67,7 +67,7 @@
 static int
 func_prolog_preempt_disable(struct trace_array *tr,
 			    struct trace_array_cpu **data,
-			    unsigned int *trace_ctx)
+			    int *pc)
 {
 	long disabled;
 	int cpu;
@@ -75,7 +75,7 @@
 	if (likely(!wakeup_task))
 		return 0;
 
-	*trace_ctx = tracing_gen_ctx();
+	*pc = preempt_count();
 	preempt_disable_notrace();
 
 	cpu = raw_smp_processor_id();
@@ -116,8 +116,8 @@
 {
 	struct trace_array *tr = wakeup_trace;
 	struct trace_array_cpu *data;
-	unsigned int trace_ctx;
-	int ret = 0;
+	unsigned long flags;
+	int pc, ret = 0;
 
 	if (ftrace_graph_ignore_func(trace))
 		return 0;
@@ -131,10 +131,11 @@
 	if (ftrace_graph_notrace_addr(trace->func))
 		return 1;
 
-	if (!func_prolog_preempt_disable(tr, &data, &trace_ctx))
+	if (!func_prolog_preempt_disable(tr, &data, &pc))
 		return 0;
 
-	ret = __trace_graph_entry(tr, trace, trace_ctx);
+	local_save_flags(flags);
+	ret = __trace_graph_entry(tr, trace, flags, pc);
 	atomic_dec(&data->disabled);
 	preempt_enable_notrace();
 
@@ -145,14 +146,16 @@
 {
 	struct trace_array *tr = wakeup_trace;
 	struct trace_array_cpu *data;
-	unsigned int trace_ctx;
+	unsigned long flags;
+	int pc;
 
 	ftrace_graph_addr_finish(trace);
 
-	if (!func_prolog_preempt_disable(tr, &data, &trace_ctx))
+	if (!func_prolog_preempt_disable(tr, &data, &pc))
 		return;
 
-	__trace_graph_return(tr, trace, trace_ctx);
+	local_save_flags(flags);
+	__trace_graph_return(tr, trace, flags, pc);
 	atomic_dec(&data->disabled);
 
 	preempt_enable_notrace();
@@ -214,13 +217,13 @@
 	struct trace_array *tr = wakeup_trace;
 	struct trace_array_cpu *data;
 	unsigned long flags;
-	unsigned int trace_ctx;
+	int pc;
 
-	if (!func_prolog_preempt_disable(tr, &data, &trace_ctx))
+	if (!func_prolog_preempt_disable(tr, &data, &pc))
 		return;
 
 	local_irq_save(flags);
-	trace_function(tr, ip, parent_ip, trace_ctx);
+	trace_function(tr, ip, parent_ip, flags, pc);
 	local_irq_restore(flags);
 
 	atomic_dec(&data->disabled);
@@ -300,12 +303,12 @@
 static void
 __trace_function(struct trace_array *tr,
 		 unsigned long ip, unsigned long parent_ip,
-		 unsigned int trace_ctx)
+		 unsigned long flags, int pc)
 {
 	if (is_graph(tr))
-		trace_graph_function(tr, ip, parent_ip, trace_ctx);
+		trace_graph_function(tr, ip, parent_ip, flags, pc);
 	else
-		trace_function(tr, ip, parent_ip, trace_ctx);
+		trace_function(tr, ip, parent_ip, flags, pc);
 }
 
 static int wakeup_flag_changed(struct trace_array *tr, u32 mask, int set)
@@ -372,7 +375,7 @@
 tracing_sched_switch_trace(struct trace_array *tr,
 			   struct task_struct *prev,
 			   struct task_struct *next,
-			   unsigned int trace_ctx)
+			   unsigned long flags, int pc)
 {
 	struct trace_event_call *call = &event_context_switch;
 	struct trace_buffer *buffer = tr->array_buffer.buffer;
@@ -380,7 +383,7 @@
 	struct ctx_switch_entry *entry;
 
 	event = trace_buffer_lock_reserve(buffer, TRACE_CTX,
-					  sizeof(*entry), trace_ctx);
+					  sizeof(*entry), flags, pc);
 	if (!event)
 		return;
 	entry	= ring_buffer_event_data(event);
@@ -393,14 +396,14 @@
 	entry->next_cpu	= task_cpu(next);
 
 	if (!call_filter_check_discard(call, entry, buffer, event))
-		trace_buffer_unlock_commit(tr, buffer, event, trace_ctx);
+		trace_buffer_unlock_commit(tr, buffer, event, flags, pc);
 }
 
 static void
 tracing_sched_wakeup_trace(struct trace_array *tr,
 			   struct task_struct *wakee,
 			   struct task_struct *curr,
-			   unsigned int trace_ctx)
+			   unsigned long flags, int pc)
 {
 	struct trace_event_call *call = &event_wakeup;
 	struct ring_buffer_event *event;
@@ -408,7 +411,7 @@
 	struct trace_buffer *buffer = tr->array_buffer.buffer;
 
 	event = trace_buffer_lock_reserve(buffer, TRACE_WAKE,
-					  sizeof(*entry), trace_ctx);
+					  sizeof(*entry), flags, pc);
 	if (!event)
 		return;
 	entry	= ring_buffer_event_data(event);
@@ -421,7 +424,7 @@
 	entry->next_cpu			= task_cpu(wakee);
 
 	if (!call_filter_check_discard(call, entry, buffer, event))
-		trace_buffer_unlock_commit(tr, buffer, event, trace_ctx);
+		trace_buffer_unlock_commit(tr, buffer, event, flags, pc);
 }
 
 static void notrace
@@ -433,7 +436,7 @@
 	unsigned long flags;
 	long disabled;
 	int cpu;
-	unsigned int trace_ctx;
+	int pc;
 
 	tracing_record_cmdline(prev);
 
@@ -452,6 +455,8 @@
 	if (next != wakeup_task)
 		return;
 
+	pc = preempt_count();
+
 	/* disable local data, not wakeup_cpu data */
 	cpu = raw_smp_processor_id();
 	disabled = atomic_inc_return(&per_cpu_ptr(wakeup_trace->array_buffer.data, cpu)->disabled);
@@ -459,8 +464,6 @@
 		goto out;
 
 	local_irq_save(flags);
-	trace_ctx = tracing_gen_ctx_flags(flags);
-
 	arch_spin_lock(&wakeup_lock);
 
 	/* We could race with grabbing wakeup_lock */
@@ -470,9 +473,9 @@
 	/* The task we are waiting for is waking up */
 	data = per_cpu_ptr(wakeup_trace->array_buffer.data, wakeup_cpu);
 
-	__trace_function(wakeup_trace, CALLER_ADDR0, CALLER_ADDR1, trace_ctx);
-	tracing_sched_switch_trace(wakeup_trace, prev, next, trace_ctx);
-	__trace_stack(wakeup_trace, trace_ctx, 0);
+	__trace_function(wakeup_trace, CALLER_ADDR0, CALLER_ADDR1, flags, pc);
+	tracing_sched_switch_trace(wakeup_trace, prev, next, flags, pc);
+	__trace_stack(wakeup_trace, flags, 0, pc);
 
 	T0 = data->preempt_timestamp;
 	T1 = ftrace_now(cpu);
@@ -524,8 +527,9 @@
 {
 	struct trace_array_cpu *data;
 	int cpu = smp_processor_id();
+	unsigned long flags;
 	long disabled;
-	unsigned int trace_ctx;
+	int pc;
 
 	if (likely(!tracer_enabled))
 		return;
@@ -546,11 +550,10 @@
 	    (!dl_task(p) && (p->prio >= wakeup_prio || p->prio >= current->prio)))
 		return;
 
+	pc = preempt_count();
 	disabled = atomic_inc_return(&per_cpu_ptr(wakeup_trace->array_buffer.data, cpu)->disabled);
 	if (unlikely(disabled != 1))
 		goto out;
-
-	trace_ctx = tracing_gen_ctx();
 
 	/* interrupts should be off from try_to_wake_up */
 	arch_spin_lock(&wakeup_lock);
@@ -578,17 +581,19 @@
 
 	wakeup_task = get_task_struct(p);
 
+	local_save_flags(flags);
+
 	data = per_cpu_ptr(wakeup_trace->array_buffer.data, wakeup_cpu);
 	data->preempt_timestamp = ftrace_now(cpu);
-	tracing_sched_wakeup_trace(wakeup_trace, p, current, trace_ctx);
-	__trace_stack(wakeup_trace, trace_ctx, 0);
+	tracing_sched_wakeup_trace(wakeup_trace, p, current, flags, pc);
+	__trace_stack(wakeup_trace, flags, 0, pc);
 
 	/*
 	 * We must be careful in using CALLER_ADDR2. But since wake_up
 	 * is not called by an assembly function  (where as schedule is)
 	 * it should be safe to use it here.
 	 */
-	__trace_function(wakeup_trace, CALLER_ADDR1, CALLER_ADDR2, trace_ctx);
+	__trace_function(wakeup_trace, CALLER_ADDR1, CALLER_ADDR2, flags, pc);
 
 out_locked:
 	arch_spin_unlock(&wakeup_lock);

--
Gitblit v1.6.2