From 3a18729505432f5178a648a9ab43e20b2dc1a16d Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Thu, 22 Feb 2001 13:46:09 +0000 Subject: [PATCH] Lock need_resched with sched_lock. Reported by: des --- sys/kern/ksched.c | 9 +++++++-- sys/posix4/ksched.c | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/sys/kern/ksched.c b/sys/kern/ksched.c index 27a0899b44a6..b729ccfb85af 100644 --- a/sys/kern/ksched.c +++ b/sys/kern/ksched.c @@ -38,9 +38,8 @@ #include #include #include +#include #include -#include /* For need_resched */ -#include /* For need_resched */ #include @@ -174,8 +173,10 @@ int ksched_setscheduler(register_t *ret, struct ksched *ksched, rtp.type = (policy == SCHED_FIFO) ? RTP_PRIO_FIFO : RTP_PRIO_REALTIME; + mtx_lock_spin(&sched_lock); rtp_to_pri(&rtp, &p->p_pri); need_resched(); + mtx_unlock_spin(&sched_lock); } else e = EPERM; @@ -187,6 +188,7 @@ int ksched_setscheduler(register_t *ret, struct ksched *ksched, { rtp.type = RTP_PRIO_NORMAL; rtp.prio = p4prio_to_rtpprio(param->sched_priority); + mtx_lock_spin(&sched_lock); rtp_to_pri(&rtp, &p->p_pri); /* XXX Simply revert to whatever we had for last @@ -196,6 +198,7 @@ int ksched_setscheduler(register_t *ret, struct ksched *ksched, * scheduling info alone. */ need_resched(); + mtx_unlock_spin(&sched_lock); } break; } @@ -212,7 +215,9 @@ int ksched_getscheduler(register_t *ret, struct ksched *ksched, struct proc *p) */ int ksched_yield(register_t *ret, struct ksched *ksched) { + mtx_lock_spin(&sched_lock); need_resched(); + mtx_unlock_spin(&sched_lock); return 0; } diff --git a/sys/posix4/ksched.c b/sys/posix4/ksched.c index 27a0899b44a6..b729ccfb85af 100644 --- a/sys/posix4/ksched.c +++ b/sys/posix4/ksched.c @@ -38,9 +38,8 @@ #include #include #include +#include #include -#include /* For need_resched */ -#include /* For need_resched */ #include @@ -174,8 +173,10 @@ int ksched_setscheduler(register_t *ret, struct ksched *ksched, rtp.type = (policy == SCHED_FIFO) ? RTP_PRIO_FIFO : RTP_PRIO_REALTIME; + mtx_lock_spin(&sched_lock); rtp_to_pri(&rtp, &p->p_pri); need_resched(); + mtx_unlock_spin(&sched_lock); } else e = EPERM; @@ -187,6 +188,7 @@ int ksched_setscheduler(register_t *ret, struct ksched *ksched, { rtp.type = RTP_PRIO_NORMAL; rtp.prio = p4prio_to_rtpprio(param->sched_priority); + mtx_lock_spin(&sched_lock); rtp_to_pri(&rtp, &p->p_pri); /* XXX Simply revert to whatever we had for last @@ -196,6 +198,7 @@ int ksched_setscheduler(register_t *ret, struct ksched *ksched, * scheduling info alone. */ need_resched(); + mtx_unlock_spin(&sched_lock); } break; } @@ -212,7 +215,9 @@ int ksched_getscheduler(register_t *ret, struct ksched *ksched, struct proc *p) */ int ksched_yield(register_t *ret, struct ksched *ksched) { + mtx_lock_spin(&sched_lock); need_resched(); + mtx_unlock_spin(&sched_lock); return 0; }