diff options
author | davidxu <davidxu@FreeBSD.org> | 2003-02-21 07:11:38 +0000 |
---|---|---|
committer | davidxu <davidxu@FreeBSD.org> | 2003-02-21 07:11:38 +0000 |
commit | 1838912108fa64c5432d24d79602faba8469b578 (patch) | |
tree | 1a5541723726b0f496074d53746829c40621b170 /sys/kern/kern_kse.c | |
parent | 915501ccb2cd04785110ff8472f007e5a0b61101 (diff) | |
download | FreeBSD-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.c | 9 |
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; |