sched: reset task's lockless wake-queues on fork()
Subsystems (4)
PATCH 1/1 sched: reset task's lockless wake-queues on fork()
In 7675104990ed ("sched: Implement lockless wake-queues") we gained lockless wake-queues. -RT managed to lockup itself with those. There could be multiple attempts for task X to enqueue it for a wakeup _even_ if task X is already running.
The reason is that task X could be runnable but not yet on CPU. The the task performing the wakeup did not leave the CPU it could performe multiple wakeups.
With the proper timming task X could be running and enqueued for a wakeup. If this happens while X is performing a fork() then its its child will have a !NULL wake_q member copied.
This is not a problem as long as the child task does not participate in lockless wakeups :)
--- kernel/fork.c | 1 + 1 file changed, 1 insertion(+)
kernel/fork.c +1 -0
@@ -393,6 +393,7 @@ static struct task_struct *dup_task_struct(struct task_struct *orig)#endif tsk->splice_pipe =NULL ; tsk->task_frag.page =NULL ; + tsk->wake_q.next =NULL ;account_kernel_stack (ti,1 );
Signature · 1 line
2.6.4
tip-bot for Sebastian Andrzej Siewior
merge bot[tip:sched/core] sched/core: Reset task' s lockless wake-queues on fork()
sched/core: Reset task's lockless wake-queues on fork()
Commit-ID: 093e5840ae76f1082633503964d035f40ed0216d Gitweb: http://git.kernel.org/tip/093e5840ae76f1082633503964d035f40ed0216d Author: Sebastian Andrzej Siewior <[email protected]> AuthorDate: Mon, 21 Dec 2015 18:17:10 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 6 Jan 2016 11:01:07 +0100
sched/core: Reset task's lockless wake-queues on fork()
In the following commit:
7675104990ed ("sched: Implement lockless wake-queues")
we gained lockless wake-queues.
The -RT kernel managed to lockup itself with those. There could be multiple attempts for task X to enqueue it for a wakeup _even_ if task X is already running.
The reason is that task X could be runnable but not yet on CPU. The the task performing the wakeup did not leave the CPU it could performe multiple wakeups.
With the proper timming task X could be running and enqueued for a wakeup. If this happens while X is performing a fork() then its its child will have a !NULL wake_q member copied.
This is not a problem as long as the child task does not participate in lockless wakeups :)
--- kernel/fork.c | 1 + 1 file changed, 1 insertion(+)
kernel/fork.c +1 -0
@@ -380,6 +380,7 @@ static struct task_struct *dup_task_struct(struct task_struct *orig)#endif tsk->splice_pipe =NULL ; tsk->task_frag.page =NULL ; + tsk->wake_q.next =NULL ;account_kernel_stack (ti,1 );
Re: [tip:sched/core] sched/core: Reset task' s lockless wake-queues on fork()
Quoted 30 lines · tip-bot for Sebastian Andrzej Siewior
Commit-ID: 093e5840ae76f1082633503964d035f40ed0216d Gitweb: http://git.kernel.org/tip/093e5840ae76f1082633503964d035f40ed0216d Author: Sebastian Andrzej Siewior <[email protected]> AuthorDate: Mon, 21 Dec 2015 18:17:10 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 6 Jan 2016 11:01:07 +0100sched/core: Reset task's lockless wake-queues on
fork()In the following commit:
7675104990ed("sched: Implement lockless wake-queues")we gained lockless wake-queues.
The -RT kernel managed to lockup itself with those. There could be multiple attempts for task X to enqueue it for a wakeup _even_ if task X is already running.
The reason is that task X could be runnable but not yet on CPU. The the task performing the wakeup did not leave the CPU it could performe multiple wakeups.
With the proper timming task X could be running and enqueued for a wakeup. If this happens while X is performing a
fork()then its its child will have a !NULLwake_qmember copied.This is not a problem as long as the child task does not participate in lockless wakeups :)
Quoted 8 lines
Signed-off-by Sebastian Andrzej Siewior <[email protected]>Signed-off-by Peter Zijlstra (Intel) <[email protected]>Cc Davidlohr Bueso <[email protected]>Cc Linus Torvalds <[email protected]>Cc Peter Zijlstra <[email protected]>Cc Steven Rostedt <[email protected]>Cc Thomas Gleixner <[email protected]>Fixes 7675104990ed ("sched: Implement lockless wake-queues")
Shouldn't that go into stable?
Thanks,
tglx
Re: [tip:sched/core] sched/core: Reset task' s lockless wake-queues on fork()
Quoted 25 lines · Thomas Gleixner
Quoted 23 lines · tip-bot for Sebastian Andrzej Siewior
Commit-ID: 093e5840ae76f1082633503964d035f40ed0216d Gitweb: http://git.kernel.org/tip/093e5840ae76f1082633503964d035f40ed0216d Author: Sebastian Andrzej Siewior <[email protected]> AuthorDate: Mon, 21 Dec 2015 18:17:10 +0100 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 6 Jan 2016 11:01:07 +0100sched/core: Reset task's lockless wake-queues on
fork()In the following commit:
7675104990ed("sched: Implement lockless wake-queues")we gained lockless wake-queues.
The -RT kernel managed to lockup itself with those. There could be multiple attempts for task X to enqueue it for a wakeup _even_ if task X is already running.
The reason is that task X could be runnable but not yet on CPU. The the task performing the wakeup did not leave the CPU it could performe multiple wakeups.
Quoted 6 lines
Quoted 6 lines
With the proper timming task X could be running and enqueued for a wakeup. If this happens while X is performing a
fork()then its its child will have a !NULLwake_qmember copied.This is not a problem as long as the child task does not participate in lockless wakeups :)
It also makes sense in that a new task has no business inherinting whatever pending wakeups the parent is involved in. It should get a fresh wake_q.
Quoted 11 lines
Quoted 9 lines
Signed-off-by Sebastian Andrzej Siewior <[email protected]>Signed-off-by Peter Zijlstra (Intel) <[email protected]>Cc Davidlohr Bueso <[email protected]>Cc Linus Torvalds <[email protected]>Cc Peter Zijlstra <[email protected]>Cc Steven Rostedt <[email protected]>Cc Thomas Gleixner <[email protected]>Fixes 7675104990ed ("sched: Implement lockless wake-queues")Shouldn't that go into stable?
Yes, as of v4.2 afaict. Ccing.
Thanks,
Davidlohr