This patch deletes pointless (please correct me if I am wrong)
code from coredump_wait().
1. It does useless mm->core_waiters inc/dec under mm->mmap_sem,
but any changes to ->core_waiters have no effect until we drop
->mmap_sem.
2. It calls yield() for absolutely unknown reason.
Signed-off-by: Oleg Nesterov <[email protected]>
--- 2.6.14-rc3/fs/exec.c~ 2005-09-21 21:08:33.000000000 +0400
+++ 2.6.14-rc3/fs/exec.c 2005-10-09 23:54:45.000000000 +0400
@@ -1422,19 +1422,16 @@ static void zap_threads (struct mm_struc
static void coredump_wait(struct mm_struct *mm)
{
DECLARE_COMPLETION(startup_done);
-
- mm->core_waiters++; /* let other threads block */
- mm->core_startup_done = &startup_done;
-
- /* give other threads a chance to run: */
- yield();
-
- zap_threads(mm);
- if (--mm->core_waiters) {
- up_write(&mm->mmap_sem);
- wait_for_completion(&startup_done);
- } else
- up_write(&mm->mmap_sem);
+ int core_waiters;
+
+ mm->core_startup_done = &startup_done;
+
+ zap_threads(mm);
+ core_waiters = mm->core_waiters;
+ up_write(&mm->mmap_sem);
+
+ if (core_waiters)
+ wait_for_completion(&startup_done);
BUG_ON(mm->core_waiters);
}