On Wed, Nov 1, 2017 at 3:10 PM, Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp> wrote:
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.
I want to do special process accounting. Also, in Android using this type of memory management is mandatory, and to do that other processes would have to make delivery of their messages (like a wake-up for user input) contingent on setting this. oom_score 1000 could gain all this special handling however.