FAILED: patch "[PATCH] tracing/timerlat: Fix duplicated kthread creation due to CPU" failed to apply to 6.1-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x 0bb0a5c12ecf36ad561542bbb95f96355e036a02
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2024100741-afoot-canal-db89@gregkh' --subject-prefix 'PATCH 6.1.y' HEAD^..
Possible dependencies:
0bb0a5c12ecf ("tracing/timerlat: Fix duplicated kthread creation due to CPU online/offline") 177e1cc2f412 ("tracing/osnoise: Use a cpumask to know what threads are kthreads") e88ed227f639 ("tracing/timerlat: Add user-space interface")4998e7fda149 ("tracing/osnoise: Switch from PF_NO_SETAFFINITY to migrate_disable") 30838fcd8107 ("tracing/osnoise: Add OSNOISE_WORKLOAD option")b179d48b6aab ("tracing/osnoise: Add osnoise/options file")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 0bb0a5c12ecf36ad561542bbb95f96355e036a02 Mon Sep 17 00:00:00 2001
From: Wei Li <[email protected]>
Date: Tue, 24 Sep 2024 17:45:11 +0800
Subject: [PATCH] tracing/timerlat: Fix duplicated kthread creation due to CPU
online/offline
osnoise_hotplug_workfn() is the asynchronous online callback for "trace/osnoise:online". It may be congested when a CPU goes online and offline repeatedly and is invoked for multiple times after a certain online.
This will lead to kthread leak and timer corruption. Add a check in start_kthread() to prevent this situation.
kernel/trace/trace_osnoise.c +5 -2
@@ -2007,6 +2007,10 @@ static int start_kthread(unsigned int cpu)void *main = osnoise_main;char comm[24 ]; +/* Do not start a new thread if it is already running */ +if (per_cpu (per_cpu_osnoise_var, cpu).kthread) +return 0 ; +if (timerlat_enabled ()) {snprintf (comm,24 ,"timerlat/%d" , cpu); main = timerlat_main;
@@ -2061,11 +2065,10 @@ static int start_per_cpu_kthreads(void)if (cpumask_test_and_clear_cpu (cpu, &kthread_cpumask)) {struct task_struct *kthread; - kthread =per_cpu (per_cpu_osnoise_var, cpu).kthread; + kthread =xchg_relaxed (&(per_cpu (per_cpu_osnoise_var, cpu).kthread),NULL );if (!WARN_ON (!kthread))kthread_stop (kthread); } -per_cpu (per_cpu_osnoise_var, cpu).kthread =NULL ; }for_each_cpu (cpu, current_mask) {