summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_kse.c
diff options
context:
space:
mode:
authordavidxu <davidxu@FreeBSD.org>2003-02-21 07:11:38 +0000
committerdavidxu <davidxu@FreeBSD.org>2003-02-21 07:11:38 +0000
commit1838912108fa64c5432d24d79602faba8469b578 (patch)
tree1a5541723726b0f496074d53746829c40621b170 /sys/kern/kern_kse.c
parent915501ccb2cd04785110ff8472f007e5a0b61101 (diff)
downloadFreeBSD-src-1838912108fa64c5432d24d79602faba8469b578.zip
FreeBSD-src-1838912108fa64c5432d24d79602faba8469b578.tar.gz
If UTS kernel is calling kse_wakeup for itself, do nothing.
Diffstat (limited to 'sys/kern/kern_kse.c')
-rw-r--r--sys/kern/kern_kse.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/sys/kern/kern_kse.c b/sys/kern/kern_kse.c
index e7769ac..72ab301 100644
--- a/sys/kern/kern_kse.c
+++ b/sys/kern/kern_kse.c
@@ -538,13 +538,17 @@ kse_wakeup(struct thread *td, struct kse_wakeup_args *uap)
/* KSE-enabled processes only, please. */
if (!(p->p_flag & P_KSES))
return (EINVAL);
-
+ if ((td->td_ksegrp->kg_numupcalls != 0) && (td->td_mailbox == NULL)) {
+ KASSERT((td->td_upcall != NULL), ("%s: not own an upcall", __func__));
+ if (td->td_upcall->ku_mailbox == uap->mbx)
+ return (0);
+ }
PROC_LOCK(p);
mtx_lock_spin(&sched_lock);
if (uap->mbx) {
FOREACH_KSEGRP_IN_PROC(p, kg) {
FOREACH_UPCALL_IN_GROUP(kg, ku) {
- if (ku->ku_mailbox == uap->mbx)
+ if (ku->ku_mailbox == uap->mbx)
break;
}
if (ku)
@@ -565,7 +569,6 @@ kse_wakeup(struct thread *td, struct kse_wakeup_args *uap)
panic("%s: no owner", __func__);
} else if (TD_ON_SLEEPQ(td2) &&
(td2->td_wchan == &kg->kg_completed)) {
- ku->ku_flags |= KUF_DOUPCALL;
abortsleep(td2);
} else {
ku->ku_flags |= KUF_DOUPCALL;
OpenPOWER on IntegriCloud