Thread (14 messages) flat view 14 messages, 5 authors, 2017-11-22

Re: [RFC v2] prctl: prctl(PR_SET_IDLE, PR_IDLE_MODE_KILLME), for stateless idle loops

From: Shawn Landden <hidden>
Date: 2017-11-18 04:45:03
Also in: linux-fsdevel, linux-mm

On Fri, Nov 3, 2017 at 2:09 AM, Michal Hocko [off-list ref] wrote:
On Thu 02-11-17 23:35:44, Shawn Landden wrote:
quoted
It is common for services to be stateless around their main event loop.
If a process sets PR_SET_IDLE to PR_IDLE_MODE_KILLME then it
signals to the kernel that epoll_wait() and friends may not complete,
and the kernel may send SIGKILL if resources get tight.

See my systemd patch: https://github.com/shawnl/systemd/tree/prctl

Android uses this memory model for all programs, and having it in the
kernel will enable integration with the page cache (not in this
series).

16 bytes per process is kinda spendy, but I want to keep
lru behavior, which mem_score_adj does not allow. When a supervisor,
like Android's user input is keeping track this can be done in
user-space.
quoted
It could be pulled out of task_struct if an cross-indexing additional
red-black tree is added to support pid-based lookup.
This is still an abuse and the patch is wrong. We really do have an API
to use I fail to see why you do not use it.
When I looked at wait_queue_head_t it was 20 byes.
[...]
quoted
@@ -1018,6 +1060,24 @@ bool out_of_memory(struct oom_control *oc)
                      return true;
      }

+     /*
+      * Check death row for current memcg or global.
+      */
+     l = oom_target_get_queue(current);
+     if (!list_empty(l)) {
+             struct task_struct *ts = list_first_entry(l,
+                             struct task_struct, se.oom_target_queue);
+
+             pr_debug("Killing pid %u from EPOLL_KILLME death row.",
+                      ts->pid);
+
+             /* We use SIGKILL instead of the oom killer
+              * so as to cleanly interrupt ep_poll()
+              */
+             send_sig(SIGKILL, ts, 1);
+             return true;
+     }
Still not NUMA aware and completely backwards. If this is a memcg OOM
then it is _memcg_ to evaluate not the current. The oom might happen up
the hierarchy due to hard limit.

But still, you should be very clear _why_ the existing oom tuning is not
appropropriate and we can think of a way to hanle it better but cramming
the oom selection this way is simply not acceptable.
--
Michal Hocko
SUSE Labs
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help