Skip to contentSkip to conversation

sched: reset task's lockless wake-queues on fork()

PATCH In review Sebastian Andrzej Siewior 4 participants 4 messages Dec 21, 2015 – Jan 9, 2016

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

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 :)

Fixes 7675104990ed ("sched: Implement lockless wake-queues")
---
 kernel/fork.c | 1 +
 1 file changed, 1 insertion(+)
kernel/fork.c +1 -0
index b508f757c60b..46c1e8342ad8 100644
@@ -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
#1 lore raw

[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 :)

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")
---
 kernel/fork.c | 1 +
 1 file changed, 1 insertion(+)
kernel/fork.c +1 -0
index fce002e..1155eac 100644
@@ -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);
 
#2 lore raw

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 +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 :)

Quoted 8 lines
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

#3 lore raw

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 +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.

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 !NULL wake_q member 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
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