|
@@ -1930,8 +1930,21 @@ static int coredump_wait(int exit_code, struct core_state *core_state)
|
|
core_waiters = zap_threads(tsk, mm, core_state, exit_code);
|
|
core_waiters = zap_threads(tsk, mm, core_state, exit_code);
|
|
up_write(&mm->mmap_sem);
|
|
up_write(&mm->mmap_sem);
|
|
|
|
|
|
- if (core_waiters > 0)
|
|
|
|
|
|
+ if (core_waiters > 0) {
|
|
|
|
+ struct core_thread *ptr;
|
|
|
|
+
|
|
wait_for_completion(&core_state->startup);
|
|
wait_for_completion(&core_state->startup);
|
|
|
|
+ /*
|
|
|
|
+ * Wait for all the threads to become inactive, so that
|
|
|
|
+ * all the thread context (extended register state, like
|
|
|
|
+ * fpu etc) gets copied to the memory.
|
|
|
|
+ */
|
|
|
|
+ ptr = core_state->dumper.next;
|
|
|
|
+ while (ptr != NULL) {
|
|
|
|
+ wait_task_inactive(ptr->task, 0);
|
|
|
|
+ ptr = ptr->next;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
return core_waiters;
|
|
return core_waiters;
|
|
}
|
|
}
|