svn commit: r275617 - head/sys/kern
Konstantin Belousov
kib at FreeBSD.org
Mon Dec 8 16:27:44 UTC 2014
Author: kib
Date: Mon Dec 8 16:27:43 2014
New Revision: 275617
URL: https://svnweb.freebsd.org/changeset/base/275617
Log:
Do some refactoring and minor cleanups of the thread_single() code in
preparation for the global stop commit.
Move the code to weed suspended or sleeping threads into the
appropriate state, into the helper weed_inhib(). Current code already
has deep nesting and hard to follow [1].
Add currently useless helper remain_for_mode(), which returns the
count of threads which are allowed to run, according to the
single-threading mode.
In thread_single_end(), do not save curthread into local variable, it
is unused after, except to find curproc.
Remove stray empty line.
Requested by: avg [1]
Tested by: pho
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Modified:
head/sys/kern/kern_thread.c
Modified: head/sys/kern/kern_thread.c
==============================================================================
--- head/sys/kern/kern_thread.c Mon Dec 8 16:18:05 2014 (r275616)
+++ head/sys/kern/kern_thread.c Mon Dec 8 16:27:43 2014 (r275617)
@@ -64,7 +64,6 @@ __FBSDID("$FreeBSD$");
SDT_PROVIDER_DECLARE(proc);
SDT_PROBE_DEFINE(proc, , , lwp__exit);
-
/*
* thread related storage.
*/
@@ -584,6 +583,46 @@ calc_remaining(struct proc *p, int mode)
return (remaining);
}
+static int
+remain_for_mode(int mode)
+{
+
+ return (1);
+}
+
+static int
+weed_inhib(int mode, struct thread *td2, struct proc *p)
+{
+ int wakeup_swapper;
+
+ PROC_LOCK_ASSERT(p, MA_OWNED);
+ PROC_SLOCK_ASSERT(p, MA_OWNED);
+ THREAD_LOCK_ASSERT(td2, MA_OWNED);
+
+ wakeup_swapper = 0;
+ switch (mode) {
+ case SINGLE_EXIT:
+ if (TD_IS_SUSPENDED(td2))
+ wakeup_swapper |= thread_unsuspend_one(td2);
+ if (TD_ON_SLEEPQ(td2) && (td2->td_flags & TDF_SINTR) != 0)
+ wakeup_swapper |= sleepq_abort(td2, EINTR);
+ break;
+ case SINGLE_BOUNDARY:
+ if (TD_IS_SUSPENDED(td2) && (td2->td_flags & TDF_BOUNDARY) == 0)
+ wakeup_swapper |= thread_unsuspend_one(td2);
+ if (TD_ON_SLEEPQ(td2) && (td2->td_flags & TDF_SINTR) != 0)
+ wakeup_swapper |= sleepq_abort(td2, ERESTART);
+ break;
+ case SINGLE_NO_EXIT:
+ if (TD_IS_SUSPENDED(td2) && (td2->td_flags & TDF_BOUNDARY) == 0)
+ wakeup_swapper |= thread_unsuspend_one(td2);
+ if (TD_ON_SLEEPQ(td2) && (td2->td_flags & TDF_SINTR) != 0)
+ wakeup_swapper |= sleepq_abort(td2, ERESTART);
+ break;
+ }
+ return (wakeup_swapper);
+}
+
/*
* Enforce single-threading.
*
@@ -631,7 +670,7 @@ thread_single(int mode)
PROC_SLOCK(p);
p->p_singlethread = td;
remaining = calc_remaining(p, mode);
- while (remaining != 1) {
+ while (remaining != remain_for_mode(mode)) {
if (P_SHOULDSTOP(p) != P_STOPPED_SINGLE)
goto stopme;
wakeup_swapper = 0;
@@ -640,41 +679,8 @@ thread_single(int mode)
continue;
thread_lock(td2);
td2->td_flags |= TDF_ASTPENDING | TDF_NEEDSUSPCHK;
- if (TD_IS_INHIBITED(td2)) {
- switch (mode) {
- case SINGLE_EXIT:
- if (TD_IS_SUSPENDED(td2))
- wakeup_swapper |=
- thread_unsuspend_one(td2);
- if (TD_ON_SLEEPQ(td2) &&
- (td2->td_flags & TDF_SINTR))
- wakeup_swapper |=
- sleepq_abort(td2, EINTR);
- break;
- case SINGLE_BOUNDARY:
- if (TD_IS_SUSPENDED(td2) &&
- !(td2->td_flags & TDF_BOUNDARY))
- wakeup_swapper |=
- thread_unsuspend_one(td2);
- if (TD_ON_SLEEPQ(td2) &&
- (td2->td_flags & TDF_SINTR))
- wakeup_swapper |=
- sleepq_abort(td2, ERESTART);
- break;
- case SINGLE_NO_EXIT:
- if (TD_IS_SUSPENDED(td2) &&
- !(td2->td_flags & TDF_BOUNDARY))
- wakeup_swapper |=
- thread_unsuspend_one(td2);
- if (TD_ON_SLEEPQ(td2) &&
- (td2->td_flags & TDF_SINTR))
- wakeup_swapper |=
- sleepq_abort(td2, ERESTART);
- break;
- default:
- break;
- }
- }
+ if (TD_IS_INHIBITED(td2))
+ wakeup_swapper |= weed_inhib(mode, td2, p);
#ifdef SMP
else if (TD_IS_RUNNING(td2) && td != td2) {
forward_signal(td2);
@@ -689,7 +695,7 @@ thread_single(int mode)
/*
* Maybe we suspended some threads.. was it enough?
*/
- if (remaining == 1)
+ if (remaining == remain_for_mode(mode))
break;
stopme:
@@ -968,8 +974,7 @@ thread_single_end(void)
struct proc *p;
int wakeup_swapper;
- td = curthread;
- p = td->td_proc;
+ p = curproc;
PROC_LOCK_ASSERT(p, MA_OWNED);
p->p_flag &= ~(P_STOPPED_SINGLE | P_SINGLE_EXIT | P_SINGLE_BOUNDARY);
PROC_SLOCK(p);
@@ -981,7 +986,8 @@ thread_single_end(void)
* on the process. The single threader must be allowed
* to continue however as this is a bad place to stop.
*/
- if ((p->p_numthreads != 1) && (!P_SHOULDSTOP(p))) {
+ if (p->p_numthreads != remain_for_mode(SINGLE_EXIT) &&
+ !P_SHOULDSTOP(p)) {
FOREACH_THREAD_IN_PROC(p, td) {
thread_lock(td);
if (TD_IS_SUSPENDED(td)) {
More information about the svn-src-all
mailing list