slightly clean up the thread_userret() and thread_consider_upcall() calls.

also some slight changes for TDF_BOUND testing and small style changes
Should ONLY affect KSE programs

Submitted by:	davidxu
This commit is contained in:
Julian Elischer 2002-09-23 06:14:30 +00:00
parent 2ee166b2bd
commit 253fdd5ba9
4 changed files with 53 additions and 29 deletions

View File

@ -67,7 +67,7 @@ static int oiks_debug = 1; /* 0 disable, 1 printf, 2 enter debugger */
SYSCTL_INT(_kern_threads, OID_AUTO, oiks, CTLFLAG_RW,
&oiks_debug, 0, "OIKS thread debug");
static int max_threads_per_proc = 4;
static int max_threads_per_proc = 6;
SYSCTL_INT(_kern_threads, OID_AUTO, max_per_proc, CTLFLAG_RW,
&max_threads_per_proc, 0, "Limit on threads per proc");
@ -330,7 +330,10 @@ thread_export_context(struct thread *td)
void *addr2;
int error;
ucontext_t uc;
int unbound;
unbound = (td->td_flags & TDF_UNBOUND);
td->td_flags &= ~TDF_UNBOUND;
#ifdef __ia64__
td2_mbx = 0; /* pacify gcc (!) */
#endif
@ -365,6 +368,7 @@ thread_export_context(struct thread *td)
error = suword(addr1, (u_long)td->td_mailbox);
if (error == -1)
error = EFAULT;
td->td_flags |= unbound;
return (error);
}
@ -574,9 +578,10 @@ signal_upcall(struct proc *p, int sig)
* no other completed threads.
*/
static int
thread_consider_upcalling(struct proc *p, struct ksegrp *kg, struct kse *ke,
struct thread *td, struct trapframe *frame)
thread_consider_upcalling(struct thread *td)
{
struct proc *p;
struct ksegrp *kg;
int error;
/*
@ -597,7 +602,14 @@ thread_consider_upcalling(struct proc *p, struct ksegrp *kg, struct kse *ke,
* Decide whether to perfom an upcall now.
*/
/* Make sure there are no other threads waiting to run. */
if (TAILQ_FIRST(&kg->kg_runq)) {
p = td->td_proc;
kg = td->td_ksegrp;
PROC_LOCK(p);
mtx_lock_spin(&sched_lock);
/* bogus test, ok for testing though */
if (TAILQ_FIRST(&kg->kg_runq) &&
(TAILQ_LAST(&kg->kg_runq, threadqueue)
!= kg->kg_last_assigned)) {
/*
* Another thread in this KSEG needs to run.
* Switch to it instead of performing an upcall,
@ -621,8 +633,6 @@ thread_consider_upcalling(struct proc *p, struct ksegrp *kg, struct kse *ke,
* the next upcall to any KSE in this KSEG.
*
*/
PROC_LOCK(p);
mtx_lock_spin(&sched_lock);
thread_exit(); /* Abandon current thread. */
/* NOTREACHED */
} else
@ -633,6 +643,8 @@ thread_consider_upcalling(struct proc *p, struct ksegrp *kg, struct kse *ke,
* nested in the kernel.
*/
td->td_flags |= TDF_UPCALLING;
mtx_unlock_spin(&sched_lock);
PROC_UNLOCK(p);
return (0);
}
@ -649,11 +661,11 @@ thread_consider_upcalling(struct proc *p, struct ksegrp *kg, struct kse *ke,
* We will clear it here.
*/
int
thread_userret(struct proc *p, struct ksegrp *kg, struct kse *ke,
struct thread *td, struct trapframe *frame)
thread_userret(struct thread *td, struct trapframe *frame)
{
int error;
#if 0
/*
* Ensure that we have a spare thread available.
*/
@ -662,19 +674,18 @@ thread_userret(struct proc *p, struct ksegrp *kg, struct kse *ke,
ke->ke_tdspare = thread_alloc();
mtx_unlock(&Giant);
}
#endif
/*
* Bound threads need no additional work.
*/
if ((td->td_flags & TDF_UNBOUND) == 0)
return (0);
error = 0;
/*
* Decide whether or not we should perform an upcall now.
*/
if (((td->td_flags & TDF_UPCALLING) == 0) && td->td_mailbox) {
error = thread_consider_upcalling(p, kg, ke, td, frame);
error = thread_consider_upcalling(td);
if (error != 0)
/*
* Failing to do the KSE operation just defaults
@ -694,7 +705,8 @@ thread_userret(struct proc *p, struct ksegrp *kg, struct kse *ke,
/*
* Set user context to the UTS.
*/
cpu_set_upcall_kse(td, ke);
td->td_flags &= ~TDF_UNBOUND;
cpu_set_upcall_kse(td, td->td_kse);
if (error)
/*
* Failing to do the KSE operation just defaults

View File

@ -67,7 +67,7 @@ static int oiks_debug = 1; /* 0 disable, 1 printf, 2 enter debugger */
SYSCTL_INT(_kern_threads, OID_AUTO, oiks, CTLFLAG_RW,
&oiks_debug, 0, "OIKS thread debug");
static int max_threads_per_proc = 4;
static int max_threads_per_proc = 6;
SYSCTL_INT(_kern_threads, OID_AUTO, max_per_proc, CTLFLAG_RW,
&max_threads_per_proc, 0, "Limit on threads per proc");
@ -330,7 +330,10 @@ thread_export_context(struct thread *td)
void *addr2;
int error;
ucontext_t uc;
int unbound;
unbound = (td->td_flags & TDF_UNBOUND);
td->td_flags &= ~TDF_UNBOUND;
#ifdef __ia64__
td2_mbx = 0; /* pacify gcc (!) */
#endif
@ -365,6 +368,7 @@ thread_export_context(struct thread *td)
error = suword(addr1, (u_long)td->td_mailbox);
if (error == -1)
error = EFAULT;
td->td_flags |= unbound;
return (error);
}
@ -574,9 +578,10 @@ signal_upcall(struct proc *p, int sig)
* no other completed threads.
*/
static int
thread_consider_upcalling(struct proc *p, struct ksegrp *kg, struct kse *ke,
struct thread *td, struct trapframe *frame)
thread_consider_upcalling(struct thread *td)
{
struct proc *p;
struct ksegrp *kg;
int error;
/*
@ -597,7 +602,14 @@ thread_consider_upcalling(struct proc *p, struct ksegrp *kg, struct kse *ke,
* Decide whether to perfom an upcall now.
*/
/* Make sure there are no other threads waiting to run. */
if (TAILQ_FIRST(&kg->kg_runq)) {
p = td->td_proc;
kg = td->td_ksegrp;
PROC_LOCK(p);
mtx_lock_spin(&sched_lock);
/* bogus test, ok for testing though */
if (TAILQ_FIRST(&kg->kg_runq) &&
(TAILQ_LAST(&kg->kg_runq, threadqueue)
!= kg->kg_last_assigned)) {
/*
* Another thread in this KSEG needs to run.
* Switch to it instead of performing an upcall,
@ -621,8 +633,6 @@ thread_consider_upcalling(struct proc *p, struct ksegrp *kg, struct kse *ke,
* the next upcall to any KSE in this KSEG.
*
*/
PROC_LOCK(p);
mtx_lock_spin(&sched_lock);
thread_exit(); /* Abandon current thread. */
/* NOTREACHED */
} else
@ -633,6 +643,8 @@ thread_consider_upcalling(struct proc *p, struct ksegrp *kg, struct kse *ke,
* nested in the kernel.
*/
td->td_flags |= TDF_UPCALLING;
mtx_unlock_spin(&sched_lock);
PROC_UNLOCK(p);
return (0);
}
@ -649,11 +661,11 @@ thread_consider_upcalling(struct proc *p, struct ksegrp *kg, struct kse *ke,
* We will clear it here.
*/
int
thread_userret(struct proc *p, struct ksegrp *kg, struct kse *ke,
struct thread *td, struct trapframe *frame)
thread_userret(struct thread *td, struct trapframe *frame)
{
int error;
#if 0
/*
* Ensure that we have a spare thread available.
*/
@ -662,19 +674,18 @@ thread_userret(struct proc *p, struct ksegrp *kg, struct kse *ke,
ke->ke_tdspare = thread_alloc();
mtx_unlock(&Giant);
}
#endif
/*
* Bound threads need no additional work.
*/
if ((td->td_flags & TDF_UNBOUND) == 0)
return (0);
error = 0;
/*
* Decide whether or not we should perform an upcall now.
*/
if (((td->td_flags & TDF_UPCALLING) == 0) && td->td_mailbox) {
error = thread_consider_upcalling(p, kg, ke, td, frame);
error = thread_consider_upcalling(td);
if (error != 0)
/*
* Failing to do the KSE operation just defaults
@ -694,7 +705,8 @@ thread_userret(struct proc *p, struct ksegrp *kg, struct kse *ke,
/*
* Set user context to the UTS.
*/
cpu_set_upcall_kse(td, ke);
td->td_flags &= ~TDF_UNBOUND;
cpu_set_upcall_kse(td, td->td_kse);
if (error)
/*
* Failing to do the KSE operation just defaults

View File

@ -81,7 +81,7 @@ userret(td, frame, oticks)
PROC_LOCK(p);
mtx_lock_spin(&sched_lock);
if (SIGPENDING(p) && ((p->p_sflag & PS_NEEDSIGCHK) == 0 ||
(ke->ke_flags & KEF_ASTPENDING) == 0))
(td->td_kse->ke_flags & KEF_ASTPENDING) == 0))
printf("failed to set signal flags properly for ast()\n");
mtx_unlock_spin(&sched_lock);
PROC_UNLOCK(p);
@ -119,7 +119,7 @@ userret(td, frame, oticks)
* DO special thread processing, e.g. upcall tweaking and such
*/
if (p->p_flag & P_KSES) {
thread_userret(p, kg, ke, td, frame);
thread_userret(td, frame);
/* printf("KSE thread returned"); */
}
@ -149,7 +149,7 @@ ast(struct trapframe *framep)
{
struct thread *td = curthread;
struct proc *p = td->td_proc;
struct kse *ke = td->td_kse;
struct kse *ke;
struct ksegrp *kg = td->td_ksegrp;
u_int prticks, sticks;
int sflag;
@ -178,6 +178,7 @@ ast(struct trapframe *framep)
* ast() will be called again.
*/
mtx_lock_spin(&sched_lock);
ke = td->td_kse;
sticks = ke->ke_sticks;
sflag = p->p_sflag;
flags = ke->ke_flags;

View File

@ -924,8 +924,7 @@ int thread_suspend_check(int how);
void thread_unsuspend(struct proc *p);
void thread_suspend_one(struct thread *td);
void thread_unsuspend_one(struct thread *td);
int thread_userret(struct proc *p, struct ksegrp *kg, struct kse *ke,
struct thread *td, struct trapframe *frame);
int thread_userret(struct thread *td, struct trapframe *frame);
void thread_sanity_check(struct thread *td);
#endif /* _KERNEL */