linux-perf-users.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v7 0/3] Introduce put_task_struct_atomic_sleep()
@ 2023-04-25 11:43 Wander Lairson Costa
  2023-04-25 11:43 ` [PATCH v7 1/3] sched/core: warn on call put_task_struct in invalid context Wander Lairson Costa
                   ` (4 more replies)
  0 siblings, 5 replies; 29+ messages in thread
From: Wander Lairson Costa @ 2023-04-25 11:43 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim,
	Ian Rogers, Adrian Hunter, Will Deacon, Waiman Long, Boqun Feng,
	Juri Lelli, Vincent Guittot, Dietmar Eggemann, Steven Rostedt,
	Ben Segall, Mel Gorman, Daniel Bristot de Oliveira,
	Valentin Schneider, Eric W. Biederman, Wander Lairson Costa,
	Huacai Chen, Geert Uytterhoeven, Oleg Nesterov, Kefeng Wang,
	Andrew Morton, Liam R. Howlett, Christian Brauner, Kees Cook,
	Andrei Vagin, Shakeel Butt, open list,
	open list:PERFORMANCE EVENTS SUBSYSTEM

The put_task_struct() function reduces a usage counter and invokes
__put_task_struct() when the counter reaches zero.

In the case of __put_task_struct(), it indirectly acquires a spinlock,
which operates as a sleeping lock under the PREEMPT_RT configuration.
As a result, invoking put_task_struct() within an atomic context is
not feasible for real-time (RT) kernels.

One practical example is a splat inside inactive_task_timer(), which is
called in a interrupt context:

CPU: 1 PID: 2848 Comm: life Kdump: loaded Tainted: G W ---------
Hardware name: HP ProLiant DL388p Gen8, BIOS P70 07/15/2012
Call Trace:
 dump_stack_lvl+0x57/0x7d
 mark_lock_irq.cold+0x33/0xba
 ? stack_trace_save+0x4b/0x70
 ? save_trace+0x55/0x150
 mark_lock+0x1e7/0x400
 mark_usage+0x11d/0x140
 __lock_acquire+0x30d/0x930
 lock_acquire.part.0+0x9c/0x210
 ? refill_obj_stock+0x3d/0x3a0
 ? rcu_read_lock_sched_held+0x3f/0x70
 ? trace_lock_acquire+0x38/0x140
 ? lock_acquire+0x30/0x80
 ? refill_obj_stock+0x3d/0x3a0
 rt_spin_lock+0x27/0xe0
 ? refill_obj_stock+0x3d/0x3a0
 refill_obj_stock+0x3d/0x3a0
 ? inactive_task_timer+0x1ad/0x340
 kmem_cache_free+0x357/0x560
 inactive_task_timer+0x1ad/0x340
 ? switched_from_dl+0x2d0/0x2d0
 __run_hrtimer+0x8a/0x1a0
 __hrtimer_run_queues+0x91/0x130
 hrtimer_interrupt+0x10f/0x220
 __sysvec_apic_timer_interrupt+0x7b/0xd0
 sysvec_apic_timer_interrupt+0x4f/0xd0
 ? asm_sysvec_apic_timer_interrupt+0xa/0x20
 asm_sysvec_apic_timer_interrupt+0x12/0x20
RIP: 0033:0x7fff196bf6f5

To address this issue, this patch series introduces a new function
called put_task_struct_atomic_safe(). When compiled with the
PREEMPT_RT configuration, this function defers the call to
__put_task_struct() to a process context.

Additionally, the patch series rectifies known problematic call sites
to ensure smooth functioning.

Changelog
=========

v1:
* Initial implementation fixing the splat.

v2:
* Isolate the logic in its own function.
* Fix two more cases caught in review.

v3:
* Change __put_task_struct() to handle the issue internally.

v4:
* Explain why call_rcu() is safe to call from interrupt context.

v5:
* Explain why __put_task_struct() doesn't conflict with
  put_task_sruct_rcu_user.

v6:
* As per Sebastian's review, revert back the implementation of v2
  with a distinct function.
* Add a check in put_task_struct() to warning when called from a
  non-sleepable context.
* Address more call sites.

v7:
* Fix typos.
* Add an explanation why the new function doesn't conflict with
  delayed_free_task().

Wander Lairson Costa (3):
  sched/core: warn on call put_task_struct in invalid context
  sched/task: Add the put_task_struct_atomic_safe() function
  treewide: replace put_task_struct() with the atomic safe version

 include/linux/sched/task.h | 49 ++++++++++++++++++++++++++++++++++++++
 kernel/events/core.c       |  6 ++---
 kernel/fork.c              |  8 +++++++
 kernel/locking/rtmutex.c   | 10 ++++----
 kernel/sched/core.c        |  6 ++---
 kernel/sched/deadline.c    | 16 ++++++-------
 kernel/sched/rt.c          |  4 ++--
 7 files changed, 78 insertions(+), 21 deletions(-)

-- 
2.40.0


^ permalink raw reply	[flat|nested] 29+ messages in thread

end of thread, other threads:[~2023-05-08 12:31 UTC | newest]

Thread overview: 29+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-04-25 11:43 [PATCH v7 0/3] Introduce put_task_struct_atomic_sleep() Wander Lairson Costa
2023-04-25 11:43 ` [PATCH v7 1/3] sched/core: warn on call put_task_struct in invalid context Wander Lairson Costa
2023-04-28 16:17   ` Sebastian Andrzej Siewior
2023-05-02 14:46     ` Wander Lairson Costa
2023-04-25 11:43 ` [PATCH v7 2/3] sched/task: Add the put_task_struct_atomic_safe() function Wander Lairson Costa
2023-05-04  8:42   ` Peter Zijlstra
2023-05-04  9:32     ` Valentin Schneider
2023-05-04 12:24       ` Wander Lairson Costa
2023-05-04 12:24     ` Wander Lairson Costa
2023-05-04 12:29     ` Oleg Nesterov
2023-05-04 14:33       ` Peter Zijlstra
2023-05-04 14:55         ` Wander Lairson Costa
2023-05-04 15:23           ` Oleg Nesterov
2023-05-04 15:30             ` Peter Zijlstra
2023-05-05 13:39               ` Peter Zijlstra
2023-05-04 18:29             ` Wander Lairson Costa
2023-05-04 19:22               ` Oleg Nesterov
2023-05-04 19:38                 ` Wander Lairson Costa
2023-05-04 20:16                   ` Oleg Nesterov
2023-05-08 12:30                     ` Wander Lairson Costa
2023-05-04 15:24           ` Peter Zijlstra
2023-05-04 18:21             ` Wander Lairson Costa
2023-05-05 13:32               ` Peter Zijlstra
2023-05-05 14:26                 ` Steven Rostedt
2023-05-05 14:29                   ` Steven Rostedt
2023-05-08 12:28                 ` Wander Lairson Costa
2023-04-25 11:43 ` [PATCH v7 3/3] treewide: replace put_task_struct() with the atomic safe version Wander Lairson Costa
2023-04-26 12:05 ` [PATCH v7 0/3] Introduce put_task_struct_atomic_sleep() Valentin Schneider
2023-04-26 17:44 ` Waiman Long

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).