• Michal Hocko's avatar
    fork: report pid reservation failure properly · c7ca1996
    Michal Hocko authored
    commit 35f71bc0 upstream.
    
    copy_process will report any failure in alloc_pid as ENOMEM currently
    which is misleading because the pid allocation might fail not only when
    the memory is short but also when the pid space is consumed already.
    
    The current man page even mentions this case:
    
    : EAGAIN
    :
    :       A system-imposed limit on the number of threads was encountered.
    :       There are a number of limits that may trigger this error: the
    :       RLIMIT_NPROC soft resource limit (set via setrlimit(2)), which
    :       limits the number of processes and threads for a real user ID, was
    :       reached; the kernel's system-wide limit on the number of processes
    :       and threads, /proc/sys/kernel/threads-max, was reached (see
    :       proc(5)); or the maximum number of PIDs, /proc/sys/kernel/pid_max,
    :       was reached (see proc(5)).
    
    so the current behavior is also incorrect wrt.  documentation.  POSIX man
    page also suggest returing EAGAIN when the process count limit is reached.
    
    This patch simply propagates error code from alloc_pid and makes sure we
    return -EAGAIN due to reservation failure.  This will make behavior of
    fork closer to both our documentation and POSIX.
    
    alloc_pid might alsoo fail when the reaper in the pid namespace is dead
    (the namespace basically disallows all new processes) and there is no
    good error code which would match documented ones. We have traditionally
    returned ENOMEM for this case which is misleading as well but as per
    Eric W. Biederman this behavior is documented in man pid_namespaces(7)
    
    : If the "init" process of a PID namespace terminates, the kernel
    : terminates all of the processes in the namespace via a SIGKILL signal.
    : This behavior reflects the fact that the "init" process is essential for
    : the correct operation of a PID namespace.  In this case, a subsequent
    : fork(2) into this PID namespace will fail with the error ENOMEM; it is
    : not possible to create a new processes in a PID namespace whose "init"
    : process has terminated.
    
    and introducing a new error code would be too risky so let's stick to
    ENOMEM for this case.
    Signed-off-by: default avatarMichal Hocko <mhocko@suse.cz>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: "Eric W. Biederman" <ebiederm@xmission.com>
    Cc: Michael Kerrisk <mtk.manpages@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
    c7ca1996
fork.c 46.2 KB