sched/mmcid: Cure fork()/vfork() related problems
Status from this message: The following commit has been merged into the sched/urgent branch of tip:
Get series with b4
b4 am [email protected]Versions newest first
Patches in v1 Applied
| # | Subject and files | Size | Replies | Applied |
|---|---|---|---|---|
| 1/4 | sched/mmcid: Prevent CID stalls due to concurrent forksinclude/ kernel/ kernel/ | +15 | 2 replies | |
| 2/4 | sched/mmcid: Handle vfork()/CLONE_VM correctlykernel/ | +1 | 0 replies | |
| 3/4 | sched/mmcid: Remove pointless preempt guardkernel/ | +7 | 0 replies | |
| 4/4 | sched/mmcid: Avoid full tasklist walksinclude/ kernel/ kernel/ | +18 | 0 replies |
Reviews trailers per patch
None of the 4 patches has a Reviewed-by or Acked-by.
| Patch | Matthieu Baerts (NGI0) |
|---|---|
| Series | T-b |
| 1/4 | |
| 2/4 | |
| 3/4 | |
| 4/4 |
Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes.
Cover letter [patch 0/4] sched/mmcid: Cure fork()/vfork() related problems
Matthiue and Jiri reported CPU stalls where a CPU git stuck in mm_get_cid():
https://lore.kernel.org/[email protected]
After some tedious debugging it turned out to be another subtle (or not so subtle) ownership mode change issue.
The logic handling vfork()'ed tasks in sched_mmcid_fixup_tasks_to_cpus() is broken. It is invoked when the number of tasks associated to a process is smaller than the number of MMCID users. It then walks the task list to find the vfork()'ed task, but accounts all the already processed tasks as well.
If that double processing brings the number of to be handled tasks to 0, the walk stops and the vfork()'ed task's CID is not fixed up. As a consequence a subsequent schedule in fails to acquire a (transitional) CID and the machine stalls.
Peter and me discovered also that there is a yet unreported issue vs. concurrent forks. Jiri noticed it independently.
The following series fixes those issues. It applies on top of Linus tree.
Thanks a lot to Matthieu and Jiri for providing valuable debug information and running the debug patches!
Thanks,
tglx
--- include/linux/rseq_types.h | 6 ++- include/linux/sched.h | 2 - kernel/fork.c | 3 - kernel/sched/core.c | 79 +++++++++++++++------------------------------ 4 files changed, 34 insertions(+), 56 deletions(-)