1
0
mirror of https://git.FreeBSD.org/src.git synced 2025-01-18 15:30:21 +00:00

- Borrow the KSE single threading code for exec and exit. We use the check

if (p->p_numthreads > 1) and not a flag because action is only necessary
   if there are other threads.  The rest of the system has no need to
   identify thr threaded processes.
 - In kern_thread.c use thr_exit1() instead of thread_exit() if P_THREADED
   is not set.
This commit is contained in:
Jeff Roberson 2003-04-01 01:26:20 +00:00
parent 8af830c374
commit 2c10d16a4b
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=112910
6 changed files with 25 additions and 10 deletions

View File

@ -189,7 +189,7 @@ kern_execve(td, fname, argv, envv, mac_p)
PROC_LOCK(p); PROC_LOCK(p);
KASSERT((p->p_flag & P_INEXEC) == 0, KASSERT((p->p_flag & P_INEXEC) == 0,
("%s(): process already has P_INEXEC flag", __func__)); ("%s(): process already has P_INEXEC flag", __func__));
if (p->p_flag & P_THREADED) { if (p->p_flag & P_THREADED || p->p_numthreads > 1) {
if (thread_single(SINGLE_EXIT)) { if (thread_single(SINGLE_EXIT)) {
PROC_UNLOCK(p); PROC_UNLOCK(p);
return (ERESTART); /* Try again later. */ return (ERESTART); /* Try again later. */

View File

@ -129,15 +129,17 @@ exit1(struct thread *td, int rv)
} }
/* /*
* XXXKSE: MUST abort all other threads before proceeding past here. * MUST abort all other threads before proceeding past here.
*/ */
PROC_LOCK(p); PROC_LOCK(p);
if (p->p_flag & P_THREADED) { if (p->p_flag & P_THREADED || p->p_numthreads > 1) {
/* /*
* First check if some other thread got here before us.. * First check if some other thread got here before us..
* if so, act apropriatly, (exit or suspend); * if so, act apropriatly, (exit or suspend);
*/ */
DROP_GIANT();
thread_suspend_check(0); thread_suspend_check(0);
PICKUP_GIANT();
/* /*
* Kill off the other threads. This requires * Kill off the other threads. This requires

View File

@ -265,6 +265,11 @@ fork1(td, flags, pages, procp)
return (0); return (0);
} }
/*
* Note 1:1 allows for forking with one thread coming out on the
* other side with the expectation that the process is about to
* exec.
*/
if (p1->p_flag & P_THREADED) { if (p1->p_flag & P_THREADED) {
/* /*
* Idle the other threads for a second. * Idle the other threads for a second.

View File

@ -1813,7 +1813,7 @@ thread_single(int force_exit)
PROC_LOCK_ASSERT(p, MA_OWNED); PROC_LOCK_ASSERT(p, MA_OWNED);
KASSERT((td != NULL), ("curthread is NULL")); KASSERT((td != NULL), ("curthread is NULL"));
if ((p->p_flag & P_THREADED) == 0) if ((p->p_flag & P_THREADED) == 0 && p->p_numthreads == 1)
return (0); return (0);
/* Is someone already single threading? */ /* Is someone already single threading? */
@ -1872,6 +1872,7 @@ thread_single(int force_exit)
* In the mean time we suspend as well. * In the mean time we suspend as well.
*/ */
thread_suspend_one(td); thread_suspend_one(td);
/* XXX If you recursed this is broken. */
mtx_unlock(&Giant); mtx_unlock(&Giant);
PROC_UNLOCK(p); PROC_UNLOCK(p);
p->p_stats->p_ru.ru_nvcsw++; p->p_stats->p_ru.ru_nvcsw++;
@ -1961,15 +1962,18 @@ thread_suspend_check(int return_instead)
if ((p->p_flag & P_SINGLE_EXIT) && (p->p_singlethread != td)) { if ((p->p_flag & P_SINGLE_EXIT) && (p->p_singlethread != td)) {
while (mtx_owned(&Giant)) while (mtx_owned(&Giant))
mtx_unlock(&Giant); mtx_unlock(&Giant);
thread_exit(); if (p->p_flag & P_THREADED)
thread_exit();
else
thr_exit1();
} }
mtx_assert(&Giant, MA_NOTOWNED);
/* /*
* When a thread suspends, it just * When a thread suspends, it just
* moves to the processes's suspend queue * moves to the processes's suspend queue
* and stays there. * and stays there.
*/ */
mtx_assert(&Giant, MA_NOTOWNED);
thread_suspend_one(td); thread_suspend_one(td);
PROC_UNLOCK(p); PROC_UNLOCK(p);
if (P_SHOULDSTOP(p) == P_STOPPED_SINGLE) { if (P_SHOULDSTOP(p) == P_STOPPED_SINGLE) {

View File

@ -161,7 +161,7 @@ msleep(ident, mtx, priority, wmesg, timo)
* the thread (recursion here might be bad). * the thread (recursion here might be bad).
* Hence the TDF_INMSLEEP flag. * Hence the TDF_INMSLEEP flag.
*/ */
if (p->p_flag & P_THREADED) { if (p->p_flag & P_THREADED || p->p_numthreads > 1) {
/* /*
* Just don't bother if we are exiting * Just don't bother if we are exiting
* and not the exiting thread or thread was marked as * and not the exiting thread or thread was marked as

View File

@ -1813,7 +1813,7 @@ thread_single(int force_exit)
PROC_LOCK_ASSERT(p, MA_OWNED); PROC_LOCK_ASSERT(p, MA_OWNED);
KASSERT((td != NULL), ("curthread is NULL")); KASSERT((td != NULL), ("curthread is NULL"));
if ((p->p_flag & P_THREADED) == 0) if ((p->p_flag & P_THREADED) == 0 && p->p_numthreads == 1)
return (0); return (0);
/* Is someone already single threading? */ /* Is someone already single threading? */
@ -1872,6 +1872,7 @@ thread_single(int force_exit)
* In the mean time we suspend as well. * In the mean time we suspend as well.
*/ */
thread_suspend_one(td); thread_suspend_one(td);
/* XXX If you recursed this is broken. */
mtx_unlock(&Giant); mtx_unlock(&Giant);
PROC_UNLOCK(p); PROC_UNLOCK(p);
p->p_stats->p_ru.ru_nvcsw++; p->p_stats->p_ru.ru_nvcsw++;
@ -1961,15 +1962,18 @@ thread_suspend_check(int return_instead)
if ((p->p_flag & P_SINGLE_EXIT) && (p->p_singlethread != td)) { if ((p->p_flag & P_SINGLE_EXIT) && (p->p_singlethread != td)) {
while (mtx_owned(&Giant)) while (mtx_owned(&Giant))
mtx_unlock(&Giant); mtx_unlock(&Giant);
thread_exit(); if (p->p_flag & P_THREADED)
thread_exit();
else
thr_exit1();
} }
mtx_assert(&Giant, MA_NOTOWNED);
/* /*
* When a thread suspends, it just * When a thread suspends, it just
* moves to the processes's suspend queue * moves to the processes's suspend queue
* and stays there. * and stays there.
*/ */
mtx_assert(&Giant, MA_NOTOWNED);
thread_suspend_one(td); thread_suspend_one(td);
PROC_UNLOCK(p); PROC_UNLOCK(p);
if (P_SHOULDSTOP(p) == P_STOPPED_SINGLE) { if (P_SHOULDSTOP(p) == P_STOPPED_SINGLE) {