diff options
| author | Oleg Nesterov <oleg@redhat.com> | 2014-12-10 15:55:17 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-12-10 17:41:18 -0800 | 
| commit | ad9e206aefa56788b676ebcd6329e828f40d2238 (patch) | |
| tree | 860bf8397db9bab9bbf96f5d5f37c522f77a1f22 /kernel/trace/trace_functions_graph.c | |
| parent | c9dc05bfdb3f7fd7c00f3cbd33816c99d2cb9029 (diff) | |
exit: reparent: avoid find_new_reaper() if no children
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: Oleg 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: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/trace/trace_functions_graph.c')
0 files changed, 0 insertions, 0 deletions
