diff options
Diffstat (limited to 'fs/exec.c')
-rw-r--r-- | fs/exec.c | 15 |
1 files changed, 14 insertions, 1 deletions
@@ -1938,8 +1938,21 @@ static int coredump_wait(int exit_code, struct core_state *core_state) | |||
1938 | core_waiters = zap_threads(tsk, mm, core_state, exit_code); | 1938 | core_waiters = zap_threads(tsk, mm, core_state, exit_code); |
1939 | up_write(&mm->mmap_sem); | 1939 | up_write(&mm->mmap_sem); |
1940 | 1940 | ||
1941 | if (core_waiters > 0) | 1941 | if (core_waiters > 0) { |
1942 | struct core_thread *ptr; | ||
1943 | |||
1942 | wait_for_completion(&core_state->startup); | 1944 | wait_for_completion(&core_state->startup); |
1945 | /* | ||
1946 | * Wait for all the threads to become inactive, so that | ||
1947 | * all the thread context (extended register state, like | ||
1948 | * fpu etc) gets copied to the memory. | ||
1949 | */ | ||
1950 | ptr = core_state->dumper.next; | ||
1951 | while (ptr != NULL) { | ||
1952 | wait_task_inactive(ptr->task, 0); | ||
1953 | ptr = ptr->next; | ||
1954 | } | ||
1955 | } | ||
1943 | 1956 | ||
1944 | return core_waiters; | 1957 | return core_waiters; |
1945 | } | 1958 | } |