Messages in this thread | | | Subject | Re: [RFC] EPOLL_KILLME: New flag to epoll_wait() that subscribes process to death row (new syscall) | From | Tetsuo Handa <> | Date | Thu, 2 Nov 2017 07:10:24 +0900 |
| |
On 2017/11/01 14:32, Shawn Landden wrote: > @@ -1029,6 +1030,22 @@ bool out_of_memory(struct oom_control *oc) > return true; > } > > + /* > + * Check death row. > + */ > + if (!list_empty(eventpoll_deathrow_list())) { > + struct list_head *l = eventpoll_deathrow_list();
Unsafe traversal. List can become empty at this moment.
> + struct task_struct *ts = list_first_entry(l, > + struct task_struct, se.deathrow); > + > + pr_debug("Killing pid %u from EPOLL_KILLME death row.", > + ts->pid); > + > + /* We use SIGKILL so as to cleanly interrupt ep_poll() */ > + kill_pid(task_pid(ts), SIGKILL, 1);
send_sig() ?
> + return true; > + } > + > /* > * The OOM killer does not compensate for IO-less reclaim. > * pagefault_out_of_memory lost its gfp context so we have to >
And why is
static int oom_fd = open("/proc/self/oom_score_adj", O_WRONLY);
and then toggling between
write(fd, "1000", 4);
and
write(fd, "0", 1);
not sufficient? Adding prctl() that do this might be handy though.
| |