Deleted Added
full compact
39c39
< * $FreeBSD: head/sys/kern/kern_synch.c 82711 2001-09-01 03:54:09Z dillon $
---
> * $FreeBSD: head/sys/kern/kern_synch.c 83366 2001-09-12 08:38:13Z julian $
110,111c110,111
< maybe_resched(p)
< struct proc *p;
---
> maybe_resched(kg)
> struct ksegrp *kg;
115,116c115,116
< if (p->p_pri.pri_level < curproc->p_pri.pri_level)
< curproc->p_sflag |= PS_NEEDRESCHED;
---
> if (kg->kg_pri.pri_level < curthread->td_ksegrp->kg_pri.pri_level)
> curthread->td_kse->ke_flags |= KEF_NEEDRESCHED;
247a248,249
> register struct kse *ke;
> register struct ksegrp *kg;
248a251
> int awake;
252,257c255
< LIST_FOREACH(p, &allproc, p_list) {
< /*
< * Increment time in/out of memory and sleep time
< * (if sleeping). We ignore overflow; with 16-bit int's
< * (remember them?) overflow takes 45 days.
< */
---
> FOREACH_PROC_IN_SYSTEM(p) {
260,270c258,274
< if (p->p_stat == SSLEEP || p->p_stat == SSTOP)
< p->p_slptime++;
< p->p_pctcpu = (p->p_pctcpu * ccpu) >> FSHIFT;
< /*
< * If the process has slept the entire second,
< * stop recalculating its priority until it wakes up.
< */
< if (p->p_slptime > 1) {
< mtx_unlock_spin(&sched_lock);
< continue;
< }
---
> FOREACH_KSEGRP_IN_PROC(p, kg) {
> awake = 0;
> FOREACH_KSE_IN_GROUP(kg, ke) {
> /*
> * Increment time in/out of memory and sleep
> * time (if sleeping). We ignore overflow;
> * with 16-bit int's (remember them?)
> * overflow takes 45 days.
> */
> /* XXXKSE */
> /* if ((ke->ke_flags & KEF_ONRUNQ) == 0) */
> if (p->p_stat == SSLEEP || p->p_stat == SSTOP) {
> ke->ke_slptime++;
> } else {
> ke->ke_slptime = 0;
> awake = 1;
> }
272,274c276,290
< /*
< * p_pctcpu is only for ps.
< */
---
> /*
> * pctcpu is only for ps?
> * Do it per kse.. and add them up at the end?
> * XXXKSE
> */
> ke->ke_pctcpu = (ke->ke_pctcpu * ccpu) >> FSHIFT;
> /*
> * If the kse has been idle the entire second,
> * stop recalculating its priority until
> * it wakes up.
> */
> if (ke->ke_slptime > 1) {
> continue;
> }
>
276,279c292,296
< p->p_pctcpu += (realstathz == 100)?
< ((fixpt_t) p->p_cpticks) << (FSHIFT - CCPU_SHIFT):
< 100 * (((fixpt_t) p->p_cpticks)
< << (FSHIFT - CCPU_SHIFT)) / realstathz;
---
> ke->ke_pctcpu += (realstathz == 100) ?
> ((fixpt_t) ke->ke_cpticks) <<
> (FSHIFT - CCPU_SHIFT) :
> 100 * (((fixpt_t) ke->ke_cpticks) <<
> (FSHIFT - CCPU_SHIFT)) / realstathz;
281,282c298,300
< p->p_pctcpu += ((FSCALE - ccpu) *
< (p->p_cpticks * FSCALE / realstathz)) >> FSHIFT;
---
> ke->ke_pctcpu += ((FSCALE - ccpu) *
> (ke->ke_cpticks * FSCALE / realstathz)) >>
> FSHIFT;
284,298c302,327
< p->p_cpticks = 0;
< p->p_estcpu = decay_cpu(loadfac, p->p_estcpu);
< resetpriority(p);
< if (p->p_pri.pri_level >= PUSER) {
< if (p->p_oncpu == NOCPU && /* idle */
< p->p_stat == SRUN &&
< (p->p_sflag & PS_INMEM) &&
< (p->p_pri.pri_level / RQ_PPQ) !=
< (p->p_pri.pri_user / RQ_PPQ)) {
< remrunqueue(p);
< p->p_pri.pri_level = p->p_pri.pri_user;
< setrunqueue(p);
< } else
< p->p_pri.pri_level = p->p_pri.pri_user;
< }
---
> ke->ke_cpticks = 0;
> } /* end of kse loop */
> if (awake == 0) {
> kg->kg_slptime++;
> } else {
> kg->kg_slptime = 0;
> }
> kg->kg_estcpu = decay_cpu(loadfac, kg->kg_estcpu);
> resetpriority(kg);
> if (kg->kg_pri.pri_level >= PUSER &&
> (p->p_sflag & PS_INMEM)) {
> int changedqueue =
> ((kg->kg_pri.pri_level / RQ_PPQ) !=
> (kg->kg_pri.pri_user / RQ_PPQ));
>
> kg->kg_pri.pri_level = kg->kg_pri.pri_user;
> FOREACH_KSE_IN_GROUP(kg, ke) {
> if ((ke->ke_oncpu == NOCPU) && /* idle */
> (p->p_stat == SRUN) && /* XXXKSE */
> changedqueue) {
> remrunqueue(ke->ke_thread);
> setrunqueue(ke->ke_thread);
> }
> }
> }
> } /* end of ksegrp loop */
300c329
< }
---
> } /* end of process loop */
313,314c342,343
< updatepri(p)
< register struct proc *p;
---
> updatepri(td)
> register struct thread *td;
316c345,346
< register unsigned int newcpu = p->p_estcpu;
---
> register struct ksegrp *kg;
> register unsigned int newcpu;
319,320c349,354
< if (p->p_slptime > 5 * loadfac)
< p->p_estcpu = 0;
---
> if (td == NULL)
> return;
> kg = td->td_ksegrp;
> newcpu = kg->kg_estcpu;
> if (kg->kg_slptime > 5 * loadfac)
> kg->kg_estcpu = 0;
322,323c356,357
< p->p_slptime--; /* the first time was done in schedcpu */
< while (newcpu && --p->p_slptime)
---
> kg->kg_slptime--; /* the first time was done in schedcpu */
> while (newcpu && --kg->kg_slptime)
325c359
< p->p_estcpu = newcpu;
---
> kg->kg_estcpu = newcpu;
327c361
< resetpriority(p);
---
> resetpriority(td->td_ksegrp);
336c370
< static TAILQ_HEAD(slpquehead, proc) slpque[TABLESIZE];
---
> static TAILQ_HEAD(slpquehead, thread) slpque[TABLESIZE];
372a407
> struct thread *td = curthread;
409c444
< KASSERT(ident != NULL && p->p_stat == SRUN, ("msleep"));
---
> KASSERT(ident != NULL && td->td_proc->p_stat == SRUN, ("msleep"));
411,417c446,453
< p->p_wchan = ident;
< p->p_wmesg = wmesg;
< p->p_slptime = 0;
< p->p_pri.pri_level = priority & PRIMASK;
< CTR5(KTR_PROC, "msleep: proc %p (pid %d, %s) on %s (%p)", p, p->p_pid,
< p->p_comm, wmesg, ident);
< TAILQ_INSERT_TAIL(&slpque[LOOKUP(ident)], p, p_slpq);
---
> td->td_wchan = ident;
> td->td_wmesg = wmesg;
> td->td_kse->ke_slptime = 0; /* XXXKSE */
> td->td_ksegrp->kg_slptime = 0;
> td->td_ksegrp->kg_pri.pri_level = priority & PRIMASK;
> CTR5(KTR_PROC, "msleep: thread %p (pid %d, %s) on %s (%p)",
> td, p->p_pid, p->p_comm, wmesg, ident);
> TAILQ_INSERT_TAIL(&slpque[LOOKUP(ident)], td, td_slpq);
419c455
< callout_reset(&p->p_slpcallout, timo, endtsleep, p);
---
> callout_reset(&td->td_slpcallout, timo, endtsleep, td);
427c463
< * stopped, p->p_wchan will be 0 upon return from CURSIG.
---
> * stopped, td->td_wchan will be 0 upon return from CURSIG.
432c468
< p->p_sflag |= PS_SINTR;
---
> td->td_flags |= TDF_SINTR;
439,441c475,477
< if (p->p_wchan != NULL)
< unsleep(p);
< } else if (p->p_wchan == NULL)
---
> if (td->td_wchan != NULL)
> unsleep(td);
> } else if (td->td_wchan == NULL)
445,446c481,482
< if (p->p_wchan != NULL) {
< p->p_stat = SSLEEP;
---
> if (td->td_wchan != NULL) {
> td->td_proc->p_stat = SSLEEP;
450c486
< CTR3(KTR_PROC, "msleep resume: proc %p (pid %d, %s)", p, p->p_pid,
---
> CTR3(KTR_PROC, "msleep resume: proc %p (pid %d, %s)", td, p->p_pid,
452,455c488,491
< KASSERT(p->p_stat == SRUN, ("running but not SRUN"));
< p->p_sflag &= ~PS_SINTR;
< if (p->p_sflag & PS_TIMEOUT) {
< p->p_sflag &= ~PS_TIMEOUT;
---
> KASSERT(td->td_proc->p_stat == SRUN, ("running but not SRUN"));
> td->td_flags &= ~TDF_SINTR;
> if (td->td_flags & TDF_TIMEOUT) {
> td->td_flags &= ~TDF_TIMEOUT;
458,460c494,496
< } else if (p->p_sflag & PS_TIMOFAIL)
< p->p_sflag &= ~PS_TIMOFAIL;
< else if (timo && callout_stop(&p->p_slpcallout) == 0) {
---
> } else if (td->td_flags & TDF_TIMOFAIL)
> td->td_flags &= ~TDF_TIMOFAIL;
> else if (timo && callout_stop(&td->td_slpcallout) == 0) {
470c506
< p->p_sflag |= PS_TIMEOUT;
---
> td->td_flags |= TDF_TIMEOUT;
513c549
< register struct proc *p;
---
> register struct thread *td = arg;
515,517c551,552
< p = (struct proc *)arg;
< CTR3(KTR_PROC, "endtsleep: proc %p (pid %d, %s)", p, p->p_pid,
< p->p_comm);
---
> CTR3(KTR_PROC, "endtsleep: thread %p (pid %d, %s)", td, td->td_proc->p_pid,
> td->td_proc->p_comm);
524,529c559,564
< if ((p->p_sflag & PS_TIMEOUT) != 0) {
< p->p_sflag &= ~PS_TIMEOUT;
< setrunqueue(p);
< } else if (p->p_wchan != NULL) {
< if (p->p_stat == SSLEEP)
< setrunnable(p);
---
> if ((td->td_flags & TDF_TIMEOUT) != 0) {
> td->td_flags &= ~TDF_TIMEOUT;
> setrunqueue(td);
> } else if (td->td_wchan != NULL) {
> if (td->td_proc->p_stat == SSLEEP) /* XXXKSE */
> setrunnable(td);
531,534c566,570
< unsleep(p);
< p->p_sflag |= PS_TIMEOUT;
< } else
< p->p_sflag |= PS_TIMOFAIL;
---
> unsleep(td);
> td->td_flags |= TDF_TIMEOUT;
> } else {
> td->td_flags |= TDF_TIMOFAIL;
> }
542,543c578
< unsleep(p)
< register struct proc *p;
---
> unsleep(struct thread *td)
547,549c582,584
< if (p->p_wchan != NULL) {
< TAILQ_REMOVE(&slpque[LOOKUP(p->p_wchan)], p, p_slpq);
< p->p_wchan = NULL;
---
> if (td->td_wchan != NULL) {
> TAILQ_REMOVE(&slpque[LOOKUP(td->td_wchan)], td, td_slpq);
> td->td_wchan = NULL;
562c597,598
< register struct proc *p;
---
> register struct thread *td;
> struct proc *p;
567,571c603,608
< TAILQ_FOREACH(p, qp, p_slpq) {
< if (p->p_wchan == ident) {
< TAILQ_REMOVE(qp, p, p_slpq);
< p->p_wchan = NULL;
< if (p->p_stat == SSLEEP) {
---
> TAILQ_FOREACH(td, qp, td_slpq) {
> p = td->td_proc;
> if (td->td_wchan == ident) {
> TAILQ_REMOVE(qp, td, td_slpq);
> td->td_wchan = NULL;
> if (td->td_proc->p_stat == SSLEEP) {
573,578c610,616
< CTR3(KTR_PROC, "wakeup: proc %p (pid %d, %s)",
< p, p->p_pid, p->p_comm);
< if (p->p_slptime > 1)
< updatepri(p);
< p->p_slptime = 0;
< p->p_stat = SRUN;
---
> CTR3(KTR_PROC, "wakeup: thread %p (pid %d, %s)",
> td, p->p_pid, p->p_comm);
> if (td->td_ksegrp->kg_slptime > 1)
> updatepri(td);
> td->td_ksegrp->kg_slptime = 0;
> td->td_kse->ke_slptime = 0;
> td->td_proc->p_stat = SRUN;
580,581c618,619
< setrunqueue(p);
< maybe_resched(p);
---
> setrunqueue(td);
> maybe_resched(td->td_ksegrp);
603a642
> register struct thread *td;
609,613c648,653
< TAILQ_FOREACH(p, qp, p_slpq) {
< if (p->p_wchan == ident) {
< TAILQ_REMOVE(qp, p, p_slpq);
< p->p_wchan = NULL;
< if (p->p_stat == SSLEEP) {
---
> TAILQ_FOREACH(td, qp, td_slpq) {
> p = td->td_proc;
> if (td->td_wchan == ident) {
> TAILQ_REMOVE(qp, td, td_slpq);
> td->td_wchan = NULL;
> if (td->td_proc->p_stat == SSLEEP) {
617,620c657,661
< if (p->p_slptime > 1)
< updatepri(p);
< p->p_slptime = 0;
< p->p_stat = SRUN;
---
> if (td->td_ksegrp->kg_slptime > 1)
> updatepri(td);
> td->td_ksegrp->kg_slptime = 0;
> td->td_kse->ke_slptime = 0;
> td->td_proc->p_stat = SRUN;
622,623c663,664
< setrunqueue(p);
< maybe_resched(p);
---
> setrunqueue(td);
> maybe_resched(td->td_ksegrp);
643c684,685
< register struct proc *p = curproc; /* XXX */
---
> struct thread *td = curthread; /* XXX */
> register struct proc *p = td->td_proc; /* XXX */
720,722c762,764
< p->p_lastcpu = p->p_oncpu;
< p->p_oncpu = NOCPU;
< p->p_sflag &= ~PS_NEEDRESCHED;
---
> td->td_lastcpu = td->td_kse->ke_oncpu;
> td->td_kse->ke_oncpu = NOCPU;
> td->td_kse->ke_flags &= ~KEF_NEEDRESCHED;
724c766
< p->p_oncpu = PCPU_GET(cpuid);
---
> td->td_kse->ke_oncpu = PCPU_GET(cpuid);
727c769
< sched_lock.mtx_lock = (uintptr_t)p;
---
> sched_lock.mtx_lock = (uintptr_t)td;
741,742c783
< setrunnable(p)
< register struct proc *p;
---
> setrunnable(struct thread *td)
744c785
<
---
> struct proc *p = td->td_proc;
746a788,791
> case SZOMB: /* not a thread flag XXXKSE */
> panic("setrunnabl(1)");
> }
> switch (td->td_proc->p_stat) {
749d793
< case SZOMB:
752c796
< panic("setrunnable");
---
> panic("setrunnable(2)");
755,756c799,800
< if (p->p_sflag & PS_CVWAITQ)
< cv_waitq_remove(p);
---
> if (td->td_flags & TDF_CVWAITQ)
> cv_waitq_remove(td);
758c802
< unsleep(p);
---
> unsleep(td);
764,767c808,812
< p->p_stat = SRUN;
< if (p->p_slptime > 1)
< updatepri(p);
< p->p_slptime = 0;
---
> td->td_proc->p_stat = SRUN;
> if (td->td_ksegrp->kg_slptime > 1)
> updatepri(td);
> td->td_ksegrp->kg_slptime = 0;
> td->td_kse->ke_slptime = 0;
772,773c817,818
< setrunqueue(p);
< maybe_resched(p);
---
> setrunqueue(td);
> maybe_resched(td->td_ksegrp);
784,785c829,830
< resetpriority(p)
< register struct proc *p;
---
> resetpriority(kg)
> register struct ksegrp *kg;
790,792c835,837
< if (p->p_pri.pri_class == PRI_TIMESHARE) {
< newpriority = PUSER + p->p_estcpu / INVERSE_ESTCPU_WEIGHT +
< NICE_WEIGHT * (p->p_nice - PRIO_MIN);
---
> if (kg->kg_pri.pri_class == PRI_TIMESHARE) {
> newpriority = PUSER + kg->kg_estcpu / INVERSE_ESTCPU_WEIGHT +
> NICE_WEIGHT * (kg->kg_nice - PRIO_MIN);
795c840
< p->p_pri.pri_user = newpriority;
---
> kg->kg_pri.pri_user = newpriority;
797c842
< maybe_resched(p);
---
> maybe_resched(kg);
830,831c875,876
< schedclock(p)
< struct proc *p;
---
> schedclock(td)
> struct thread *td;
832a878,879
> struct kse *ke = td->td_kse;
> struct ksegrp *kg = td->td_ksegrp;
834,839c881,890
< p->p_cpticks++;
< p->p_estcpu = ESTCPULIM(p->p_estcpu + 1);
< if ((p->p_estcpu % INVERSE_ESTCPU_WEIGHT) == 0) {
< resetpriority(p);
< if (p->p_pri.pri_level >= PUSER)
< p->p_pri.pri_level = p->p_pri.pri_user;
---
> if (td) {
> ke->ke_cpticks++;
> kg->kg_estcpu = ESTCPULIM(kg->kg_estcpu + 1);
> if ((kg->kg_estcpu % INVERSE_ESTCPU_WEIGHT) == 0) {
> resetpriority(td->td_ksegrp);
> if (kg->kg_pri.pri_level >= PUSER)
> kg->kg_pri.pri_level = kg->kg_pri.pri_user;
> }
> } else {
> panic("schedclock");
847c898
< yield(struct proc *p, struct yield_args *uap)
---
> yield(struct thread *td, struct yield_args *uap)
849d899
< p->p_retval[0] = 0;
850a901,903
> struct ksegrp *kg = td->td_ksegrp;
> td->td_retval[0] = 0;
>
856,858c909,911
< p->p_pri.pri_level = PRI_MAX_TIMESHARE;
< setrunqueue(p);
< p->p_stats->p_ru.ru_nvcsw++;
---
> kg->kg_pri.pri_level = PRI_MAX_TIMESHARE;
> setrunqueue(td);
> kg->kg_proc->p_stats->p_ru.ru_nvcsw++;