| Submitter | Konstantin Khebnikov |
|---|---|
| Date | July 12, 2016, 3:52 p.m. |
| Message ID | <57851224.2020902@yandex-team.ru> |
| Download | mbox | patch |
| Permalink | /patch/9225661/ |
| State | New |
| Headers | show |
Comments
On 07/12, Konstantin Khlebnikov wrote: > > --- a/kernel/sched/core.c > +++ b/kernel/sched/core.c > @@ -2808,8 +2808,9 @@ asmlinkage __visible void schedule_tail(struct task_struct *prev) > balance_callback(rq); > preempt_enable(); > > - if (current->set_child_tid) > - put_user(task_pid_vnr(current), current->set_child_tid); > + if (current->set_child_tid && > + put_user(task_pid_vnr(current), current->set_child_tid)) > + force_sig(SIGSEGV, current); > } > > Add Oleg into CC. IIRR he had some ideas how to fix this. =) Heh. OK, OK, thank you Konstantin ;) I'll try to recall tomorrow, but iirc I only have some ideas of how we can happily blame the FAULT_FLAG_USER logic. d, in this particular case, perhaps glibc/set_child_tid too because (again, iirc) it would nice to simply kill it, it is only used for some sanity checks... Oleg.
> Yep. Bug still not fixed in upstream. In our kernel I've plugged it with > this: > > --- a/kernel/sched/core.c > +++ b/kernel/sched/core.c > @@ -2808,8 +2808,9 @@ asmlinkage __visible void schedule_tail(struct > task_struct *prev) > balance_callback(rq); > preempt_enable(); > > - if (current->set_child_tid) > - put_user(task_pid_vnr(current), current->set_child_tid); > + if (current->set_child_tid && > + put_user(task_pid_vnr(current), current->set_child_tid)) > + force_sig(SIGSEGV, current); > } I just verified that with your patch there is no hung processes and I see processes getting SIGSEGV as expected. Thanks!
Patch
--- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -2808,8 +2808,9 @@ asmlinkage __visible void schedule_tail(struct task_struct *prev) balance_callback(rq); preempt_enable(); - if (current->set_child_tid) - put_user(task_pid_vnr(current), current->set_child_tid); + if (current->set_child_tid && + put_user(task_pid_vnr(current), current->set_child_tid)) + force_sig(SIGSEGV, current); } Add Oleg into CC. IIRR he had some ideas how to fix this. =)