• KJ Tsanaktsidis's avatar
    fork: report pid exhaustion correctly · f83606f5
    KJ Tsanaktsidis authored
    Make the clone and fork syscalls return EAGAIN when the limit on the
    number of pids /proc/sys/kernel/pid_max is exceeded.
    
    Currently, when the pid_max limit is exceeded, the kernel will return
    ENOSPC from the fork and clone syscalls.  This is contrary to the
    documented behaviour, which explicitly calls out the pid_max case as one
    where EAGAIN should be returned.  It also leads to really confusing error
    messages in userspace programs which will complain about a lack of disk
    space when they fail to create processes/threads for this reason.
    
    This error is being returned because alloc_pid() uses the idr api to find
    a new pid; when there are none available, idr_alloc_cyclic() returns
    -ENOSPC, and this is being propagated back to userspace.
    
    This behaviour has been broken before, and was explicitly fixed in
    commit 35f71bc0 ("fork: report pid reservation failure properly"),
    so I think -EAGAIN is definitely the right thing to return in this case.
    The current behaviour change dates from commit 95846ecf ("pid:
    replace pid bitmap implementation with IDR AIP") and was I believe
    unintentional.
    
    This patch has no impact on the case where allocating a pid fails because
    the child reaper for the namespace is dead; that case will still return
    -ENOMEM.
    
    Link: http://lkml.kernel.org/r/20180903111016.46461-1-ktsanaktsidis@zendesk.com
    Fixes: 95846ecf ("pid: replace pid bitmap implementation with IDR AIP")
    Signed-off-by: default avatarKJ Tsanaktsidis <ktsanaktsidis@zendesk.com>
    Reviewed-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Acked-by: default avatarMichal Hocko <mhocko@suse.com>
    Cc: Gargi Sharma <gs051095@gmail.com>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    f83606f5
pid.c 11.2 KB