• Oleg Nesterov's avatar
    exit: reparent: avoid find_new_reaper() if no children · ad9e206a
    Oleg Nesterov authored
    Now that pid_ns logic was isolated we can change forget_original_parent()
    to return right after find_child_reaper() when father->children is empty,
    there is nothing to reparent in this case.
    
    In particular this avoids find_alive_thread() and this can help if the
    whole process exits and it has a lot of PF_EXITING threads at the start of
    the thread list, this can easily lead to O(nr_threads ** 2) iterations.
    
    Trivial test case (tested under KVM, 2 CPUs):
    
        static void *tfunc(void *arg)
        {
            pause();
            return NULL;
        }
    
        static int child(unsigned int nt)
        {
            pthread_t pt;
    
            while (nt--)
                assert(pthread_create(&pt, NULL, tfunc, NULL) == 0);
    
            pthread_kill(pt, SIGTRAP);
            pause();
            return 0;
        }
    
        int main(int argc, const char *argv[])
        {
            int stat;
            unsigned int nf = atoi(argv[1]);
            unsigned int nt = atoi(argv[2]);
    
            while (nf--) {
                if (!fork())
                    return child(nt);
    
                wait(&stat);
                assert(stat == SIGTRAP);
            }
    
            return 0;
        }
    
    $ time ./test 16 16536 shows:
    
                  real        user         sys
        -    5m37.628s    0m4.437s    8m5.560s
        +    0m50.032s    0m7.130s    1m4.927s
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    Cc: Aaron Tomlin <atomlin@redhat.com>
    Cc: "Eric W. Biederman" <ebiederm@xmission.com>
    Cc: Sterling Alexander <stalexan@redhat.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    ad9e206a
exit.c 41.9 KB