On 6/18/21 9:00 PM, Steven Rostedt wrote: > On Fri, 18 Jun 2021 12:45:03 -0400 > Steven Rostedt <rostedt@xxxxxxxxxxx> wrote: > >>> +/* >>> + * hwlat_cpu_init - CPU hotplug online callback function >>> + */ >>> +static int hwlat_cpu_init(unsigned int cpu) >>> +{ >>> + struct trace_array *tr = hwlat_trace; >>> + >> You need to take the trace_types_lock here, between testing the >> hwlat_busy and starting the threads. Otherwise, between the two, the >> hwlat tracer could be turned off while a CPU is coming on line, and >> then you just started a per cpu thread, while the hwlat tracer is not >> enabled. > And of course, because get_online_cpus() is called within > trace_types_lock, doing this check is going to cause a lock inversion. > Yep! I tried to take the trace_type_lock here, and got the lockdep info about this problem. > The only thing I could think of is to wake up a worker thread to do the > work. That is, this just wakes the worker thread, then the worker grabs > the trace_types_lock, iterates through the cpu mask of expect running > threads, and then starts or kills them depending on the hwlat_busy > value. So, it will not wait for the kworker to run? -- Daniel > > -- Steve >