Martin Pieuchot <m...@openbsd.org> writes: > On 06/06/19(Thu) 15:16, Martin Pieuchot wrote: >> On 02/06/19(Sun) 16:41, Martin Pieuchot wrote: >> > On 01/06/19(Sat) 18:55, Martin Pieuchot wrote: >> > > Diff below exists mainly for documentation and test purposes. If >> > > you're not interested about how to break the scheduler internals in >> > > pieces, don't read further and go straight to testing! >> > > >> > > - First change is to stop calling tsleep(9) at PUSER. That makes >> > > it clear that all "sleeping priorities" are smaller than PUSER. >> > > That's important to understand for the diff below. `p_priority' >> > > is currently a placeholder for the "sleeping priority" and the >> > > "runnqueue priority". Both fields are separated by this diff. >> > > >> > > - When a thread goes to sleep, the priority argument of tsleep(9) is >> > > now recorded in `p_slpprio'. This argument can be considered as part >> > > of the sleep queue. Its purpose is to place the thread into a higher >> > > runqueue when awoken. >> > > >> > > - Currently, for stopped threads, `p_priority' correspond to `p_usrpri'. >> > > So setrunnable() has been untangled to place SSTOP and SSLEEP threads >> > > in the preferred queue without having to use `p_priority'. Note that >> > > `p_usrpri' is still recalculated *after* having called setrunqueue(). >> > > This is currently fine because setrunnable() is called with >> > > SCHED_LOCK() >> > > but it will be racy when we'll split it. >> > > >> > > - A new field, `p_runprio' has been introduced. It should be considered >> > > as part of the per-CPU runqueues. It indicates where a current thread >> > > is placed. >> > > >> > > - `spc_curpriority' is now updated at every context-switch. That means >> > > need_resched() won't be called after comparing an out-of-date value. >> > > At the same time, `p_usrpri' is initialized to the highest possible >> > > value for idle threads. >> > > >> > > - resched_proc() was calling need_resched() in the following conditions: >> > > - If the SONPROC thread has a higher priority that the current >> > > running thread (itself). >> > > - Twice in setrunnable() when we know that p_priority <= p_usrpri. >> > > - If schedcpu() considered that a thread, after updating its prio, >> > > should preempt the one running on the CPU pointed by `p_cpu'. >> > > >> > > The diff below simplify all of that by calling need_resched() when: >> > > - A thread is inserted in a CPU runqueue at a higher priority than >> > > the one SONPROC. >> > > - schedcpu() decides that a thread in SRUN state should preempt the >> > > one SONPROC. >> > > >> > > - `p_estcpu' `p_usrpri' and `p_slptime' which represent the "priority" >> > > of a thread are now updated while holding a per-thread mutex. As a >> > > result schedclock() and donice() no longer takes the SCHED_LOCK(), >> > > and schedcpu() almost never take it. >> > > >> > > - With this diff top(1) and ps(1) will report the "real" `p_usrpi' value >> > > when displaying priorities. This is helpful to understand what's >> > > happening: >> > > >> > > load averages: 0.99, 0.56, 0.25 two.lab.grenadille.net >> > > 23:42:10 >> > > 70 threads: 68 idle, 2 on processor >> > > up 0:09 >> > > CPU0: 0.0% user, 0.0% nice, 51.0% sys, 2.0% spin, 0.0% intr, 47.1% >> > > idle >> > > CPU1: 2.0% user, 0.0% nice, 51.0% sys, 3.9% spin, 0.0% intr, 43.1% >> > > idle >> > > Memory: Real: 47M/1005M act/tot Free: 2937M Cache: 812M Swap: 0K/4323M >> > > >> > > PID TID PRI NICE SIZE RES STATE WAIT TIME CPU >> > > COMMAND >> > > 81000 145101 72 0 0K 1664K sleep/1 bored 1:15 36.96% >> > > softnet >> > > 47133 244097 73 0 2984K 4408K sleep/1 netio 1:06 35.06% cvs >> > > 64749 522184 66 0 176K 148K onproc/1 - 0:55 28.81% nfsd >> > > 21615 602473 127 0 0K 1664K sleep/0 - 7:22 0.00% >> > > idle0 >> > > 12413 606242 127 0 0K 1664K sleep/1 - 7:08 0.00% idle1 >> > > 85778 338258 50 0 4936K 7308K idle select 0:10 0.00% ssh >> > > 22771 575513 50 0 176K 148K sleep/0 nfsd 0:02 0.00% nfsd >> > > .... >> > > >> > > >> > > - The removal of `p_priority' and the change that makes mi_switch() >> > > always update `spc_curpriority' might introduce some changes in >> > > behavior, especially with kernel threads that were not going through >> > > tsleep(9). We currently have some situations where the priority of >> > > the running thread isn't correctly reflected. This diff changes that >> > > which means we should be able to better understand where the problems >> > > are. >> > > >> > > I'd be interested in comments/tests/reviews before continuing in this >> > > direction. Note that at least part of this diff are required to split >> > > the accounting apart from the SCHED_LOCK() as well. >> > > >> > > I'll also work on exporting scheduler statistics unless somebody wants >> > > to beat me :) >> > >> > Updated diff to use IPL_SCHED and rebased to apply on top of -current :) >> >> Updated diff that fixes a pagefault reported by sthen@. > > Rebased diff on top of -current. I'm still looking for tests and > comments :) > > > Index: arch/m88k/m88k/m88k_machdep.c > =================================================================== > RCS file: /cvs/src/sys/arch/m88k/m88k/m88k_machdep.c,v > retrieving revision 1.69 > diff -u -p -r1.69 m88k_machdep.c > --- arch/m88k/m88k/m88k_machdep.c 22 Oct 2018 17:31:24 -0000 1.69 > +++ arch/m88k/m88k/m88k_machdep.c 1 Jun 2019 16:28:43 -0000 > @@ -564,9 +564,7 @@ cpu_emergency_disable() > * to mi_switch(). > */ > SCHED_LOCK(s); > - p->p_priority = p->p_usrpri; > - p->p_stat = SRUN; > - setrunqueue(p); > + setrunqueue(p->p_cpu, p, p->p_usrpri); > p->p_ru.ru_nvcsw++; > SCHED_UNLOCK(s); > } > Index: arch/sparc64/sparc64/db_interface.c > =================================================================== > RCS file: /cvs/src/sys/arch/sparc64/sparc64/db_interface.c,v > retrieving revision 1.51 > diff -u -p -r1.51 db_interface.c > --- arch/sparc64/sparc64/db_interface.c 23 Mar 2019 05:47:23 -0000 > 1.51 > +++ arch/sparc64/sparc64/db_interface.c 1 Jun 2019 17:22:32 -0000 > @@ -964,10 +964,10 @@ db_proc_cmd(addr, have_addr, count, modi > return; > } > db_printf("process %p:", p); > - db_printf("pid:%d vmspace:%p pmap:%p ctx:%x wchan:%p pri:%d upri:%d\n", > + db_printf("pid:%d vmspace:%p pmap:%p ctx:%x wchan:%p spri:%d upri:%d\n", > p->p_p->ps_pid, p->p_vmspace, p->p_vmspace->vm_map.pmap, > p->p_vmspace->vm_map.pmap->pm_ctx, > - p->p_wchan, p->p_priority, p->p_usrpri); > + p->p_wchan, p->p_slpprio, p->p_usrpri); > db_printf("maxsaddr:%p ssiz:%dpg or %llxB\n", > p->p_vmspace->vm_maxsaddr, p->p_vmspace->vm_ssize, > (unsigned long long)ptoa(p->p_vmspace->vm_ssize)); > Index: dev/pci/drm/drm_linux.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/drm_linux.c,v > retrieving revision 1.38 > diff -u -p -r1.38 drm_linux.c > --- dev/pci/drm/drm_linux.c 9 Jun 2019 12:58:30 -0000 1.38 > +++ dev/pci/drm/drm_linux.c 9 Jun 2019 14:50:00 -0000 > @@ -116,7 +116,7 @@ wake_up_process(struct proc *p) > atomic_cas_ptr(&sch_proc, p, NULL); > if (p->p_wchan) { > if (p->p_stat == SSLEEP) { > - setrunnable(p); > + setrunnable(p, p->p_slpprio); > r = 1; > } else > unsleep(p); > Index: dev/pci/drm/i915/intel_breadcrumbs.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/intel_breadcrumbs.c,v > retrieving revision 1.1 > diff -u -p -r1.1 intel_breadcrumbs.c > --- dev/pci/drm/i915/intel_breadcrumbs.c 14 Apr 2019 10:14:52 -0000 > 1.1 > +++ dev/pci/drm/i915/intel_breadcrumbs.c 1 Jun 2019 16:30:43 -0000 > @@ -451,7 +451,7 @@ static bool __intel_engine_add_wait(stru > #ifdef __linux__ > if (wait->tsk->prio > to_wait(parent)->tsk->prio) { > #else > - if (wait->tsk->p_priority > > to_wait(parent)->tsk->p_priority) { > + if (wait->tsk->p_usrpri > > to_wait(parent)->tsk->p_usrpri) { > #endif > p = &parent->rb_right; > first = false; > @@ -538,7 +538,7 @@ static inline bool chain_wakeup(struct r > #else > static inline bool chain_wakeup(struct rb_node *rb, int priority) > { > - return rb && to_wait(rb)->tsk->p_priority <= priority; > + return rb && to_wait(rb)->tsk->p_usrpri <= priority; > } > #endif > > @@ -558,7 +558,7 @@ static inline int wakeup_priority(struct > if (p == b->signaler) > return INT_MIN; > else > - return p->p_priority; > + return p->p_usrpri; > } > #endif > > Index: kern/init_main.c > =================================================================== > RCS file: /cvs/src/sys/kern/init_main.c,v > retrieving revision 1.290 > diff -u -p -r1.290 init_main.c > --- kern/init_main.c 21 Jun 2019 09:39:48 -0000 1.290 > +++ kern/init_main.c 21 Jun 2019 16:55:50 -0000 > @@ -205,6 +205,7 @@ main(void *framep) > */ > curproc = p = &proc0; > p->p_cpu = curcpu(); > + mtx_init(&p->p_mtx, IPL_SCHED); > > /* > * Initialize timeouts. > Index: kern/kern_fork.c > =================================================================== > RCS file: /cvs/src/sys/kern/kern_fork.c,v > retrieving revision 1.213 > diff -u -p -r1.213 kern_fork.c > --- kern/kern_fork.c 21 Jun 2019 09:39:48 -0000 1.213 > +++ kern/kern_fork.c 21 Jun 2019 17:02:25 -0000 > @@ -146,12 +146,14 @@ sys___tfork(struct proc *p, void *v, reg > struct proc * > thread_new(struct proc *parent, vaddr_t uaddr) > { > - struct proc *p; > + struct proc *p; > > p = pool_get(&proc_pool, PR_WAITOK); > p->p_stat = SIDL; /* protect against others */ > + p->p_runprio = 0; > p->p_flag = 0; > p->p_limit = NULL; > + mtx_init(&p->p_mtx, IPL_SCHED); > > /* > * Make a proc table entry for the new process. > @@ -170,13 +172,6 @@ thread_new(struct proc *parent, vaddr_t > */ > timeout_set(&p->p_sleep_to, endtsleep, p); > > - /* > - * set priority of child to be that of parent > - * XXX should move p_estcpu into the region of struct proc which gets > - * copied. > - */ > - scheduler_fork_hook(parent, p); > - > #ifdef WITNESS > p->p_sleeplocks = NULL; > #endif > @@ -329,9 +324,8 @@ fork_thread_start(struct proc *p, struct > int s; > > SCHED_LOCK(s); > - p->p_stat = SRUN; > - p->p_cpu = sched_choosecpu_fork(parent, flags); > - setrunqueue(p); > + p->p_cpu = parent->p_cpu; > + setrunqueue(NULL, p, p->p_usrpri); > SCHED_UNLOCK(s); > } > > Index: kern/kern_proc.c > =================================================================== > RCS file: /cvs/src/sys/kern/kern_proc.c,v > retrieving revision 1.85 > diff -u -p -r1.85 kern_proc.c > --- kern/kern_proc.c 12 Nov 2018 15:09:17 -0000 1.85 > +++ kern/kern_proc.c 1 Jun 2019 16:36:57 -0000 > @@ -475,8 +475,8 @@ proc_printit(struct proc *p, const char > (*pr)("PROC (%s) pid=%d stat=%s\n", p->p_p->ps_comm, p->p_tid, pst); > (*pr)(" flags process=%b proc=%b\n", > p->p_p->ps_flags, PS_BITS, p->p_flag, P_BITS); > - (*pr)(" pri=%u, usrpri=%u, nice=%d\n", > - p->p_priority, p->p_usrpri, p->p_p->ps_nice); > + (*pr)(" slpprio=%u, usrpri=%u, nice=%d\n", > + p->p_slpprio, p->p_usrpri, p->p_p->ps_nice); > (*pr)(" forw=%p, list=%p,%p\n", > TAILQ_NEXT(p, p_runq), p->p_list.le_next, p->p_list.le_prev); > (*pr)(" process=%p user=%p, vmspace=%p\n", > Index: kern/kern_resource.c > =================================================================== > RCS file: /cvs/src/sys/kern/kern_resource.c,v > retrieving revision 1.65 > diff -u -p -r1.65 kern_resource.c > --- kern/kern_resource.c 21 Jun 2019 09:39:48 -0000 1.65 > +++ kern/kern_resource.c 21 Jun 2019 16:55:50 -0000 > @@ -197,7 +197,6 @@ donice(struct proc *curp, struct process > { > struct ucred *ucred = curp->p_ucred; > struct proc *p; > - int s; > > if (ucred->cr_uid != 0 && ucred->cr_ruid != 0 && > ucred->cr_uid != chgpr->ps_ucred->cr_uid && > @@ -210,11 +209,12 @@ donice(struct proc *curp, struct process > n += NZERO; > if (n < chgpr->ps_nice && suser(curp)) > return (EACCES); > + TAILQ_FOREACH(p, &chgpr->ps_threads, p_thr_link) { > + mtx_enter(&p->p_mtx); > + resetpriority(p, p->p_estcpu, n); > + mtx_leave(&p->p_mtx); > + } > chgpr->ps_nice = n; > - SCHED_LOCK(s); > - TAILQ_FOREACH(p, &chgpr->ps_threads, p_thr_link) > - (void)resetpriority(p); > - SCHED_UNLOCK(s); > return (0); > } > > Index: kern/kern_sched.c > =================================================================== > RCS file: /cvs/src/sys/kern/kern_sched.c,v > retrieving revision 1.58 > diff -u -p -r1.58 kern_sched.c > --- kern/kern_sched.c 1 Jun 2019 14:11:17 -0000 1.58 > +++ kern/kern_sched.c 1 Jun 2019 20:04:12 -0000 > @@ -149,6 +149,7 @@ sched_idle(void *v) > cpuset_add(&sched_idle_cpus, ci); > p->p_stat = SSLEEP; > p->p_cpu = ci; > + p->p_usrpri = MAXPRI; > atomic_setbits_int(&p->p_flag, P_CPUPEG); > mi_switch(); > cpuset_del(&sched_idle_cpus, ci); > @@ -244,39 +245,59 @@ sched_init_runqueues(void) > } > > void > -setrunqueue(struct proc *p) > +setrunqueue(struct cpu_info *ci, struct proc *p, uint8_t prio) > { > struct schedstate_percpu *spc; > - int queue = p->p_priority >> 2; > + int queue = prio >> 2; > + > + if (ci == NULL) > + ci = sched_choosecpu(p); > + > + KASSERT(ci != NULL); > + > + p->p_cpu = ci; > + p->p_stat = SRUN; > + p->p_runprio = prio; > > SCHED_ASSERT_LOCKED(); > - spc = &p->p_cpu->ci_schedstate; > + > + spc = &ci->ci_schedstate; > spc->spc_nrun++; > > TAILQ_INSERT_TAIL(&spc->spc_qs[queue], p, p_runq); > spc->spc_whichqs |= (1 << queue); > - cpuset_add(&sched_queued_cpus, p->p_cpu); > + cpuset_add(&sched_queued_cpus, ci); > > - if (cpuset_isset(&sched_idle_cpus, p->p_cpu)) > - cpu_unidle(p->p_cpu); > + if (cpuset_isset(&sched_idle_cpus, ci)) > + cpu_unidle(ci); > + > + if (prio < spc->spc_curpriority) > + need_resched(ci); > } > > -void > -remrunqueue(struct proc *p) > +uint8_t > +remrunqueue(struct cpu_info *ci, struct proc *p) > { > - struct schedstate_percpu *spc; > - int queue = p->p_priority >> 2; > + struct schedstate_percpu *spc = &ci->ci_schedstate; > + uint8_t prio = p->p_runprio; > + int queue = prio >> 2; > > SCHED_ASSERT_LOCKED(); > - spc = &p->p_cpu->ci_schedstate; > + > spc->spc_nrun--; > > TAILQ_REMOVE(&spc->spc_qs[queue], p, p_runq); > if (TAILQ_EMPTY(&spc->spc_qs[queue])) { > spc->spc_whichqs &= ~(1 << queue); > if (spc->spc_whichqs == 0) > - cpuset_del(&sched_queued_cpus, p->p_cpu); > + cpuset_del(&sched_queued_cpus, ci); > } > + > + KASSERT(p->p_stat == SRUN); > + KASSERT(p->p_cpu == ci); > + p->p_runprio = 0; > + > + return (prio); > } > > struct proc * > @@ -293,10 +314,12 @@ sched_chooseproc(void) > if (spc->spc_whichqs) { > for (queue = 0; queue < SCHED_NQS; queue++) { > while ((p = TAILQ_FIRST(&spc->spc_qs[queue]))) { > - remrunqueue(p); > - p->p_cpu = sched_choosecpu(p); > - setrunqueue(p); > - if (p->p_cpu == curcpu()) { > + struct cpu_info *ci; > + uint8_t prio; > + > + prio = remrunqueue(p->p_cpu, p); > + setrunqueue(NULL, p, prio); > + if (ci == curcpu()) { > KASSERT(p->p_flag & P_CPUPEG); > goto again; > } > @@ -315,7 +338,7 @@ again: > if (spc->spc_whichqs) { > queue = ffs(spc->spc_whichqs) - 1; > p = TAILQ_FIRST(&spc->spc_qs[queue]); > - remrunqueue(p); > + remrunqueue(p->p_cpu, p); > sched_noidle++; > KASSERT(p->p_stat == SRUN); > } else if ((p = sched_steal_proc(curcpu())) == NULL) { > @@ -337,66 +360,10 @@ again: > } > KASSERT(p); > p->p_stat = SRUN; > - } > - > - KASSERT(p->p_wchan == NULL); > - return (p); > -} > - > -struct cpu_info * > -sched_choosecpu_fork(struct proc *parent, int flags) > -{ > -#ifdef MULTIPROCESSOR > - struct cpu_info *choice = NULL; > - fixpt_t load, best_load = ~0; > - int run, best_run = INT_MAX; > - struct cpu_info *ci; > - struct cpuset set; > - > -#if 0 > - /* > - * XXX > - * Don't do this until we have a painless way to move the cpu in exec. > - * Preferably when nuking the old pmap and getting a new one on a > - * new cpu. > - */ > - /* > - * PPWAIT forks are simple. We know that the parent will not > - * run until we exec and choose another cpu, so we just steal its > - * cpu. > - */ > - if (flags & FORK_PPWAIT) > - return (parent->p_cpu); > -#endif > - > - /* > - * Look at all cpus that are currently idle and have nothing queued. > - * If there are none, pick the one with least queued procs first, > - * then the one with lowest load average. > - */ > - cpuset_complement(&set, &sched_queued_cpus, &sched_idle_cpus); > - cpuset_intersection(&set, &set, &sched_all_cpus); > - if (cpuset_first(&set) == NULL) > - cpuset_copy(&set, &sched_all_cpus); > - > - while ((ci = cpuset_first(&set)) != NULL) { > - cpuset_del(&set, ci); > - > - load = ci->ci_schedstate.spc_ldavg; > - run = ci->ci_schedstate.spc_nrun; > - > - if (choice == NULL || run < best_run || > - (run == best_run &&load < best_load)) { > - choice = ci; > - best_load = load; > - best_run = run; > - } > } > > - return (choice); > -#else > - return (curcpu()); > -#endif > + KASSERT(p->p_wchan == NULL); > + return (p); > } > > struct cpu_info * > @@ -408,6 +375,8 @@ sched_choosecpu(struct proc *p) > struct cpu_info *ci; > struct cpuset set; > > + KASSERT(p->p_cpu != NULL); > + > /* > * If pegged to a cpu, don't allow it to move. > */ > @@ -509,8 +478,7 @@ sched_steal_proc(struct cpu_info *self) > if (best == NULL) > return (NULL); > > - spc = &best->p_cpu->ci_schedstate; > - remrunqueue(best); > + remrunqueue(best->p_cpu, best); > best->p_cpu = self; > > sched_stolen++; > @@ -566,7 +534,7 @@ sched_proc_to_cpu_cost(struct cpu_info * > * and the higher the priority of the proc. > */ > if (!cpuset_isset(&sched_idle_cpus, ci)) { > - cost += (p->p_priority - spc->spc_curpriority) * > + cost += (p->p_usrpri - spc->spc_curpriority) * > sched_cost_priority; > cost += sched_cost_runnable; > } > @@ -610,11 +578,8 @@ sched_peg_curproc(struct cpu_info *ci) > int s; > > SCHED_LOCK(s); > - p->p_priority = p->p_usrpri; > - p->p_stat = SRUN; > - p->p_cpu = ci; > atomic_setbits_int(&p->p_flag, P_CPUPEG); > - setrunqueue(p); > + setrunqueue(ci, p, p->p_usrpri); > p->p_ru.ru_nvcsw++; > mi_switch(); > SCHED_UNLOCK(s); > Index: kern/kern_sig.c > =================================================================== > RCS file: /cvs/src/sys/kern/kern_sig.c,v > retrieving revision 1.231 > diff -u -p -r1.231 kern_sig.c > --- kern/kern_sig.c 21 Jun 2019 09:39:48 -0000 1.231 > +++ kern/kern_sig.c 21 Jun 2019 16:55:50 -0000 > @@ -890,6 +890,7 @@ ptsignal(struct proc *p, int signum, enu > struct process *pr = p->p_p; > struct proc *q; > int wakeparent = 0; > + uint8_t stpprio = 0; > > KERNEL_ASSERT_LOCKED(); > > @@ -1154,10 +1155,11 @@ runfast: > /* > * Raise priority to at least PUSER. > */ > - if (p->p_priority > PUSER) > - p->p_priority = PUSER; > + stpprio = p->p_usrpri; > + if (stpprio > PUSER) > + stpprio = PUSER; > run: > - setrunnable(p); > + setrunnable(p, stpprio ? stpprio : p->p_usrpri); > out: > SCHED_UNLOCK(s); > if (wakeparent) > @@ -1908,7 +1910,7 @@ userret(struct proc *p) > > WITNESS_WARN(WARN_PANIC, NULL, "userret: returning"); > > - p->p_cpu->ci_schedstate.spc_curpriority = p->p_priority = p->p_usrpri; > + p->p_cpu->ci_schedstate.spc_curpriority = p->p_usrpri; > } > > int > @@ -1994,7 +1996,7 @@ single_thread_set(struct proc *p, enum s > if (mode == SINGLE_EXIT) { > SCHED_LOCK(s); > if (q->p_stat == SSTOP) { > - setrunnable(q); > + setrunnable(q, q->p_usrpri); > pr->ps_singlecount++; > } > SCHED_UNLOCK(s); > @@ -2018,13 +2020,13 @@ single_thread_set(struct proc *p, enum s > break; > } > /* need to unwind or exit, so wake it */ > - setrunnable(q); > + setrunnable(q, q->p_slpprio); > } > pr->ps_singlecount++; > break; > case SSTOP: > if (mode == SINGLE_EXIT) { > - setrunnable(q); > + setrunnable(q, q->p_usrpri); > pr->ps_singlecount++; > } > break; > @@ -2049,7 +2051,7 @@ single_thread_wait(struct process *pr) > { > /* wait until they're all suspended */ > while (pr->ps_singlecount > 0) > - tsleep(&pr->ps_singlecount, PUSER, "suspend", 0); > + tsleep(&pr->ps_singlecount, PWAIT, "suspend", 0); > } > > void > @@ -2078,7 +2080,7 @@ single_thread_clear(struct proc *p, int > SCHED_LOCK(s); > if (q->p_stat == SSTOP && (q->p_flag & flag) == 0) { > if (q->p_wchan == 0) > - setrunnable(q); > + setrunnable(q, q->p_usrpri); > else > q->p_stat = SSLEEP; > } > Index: kern/kern_synch.c > =================================================================== > RCS file: /cvs/src/sys/kern/kern_synch.c,v > retrieving revision 1.149 > diff -u -p -r1.149 kern_synch.c > --- kern/kern_synch.c 18 Jun 2019 15:53:11 -0000 1.149 > +++ kern/kern_synch.c 18 Jun 2019 16:09:59 -0000 > @@ -280,8 +280,10 @@ sleep_setup(struct sleep_state *sls, con > > p->p_wchan = ident; > p->p_wmesg = wmesg; > + mtx_enter(&p->p_mtx); > p->p_slptime = 0; > - p->p_priority = prio & PRIMASK; > + mtx_leave(&p->p_mtx); > + p->p_slpprio = prio & PRIMASK; > TAILQ_INSERT_TAIL(&slpque[LOOKUP(ident)], p, p_runq); > } > > @@ -304,7 +306,6 @@ sleep_finish(struct sleep_state *sls, in > panic("sleep_finish !SONPROC"); > #endif > > - p->p_cpu->ci_schedstate.spc_curpriority = p->p_usrpri; > SCHED_UNLOCK(sls->sls_s); > > /* > @@ -402,7 +403,7 @@ endtsleep(void *arg) > SCHED_LOCK(s); > if (p->p_wchan) { > if (p->p_stat == SSLEEP) > - setrunnable(p); > + setrunnable(p, p->p_slpprio); > else > unsleep(p); > atomic_setbits_int(&p->p_flag, P_TIMEOUT); > @@ -457,7 +458,7 @@ wakeup_n(const volatile void *ident, int > p->p_wchan = 0; > TAILQ_REMOVE(qp, p, p_runq); > if (p->p_stat == SSLEEP) > - setrunnable(p); > + setrunnable(p, p->p_slpprio); > } > } > SCHED_UNLOCK(s); > @@ -476,6 +477,7 @@ int > sys_sched_yield(struct proc *p, void *v, register_t *retval) > { > struct proc *q; > + uint8_t newprio; > int s; > > SCHED_LOCK(s); > @@ -484,11 +486,10 @@ sys_sched_yield(struct proc *p, void *v, > * sched_yield(2), drop its priority to ensure its siblings > * can make some progress. > */ > - p->p_priority = p->p_usrpri; > + newprio = p->p_usrpri; > TAILQ_FOREACH(q, &p->p_p->ps_threads, p_thr_link) > - p->p_priority = max(p->p_priority, q->p_priority); > - p->p_stat = SRUN; > - setrunqueue(p); > + newprio = max(newprio, q->p_runprio); > + setrunqueue(p->p_cpu, p, newprio); > p->p_ru.ru_nvcsw++; > mi_switch(); > SCHED_UNLOCK(s); > @@ -574,7 +575,7 @@ thrsleep(struct proc *p, struct sys___th > void *sleepaddr = &p->p_thrslpid; > if (ident == -1) > sleepaddr = &globalsleepaddr; > - error = tsleep(sleepaddr, PUSER | PCATCH, "thrsleep", > + error = tsleep(sleepaddr, PWAIT | PCATCH, "thrsleep", > (int)to_ticks); > } > > Index: kern/sched_bsd.c > =================================================================== > RCS file: /cvs/src/sys/kern/sched_bsd.c,v > retrieving revision 1.53 > diff -u -p -r1.53 sched_bsd.c > --- kern/sched_bsd.c 1 Jun 2019 14:11:17 -0000 1.53 > +++ kern/sched_bsd.c 1 Jun 2019 21:26:33 -0000 > @@ -61,8 +61,8 @@ int rrticks_init; /* # of hardclock tic > struct __mp_lock sched_lock; > #endif > > -void schedcpu(void *); > -void updatepri(struct proc *); > +void schedcpu(void *); > +uint32_t decay_aftersleep(struct proc *, uint32_t, uint32_t); > > void > scheduler_start(void) > @@ -206,6 +206,7 @@ schedcpu(void *arg) > struct proc *p; > int s; > unsigned int newcpu; > + uint8_t newprio; > int phz; > > /* > @@ -228,6 +229,7 @@ schedcpu(void *arg) > /* > * Increment sleep time (if sleeping). We ignore overflow. > */ > + mtx_enter(&p->p_mtx); > if (p->p_stat == SSLEEP || p->p_stat == SSTOP) > p->p_slptime++; > p->p_pctcpu = (p->p_pctcpu * ccpu) >> FSHIFT; > @@ -235,9 +237,10 @@ schedcpu(void *arg) > * If the process has slept the entire second, > * stop recalculating its priority until it wakes up. > */ > - if (p->p_slptime > 1) > + if (p->p_slptime > 1) { > + mtx_leave(&p->p_mtx); > continue; > - SCHED_LOCK(s); > + } > /* > * p_pctcpu is only for diagnostic tools such as ps. > */ > @@ -252,19 +255,26 @@ schedcpu(void *arg) > #endif > p->p_cpticks = 0; > newcpu = (u_int) decay_cpu(loadfac, p->p_estcpu); > - p->p_estcpu = newcpu; > - resetpriority(p); > - if (p->p_priority >= PUSER) { > - if (p->p_stat == SRUN && > - (p->p_priority / SCHED_PPQ) != > - (p->p_usrpri / SCHED_PPQ)) { > - remrunqueue(p); > - p->p_priority = p->p_usrpri; > - setrunqueue(p); > - } else > - p->p_priority = p->p_usrpri; > + newprio = resetpriority(p, newcpu, p->p_p->ps_nice); > + mtx_leave(&p->p_mtx); > + > + if (p->p_stat == SRUN) { > + SCHED_LOCK(s); > + if (p->p_stat == SRUN) { > + struct schedstate_percpu *spc; > + uint8_t runprio; > + > + spc = &p->p_cpu->ci_schedstate; > + runprio = p->p_runprio; > + if ((runprio >= PUSER) && > + (SRUNQ(runprio) != SRUNQ(newprio))) { > + remrunqueue(p->p_cpu, p); > + setrunqueue(p->p_cpu, p, newprio); > + } else if (newprio < spc->spc_curpriority) > + need_resched(p->p_cpu); > + } > + SCHED_UNLOCK(s); > } > - SCHED_UNLOCK(s); > } > uvm_meter(); > wakeup(&lbolt); > @@ -276,23 +286,23 @@ schedcpu(void *arg) > * For all load averages >= 1 and max p_estcpu of 255, sleeping for at > * least six times the loadfactor will decay p_estcpu to zero. > */ > -void > -updatepri(struct proc *p) > +uint32_t > +decay_aftersleep(struct proc *p, uint32_t estcpu, uint32_t slptime) > { > - unsigned int newcpu = p->p_estcpu; > fixpt_t loadfac = loadfactor(averunnable.ldavg[0]); > + uint32_t newcpu; > > - SCHED_ASSERT_LOCKED(); > - > - if (p->p_slptime > 5 * loadfac) > - p->p_estcpu = 0; > + if (slptime > 5 * loadfac) > + newcpu = 0; > else { > - p->p_slptime--; /* the first time was done in schedcpu */ > - while (newcpu && --p->p_slptime) > - newcpu = (int) decay_cpu(loadfac, newcpu); > - p->p_estcpu = newcpu; > + newcpu = estcpu; > + slptime--; /* the first time was done in schedcpu */ > + while (newcpu && --slptime) > + newcpu = decay_cpu(loadfac, newcpu); > + > } > - resetpriority(p); > + > + return (newcpu); > } > > /* > @@ -308,9 +318,7 @@ yield(void) > NET_ASSERT_UNLOCKED(); > > SCHED_LOCK(s); > - p->p_priority = p->p_usrpri; > - p->p_stat = SRUN; > - setrunqueue(p); > + setrunqueue(p->p_cpu, p, p->p_usrpri); > p->p_ru.ru_nvcsw++; > mi_switch(); > SCHED_UNLOCK(s); > @@ -329,9 +337,7 @@ preempt(void) > int s; > > SCHED_LOCK(s); > - p->p_priority = p->p_usrpri; > - p->p_stat = SRUN; > - setrunqueue(p); > + setrunqueue(p->p_cpu, p, p->p_usrpri); > p->p_ru.ru_nivcsw++; > mi_switch(); > SCHED_UNLOCK(s); > @@ -427,7 +433,9 @@ mi_switch(void) > */ > KASSERT(p->p_cpu == curcpu()); > > - nanouptime(&p->p_cpu->ci_schedstate.spc_runtime); > + spc = &curcpu()->ci_schedstate; > + spc->spc_curpriority = p->p_usrpri; > + nanouptime(&spc->spc_runtime); > > #ifdef MULTIPROCESSOR > /* > @@ -441,36 +449,13 @@ mi_switch(void) > #endif > } > > -static __inline void > -resched_proc(struct proc *p, u_char pri) > -{ > - struct cpu_info *ci; > - > - /* > - * XXXSMP > - * This does not handle the case where its last > - * CPU is running a higher-priority process, but every > - * other CPU is running a lower-priority process. There > - * are ways to handle this situation, but they're not > - * currently very pretty, and we also need to weigh the > - * cost of moving a process from one CPU to another. > - * > - * XXXSMP > - * There is also the issue of locking the other CPU's > - * sched state, which we currently do not do. > - */ > - ci = (p->p_cpu != NULL) ? p->p_cpu : curcpu(); > - if (pri < ci->ci_schedstate.spc_curpriority) > - need_resched(ci); > -} > - > /* > * Change process state to be runnable, > * placing it on the run queue if it is in memory, > * and awakening the swapper if it isn't in memory. > */ > void > -setrunnable(struct proc *p) > +setrunnable(struct proc *p, uint8_t slpprio) > { > SCHED_ASSERT_LOCKED(); > > @@ -493,13 +478,18 @@ setrunnable(struct proc *p) > unsleep(p); /* e.g. when sending signals */ > break; > } > - p->p_stat = SRUN; > - p->p_cpu = sched_choosecpu(p); > - setrunqueue(p); > - if (p->p_slptime > 1) > - updatepri(p); > + /* Put the process on any runqueue using its sleeping priority. */ > + setrunqueue(NULL, p, slpprio); > + > + mtx_enter(&p->p_mtx); > + if (p->p_slptime > 1) { > + uint32_t newcpu; > + > + newcpu = decay_aftersleep(p, p->p_estcpu, p->p_slptime); > + resetpriority(p, newcpu, p->p_p->ps_nice); > + } > p->p_slptime = 0; > - resched_proc(p, p->p_priority); > + mtx_leave(&p->p_mtx); > } > > /* > @@ -507,18 +497,18 @@ setrunnable(struct proc *p) > * Arrange to reschedule if the resulting priority is better > * than that of the current process. > */ > -void > -resetpriority(struct proc *p) > +uint8_t > +resetpriority(struct proc *p, uint32_t newcpu, uint8_t nice) > { > - unsigned int newpriority; > + unsigned int newprio; > > - SCHED_ASSERT_LOCKED(); > + newprio = min((PUSER + newcpu + NICE_WEIGHT * (nice - NZERO)), MAXPRI); > + > + MUTEX_ASSERT_LOCKED(&p->p_mtx); > + p->p_estcpu = newcpu; > + p->p_usrpri = newprio; > > - newpriority = PUSER + p->p_estcpu + > - NICE_WEIGHT * (p->p_p->ps_nice - NZERO); > - newpriority = min(newpriority, MAXPRI); > - p->p_usrpri = newpriority; > - resched_proc(p, p->p_usrpri); > + return (newprio); > } > > /* > @@ -540,17 +530,17 @@ schedclock(struct proc *p) > { > struct cpu_info *ci = curcpu(); > struct schedstate_percpu *spc = &ci->ci_schedstate; > - int s; > + uint32_t newcpu; > > if (p == spc->spc_idleproc || spc->spc_spinning) > return; > > - SCHED_LOCK(s); > - p->p_estcpu = ESTCPULIM(p->p_estcpu + 1); > - resetpriority(p); > - if (p->p_priority >= PUSER) > - p->p_priority = p->p_usrpri; > - SCHED_UNLOCK(s); > + /* Only decay the priority if nobody is messing with it. */ > + if (!mtx_enter_try(&p->p_mtx)) > + return; > + newcpu = ESTCPULIM(p->p_estcpu + 1); > + resetpriority(p, newcpu, p->p_p->ps_nice); > + mtx_leave(&p->p_mtx); > } > > void (*cpu_setperf)(int); > Index: kern/sys_futex.c > =================================================================== > RCS file: /cvs/src/sys/kern/sys_futex.c,v > retrieving revision 1.12 > diff -u -p -r1.12 sys_futex.c > --- kern/sys_futex.c 6 Feb 2019 15:11:20 -0000 1.12 > +++ kern/sys_futex.c 1 Jun 2019 16:04:57 -0000 > @@ -254,7 +254,7 @@ futex_wait(uint32_t *uaddr, uint32_t val > TAILQ_INSERT_TAIL(&f->ft_threads, p, p_fut_link); > p->p_futex = f; > > - error = rwsleep(p, &ftlock, PUSER|PCATCH, "fsleep", (int)to_ticks); > + error = rwsleep(p, &ftlock, PWAIT | PCATCH, "fsleep", (int)to_ticks); > if (error == ERESTART) > error = ECANCELED; > else if (error == EWOULDBLOCK) { > Index: kern/sys_generic.c > =================================================================== > RCS file: /cvs/src/sys/kern/sys_generic.c,v > retrieving revision 1.124 > diff -u -p -r1.124 sys_generic.c > --- kern/sys_generic.c 21 Jun 2019 09:39:48 -0000 1.124 > +++ kern/sys_generic.c 21 Jun 2019 16:55:50 -0000 > @@ -806,7 +806,7 @@ selwakeup(struct selinfo *sip) > SCHED_LOCK(s); > if (p->p_wchan == (caddr_t)&selwait) { > if (p->p_stat == SSLEEP) > - setrunnable(p); > + setrunnable(p, p->p_slpprio); > else > unsleep(p); > } else if (p->p_flag & P_SELECT) > Index: kern/sys_process.c > =================================================================== > RCS file: /cvs/src/sys/kern/sys_process.c,v > retrieving revision 1.80 > diff -u -p -r1.80 sys_process.c > --- kern/sys_process.c 19 Feb 2018 09:25:13 -0000 1.80 > +++ kern/sys_process.c 1 Jun 2019 16:18:41 -0000 > @@ -493,7 +493,7 @@ ptrace_ctrl(struct proc *p, int req, pid > if (t->p_stat == SSTOP) { > t->p_xstat = data; > SCHED_LOCK(s); > - setrunnable(t); > + setrunnable(t, t->p_usrpri); > SCHED_UNLOCK(s); > } else { > if (data != 0) > Index: kern/vfs_sync.c > =================================================================== > RCS file: /cvs/src/sys/kern/vfs_sync.c,v > retrieving revision 1.60 > diff -u -p -r1.60 vfs_sync.c > --- kern/vfs_sync.c 13 Aug 2018 15:26:17 -0000 1.60 > +++ kern/vfs_sync.c 1 Jun 2019 16:20:49 -0000 > @@ -245,7 +245,7 @@ speedup_syncer(void) > > SCHED_LOCK(s); > if (syncerproc && syncerproc->p_wchan == &lbolt) > - setrunnable(syncerproc); > + setrunnable(syncerproc, syncerproc->p_usrpri); > SCHED_UNLOCK(s); > if (rushjob < syncdelay / 2) { > rushjob += 1; > Index: sys/proc.h > =================================================================== > RCS file: /cvs/src/sys/sys/proc.h,v > retrieving revision 1.270 > diff -u -p -r1.270 proc.h > --- sys/proc.h 21 Jun 2019 09:39:48 -0000 1.270 > +++ sys/proc.h 21 Jun 2019 16:55:51 -0000 > @@ -316,6 +316,7 @@ struct p_inentry { > /* > * Locks used to protect struct members in this file: > * s scheduler lock > + * m `p_mtx' > */ > struct proc { > TAILQ_ENTRY(proc) p_runq; /* [s] current run/sleep queue */ > @@ -326,6 +327,7 @@ struct proc { > > TAILQ_ENTRY(proc) p_fut_link; /* Threads in a futex linkage. */ > struct futex *p_futex; /* Current sleeping futex. */ > + struct mutex p_mtx; > > /* substructures: */ > struct filedesc *p_fd; /* copy of p_p->ps_fd */ > @@ -337,7 +339,7 @@ struct proc { > int p_flag; /* P_* flags. */ > u_char p_spare; /* unused */ > char p_stat; /* [s] S* process status. */ > - char p_pad1[1]; > + uint8_t p_runprio; /* [s] priority in SRUN. */ > u_char p_descfd; /* if not 255, fdesc permits this fd */ > > pid_t p_tid; /* Thread identifier. */ > @@ -350,13 +352,12 @@ struct proc { > long p_thrslpid; /* for thrsleep syscall */ > > /* scheduling */ > - u_int p_estcpu; /* [s] Time averaged val of p_cpticks */ > int p_cpticks; /* Ticks of cpu time. */ > const volatile void *p_wchan; /* [s] Sleep address. */ > struct timeout p_sleep_to;/* timeout for tsleep() */ > const char *p_wmesg; /* [s] Reason for sleep. */ > - fixpt_t p_pctcpu; /* [s] %cpu for this thread */ > - u_int p_slptime; /* [s] Time since last blocked. */ > + fixpt_t p_pctcpu; /* [m] %cpu for this thread */ > + u_int p_slptime; /* [m] Time since last blocked. */ > u_int p_uticks; /* Statclock hits in user mode. */ > u_int p_sticks; /* Statclock hits in system mode. */ > u_int p_iticks; /* Statclock hits processing intr. */ > @@ -375,8 +376,13 @@ struct proc { > #define p_startcopy p_sigmask > sigset_t p_sigmask; /* Current signal mask. */ > > - u_char p_priority; /* [s] Process priority. */ > - u_char p_usrpri; /* [s] User-prio based on p_estcpu & ps_nice. */ > + u_int p_spserial; > + vaddr_t p_spstart; > + vaddr_t p_spend; > + > + u_char p_slpprio; /* [s] Sleeping priority. */ > + u_char p_usrpri; /* [m] Priority based on p_estcpu & ps_nice. */ > + u_int p_estcpu; /* [m] Time averaged val of p_cpticks */ > int p_pledge_syscall; /* Cache of current syscall */ > > struct ucred *p_ucred; /* cached credentials */ > @@ -559,8 +565,8 @@ void leavepgrp(struct process *); > void killjobc(struct process *); > void preempt(void); > void procinit(void); > -void resetpriority(struct proc *); > -void setrunnable(struct proc *); > +uint8_t resetpriority(struct proc *, uint32_t, uint8_t); > +void setrunnable(struct proc *, uint8_t); > void endtsleep(void *); > void unsleep(struct proc *); > void reaper(void *); > Index: sys/sched.h > =================================================================== > RCS file: /cvs/src/sys/sys/sched.h,v > retrieving revision 1.52 > diff -u -p -r1.52 sched.h > --- sys/sched.h 16 May 2019 13:52:47 -0000 1.52 > +++ sys/sched.h 1 Jun 2019 21:14:35 -0000 > @@ -137,6 +137,7 @@ struct cpustats { > #define SPCF_SHOULDHALT 0x0004 /* CPU should be vacated */ > #define SPCF_HALTED 0x0008 /* CPU has been halted */ > > +#define SRUNQ(prio) ((prio) / SCHED_PPQ) > #define SCHED_PPQ (128 / SCHED_NQS) /* priorities per queue > */ > #define NICE_WEIGHT 2 /* priorities per nice level */ > #define ESTCPULIM(e) min((e), NICE_WEIGHT * PRIO_MAX - SCHED_PPQ) > @@ -179,13 +180,8 @@ void sched_stop_secondary_cpus(void); > int cpu_is_online(struct cpu_info *); > > void sched_init_runqueues(void); > -void setrunqueue(struct proc *); > -void remrunqueue(struct proc *); > - > -/* Inherit the parent's scheduler history */ > -#define scheduler_fork_hook(parent, child) do { > \ > - (child)->p_estcpu = (parent)->p_estcpu; \ > -} while (0) > +void setrunqueue(struct cpu_info *, struct proc *, uint8_t); > +uint8_t remrunqueue(struct cpu_info *, struct proc *); > > /* Chargeback parents for the sins of their children. */ > #define scheduler_wait_hook(parent, child) do { > \ > Index: sys/sysctl.h > =================================================================== > RCS file: /cvs/src/sys/sys/sysctl.h,v > retrieving revision 1.189 > diff -u -p -r1.189 sysctl.h > --- sys/sysctl.h 21 Jun 2019 09:39:48 -0000 1.189 > +++ sys/sysctl.h 21 Jun 2019 16:55:51 -0000 > @@ -637,7 +637,7 @@ do { > \ > (kp)->p_stat = (p)->p_stat; \ > (kp)->p_slptime = (p)->p_slptime; \ > (kp)->p_holdcnt = 1; \ > - (kp)->p_priority = (p)->p_priority; \ > + (kp)->p_priority = (p)->p_usrpri + PZERO; \ > (kp)->p_usrpri = (p)->p_usrpri; \ > if ((p)->p_wchan && (p)->p_wmesg) \ > copy_str((kp)->p_wmesg, (p)->p_wmesg, \
Hi, seems that I can't boot my thinkpad e485 with this applied. The machine freezes during the boot, at sysctl/network/library reorder phases. I tried few boots and I didn't get further than that. Here's dmesg without the sched patch: OpenBSD 6.5-current (GENERIC.MP) #9: Fri Jun 28 07:41:58 EEST 2019 t...@asteroid.bittivirhe.fi:/usr/src/sys/arch/amd64/compile/GENERIC.MP real mem = 8172609536 (7794MB) avail mem = 7912329216 (7545MB) mpath0 at root scsibus0 at mpath0: 256 targets mainbus0 at root bios0 at mainbus0: SMBIOS rev. 3.1 @ 0x98707000 (59 entries) bios0: vendor LENOVO version "R0UET66W (1.46 )" date 10/26/2018 bios0: LENOVO 20KUCTO1WW acpi0 at bios0: ACPI 5.0 acpi0: sleep states S0 S3 S4 S5 acpi0: tables DSDT FACP SSDT SSDT CRAT CDIT SSDT TPM2 UEFI MSDM BATB HPET APIC MCFG SBST VFCT IVRS FPDT SSDT SSDT SSDT BGRT UEFI SSDT acpi0: wakeup devices GPP0(S3) GPP1(S3) GPP2(S3) GPP3(S3) GPP4(S3) GPP5(S3) GPP6(S3) GP17(S3) XHC0(S3) XHC1(S3) GP18(S3) LID_(S3) SLPB(S3) acpitimer0 at acpi0: 3579545 Hz, 32 bits acpihpet0 at acpi0: 14318180 Hz acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat cpu0 at mainbus0: apid 0 (boot processor) cpu0: AMD Ryzen 5 2500U with Radeon Vega Mobile Gfx, 1996.60 MHz, 17-11-00 cpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,RDRAND,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,SKINIT,TCE,TOPEXT,CPCTR,DBKP,PCTRL3,MWAITX,ITSC,FSGSBASE,BMI1,AVX2,SMEP,BMI2,RDSEED,ADX,SMAP,CLFLUSHOPT,SHA,IBPB,XSAVEOPT,XSAVEC,XGETBV1,XSAVES cpu0: 64KB 64b/line 4-way I-cache, 32KB 64b/line 8-way D-cache, 512KB 64b/line 8-way L2 cache, 4MB 64b/line 16-way L3 cache cpu0: ITLB 64 4KB entries fully associative, 64 4MB entries fully associative cpu0: DTLB 64 4KB entries fully associative, 64 4MB entries fully associative cpu0: smt 0, core 0, package 0 mtrr: Pentium Pro MTRR support, 8 var ranges, 88 fixed ranges cpu0: apic clock running at 24MHz cpu0: mwait min=64, max=64, C-substates=1.1, IBE cpu1 at mainbus0: apid 1 (application processor) cpu1: AMD Ryzen 5 2500U with Radeon Vega Mobile Gfx, 1996.23 MHz, 17-11-00 cpu1: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,RDRAND,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,SKINIT,TCE,TOPEXT,CPCTR,DBKP,PCTRL3,MWAITX,ITSC,FSGSBASE,BMI1,AVX2,SMEP,BMI2,RDSEED,ADX,SMAP,CLFLUSHOPT,SHA,IBPB,XSAVEOPT,XSAVEC,XGETBV1,XSAVES cpu1: 64KB 64b/line 4-way I-cache, 32KB 64b/line 8-way D-cache, 512KB 64b/line 8-way L2 cache, 4MB 64b/line 16-way L3 cache cpu1: ITLB 64 4KB entries fully associative, 64 4MB entries fully associative cpu1: DTLB 64 4KB entries fully associative, 64 4MB entries fully associative cpu1: smt 1, core 0, package 0 cpu2 at mainbus0: apid 2 (application processor) cpu2: AMD Ryzen 5 2500U with Radeon Vega Mobile Gfx, 1996.23 MHz, 17-11-00 cpu2: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,RDRAND,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,SKINIT,TCE,TOPEXT,CPCTR,DBKP,PCTRL3,MWAITX,ITSC,FSGSBASE,BMI1,AVX2,SMEP,BMI2,RDSEED,ADX,SMAP,CLFLUSHOPT,SHA,IBPB,XSAVEOPT,XSAVEC,XGETBV1,XSAVES cpu2: 64KB 64b/line 4-way I-cache, 32KB 64b/line 8-way D-cache, 512KB 64b/line 8-way L2 cache, 4MB 64b/line 16-way L3 cache cpu2: ITLB 64 4KB entries fully associative, 64 4MB entries fully associative cpu2: DTLB 64 4KB entries fully associative, 64 4MB entries fully associative cpu2: smt 0, core 1, package 0 cpu3 at mainbus0: apid 3 (application processor) cpu3: AMD Ryzen 5 2500U with Radeon Vega Mobile Gfx, 1996.23 MHz, 17-11-00 cpu3: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,RDRAND,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,SKINIT,TCE,TOPEXT,CPCTR,DBKP,PCTRL3,MWAITX,ITSC,FSGSBASE,BMI1,AVX2,SMEP,BMI2,RDSEED,ADX,SMAP,CLFLUSHOPT,SHA,IBPB,XSAVEOPT,XSAVEC,XGETBV1,XSAVES cpu3: 64KB 64b/line 4-way I-cache, 32KB 64b/line 8-way D-cache, 512KB 64b/line 8-way L2 cache, 4MB 64b/line 16-way L3 cache cpu3: ITLB 64 4KB entries fully associative, 64 4MB entries fully associative cpu3: DTLB 64 4KB entries fully associative, 64 4MB entries fully associative cpu3: smt 1, core 1, package 0 cpu4 at mainbus0: apid 4 (application processor) cpu4: AMD Ryzen 5 2500U with Radeon Vega Mobile Gfx, 1996.23 MHz, 17-11-00 cpu4: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,RDRAND,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,SKINIT,TCE,TOPEXT,CPCTR,DBKP,PCTRL3,MWAITX,ITSC,FSGSBASE,BMI1,AVX2,SMEP,BMI2,RDSEED,ADX,SMAP,CLFLUSHOPT,SHA,IBPB,XSAVEOPT,XSAVEC,XGETBV1,XSAVES cpu4: 64KB 64b/line 4-way I-cache, 32KB 64b/line 8-way D-cache, 512KB 64b/line 8-way L2 cache, 4MB 64b/line 16-way L3 cache cpu4: ITLB 64 4KB entries fully associative, 64 4MB entries fully associative cpu4: DTLB 64 4KB entries fully associative, 64 4MB entries fully associative cpu4: smt 0, core 2, package 0 cpu5 at mainbus0: apid 5 (application processor) cpu5: AMD Ryzen 5 2500U with Radeon Vega Mobile Gfx, 1996.23 MHz, 17-11-00 cpu5: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,RDRAND,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,SKINIT,TCE,TOPEXT,CPCTR,DBKP,PCTRL3,MWAITX,ITSC,FSGSBASE,BMI1,AVX2,SMEP,BMI2,RDSEED,ADX,SMAP,CLFLUSHOPT,SHA,IBPB,XSAVEOPT,XSAVEC,XGETBV1,XSAVES cpu5: 64KB 64b/line 4-way I-cache, 32KB 64b/line 8-way D-cache, 512KB 64b/line 8-way L2 cache, 4MB 64b/line 16-way L3 cache cpu5: ITLB 64 4KB entries fully associative, 64 4MB entries fully associative cpu5: DTLB 64 4KB entries fully associative, 64 4MB entries fully associative cpu5: smt 1, core 2, package 0 cpu6 at mainbus0: apid 6 (application processor) cpu6: AMD Ryzen 5 2500U with Radeon Vega Mobile Gfx, 1996.23 MHz, 17-11-00 cpu6: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,RDRAND,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,SKINIT,TCE,TOPEXT,CPCTR,DBKP,PCTRL3,MWAITX,ITSC,FSGSBASE,BMI1,AVX2,SMEP,BMI2,RDSEED,ADX,SMAP,CLFLUSHOPT,SHA,IBPB,XSAVEOPT,XSAVEC,XGETBV1,XSAVES cpu6: 64KB 64b/line 4-way I-cache, 32KB 64b/line 8-way D-cache, 512KB 64b/line 8-way L2 cache, 4MB 64b/line 16-way L3 cache cpu6: ITLB 64 4KB entries fully associative, 64 4MB entries fully associative cpu6: DTLB 64 4KB entries fully associative, 64 4MB entries fully associative cpu6: smt 0, core 3, package 0 cpu7 at mainbus0: apid 7 (application processor) cpu7: AMD Ryzen 5 2500U with Radeon Vega Mobile Gfx, 1996.23 MHz, 17-11-00 cpu7: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,HTT,SSE3,PCLMUL,MWAIT,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,MOVBE,POPCNT,AES,XSAVE,AVX,F16C,RDRAND,NXE,MMXX,FFXSR,PAGE1GB,RDTSCP,LONG,LAHF,CMPLEG,SVM,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,SKINIT,TCE,TOPEXT,CPCTR,DBKP,PCTRL3,MWAITX,ITSC,FSGSBASE,BMI1,AVX2,SMEP,BMI2,RDSEED,ADX,SMAP,CLFLUSHOPT,SHA,IBPB,XSAVEOPT,XSAVEC,XGETBV1,XSAVES cpu7: 64KB 64b/line 4-way I-cache, 32KB 64b/line 8-way D-cache, 512KB 64b/line 8-way L2 cache, 4MB 64b/line 16-way L3 cache cpu7: ITLB 64 4KB entries fully associative, 64 4MB entries fully associative cpu7: DTLB 64 4KB entries fully associative, 64 4MB entries fully associative cpu7: smt 1, core 3, package 0 ioapic0 at mainbus0: apid 32 pa 0xfec00000, version 21, 24 pins, can't remap ioapic1 at mainbus0: apid 33 pa 0xfec01000, version 21, 32 pins, can't remap acpimcfg0 at acpi0 acpimcfg0: addr 0xf8000000, bus 0-63 acpiprt0 at acpi0: bus 0 (PCI0) acpiprt1 at acpi0: bus 1 (GPP0) acpiprt2 at acpi0: bus 2 (GPP1) acpiprt3 at acpi0: bus 3 (GPP2) acpiprt4 at acpi0: bus -1 (GPP3) acpiprt5 at acpi0: bus -1 (GPP4) acpiprt6 at acpi0: bus 4 (GPP5) acpiprt7 at acpi0: bus -1 (GPP6) acpiprt8 at acpi0: bus 5 (GP17) acpiprt9 at acpi0: bus 6 (GP18) acpiec0 at acpi0 acpicpu0 at acpi0: C2(0@400 io@0x414), C1(0@1 mwait), PSS acpicpu1 at acpi0: C2(0@400 io@0x414), C1(0@1 mwait), PSS acpicpu2 at acpi0: C2(0@400 io@0x414), C1(0@1 mwait), PSS acpicpu3 at acpi0: C2(0@400 io@0x414), C1(0@1 mwait), PSS acpicpu4 at acpi0: C2(0@400 io@0x414), C1(0@1 mwait), PSS acpicpu5 at acpi0: C2(0@400 io@0x414), C1(0@1 mwait), PSS acpicpu6 at acpi0: C2(0@400 io@0x414), C1(0@1 mwait), PSS acpicpu7 at acpi0: C2(0@400 io@0x414), C1(0@1 mwait), PSS acpipwrres0 at acpi0: P0ST, resource for SATA acpipwrres1 at acpi0: P3ST, resource for SATA acpibtn0 at acpi0: PWRB acpipci0 at acpi0 PCI0: 0x00000010 0x00000011 0x00000000 acpicmos0 at acpi0 acpibat0 at acpi0: BAT0 model "01AV445" serial 2591 type LiP oem "LGC" acpiac0 at acpi0: AC unit online acpithinkpad0 at acpi0 "SMB0001" at acpi0 not configured acpibtn1 at acpi0: LID_ acpibtn2 at acpi0: SLPB "PNP0C14" at acpi0 not configured "PNP0C14" at acpi0 not configured "PNP0C14" at acpi0 not configured "STM7304" at acpi0 not configured "USBC000" at acpi0 not configured acpivideo0 at acpi0: VGA_ cpu0: 1996 MHz: speeds: 2000 1700 1600 MHz pci0 at mainbus0 bus 0 pchb0 at pci0 dev 0 function 0 "AMD AMD64 17h/1xh Root Complex" rev 0x00 "AMD AMD64 17h/1xh IOMMU" rev 0x00 at pci0 dev 0 function 2 not configured pchb1 at pci0 dev 1 function 0 "AMD AMD64 17h PCIE" rev 0x00 ppb0 at pci0 dev 1 function 1 "AMD AMD64 17h/1xh PCIE" rev 0x00: msi pci1 at ppb0 bus 1 nvme0 at pci1 dev 0 function 0 vendor "Lenovo", unknown product 0x0003 rev 0x00: msix, NVMe 1.2 nvme0: LENSE20256GMSP34MEAT2TA, firmware 2.6.8341, serial 1227066205564 scsibus1 at nvme0: 1 targets sd0 at scsibus1 targ 0 lun 0: <NVMe, LENSE20256GMSP34, 2.6.> SCSI4 0/direct fixed sd0: 244198MB, 512 bytes/sector, 500118192 sectors ppb1 at pci0 dev 1 function 2 "AMD AMD64 17h/1xh PCIE" rev 0x00: msi pci2 at ppb1 bus 2 re0 at pci2 dev 0 function 0 "Realtek 8168" rev 0x10: RTL8168GU/8111GU (0x5080), msi, address e8:6a:64:33:83:cc rgephy0 at re0 phy 7: RTL8251 PHY, rev. 0 ppb2 at pci0 dev 1 function 3 "AMD AMD64 17h/1xh PCIE" rev 0x00: msi pci3 at ppb2 bus 3 sdhc0 at pci3 dev 0 function 0 "O2 Micro 0Z8621 SD/MMC" rev 0x01: apic 33 int 8 sdhc0: SDHC 4.0, 50 MHz base clock sdmmc0 at sdhc0: 4-bit, sd high-speed, mmc high-speed, dma ppb3 at pci0 dev 1 function 6 "AMD AMD64 17h/1xh PCIE" rev 0x00: msi pci4 at ppb3 bus 4 iwm0 at pci4 dev 0 function 0 "Intel Dual Band Wireless-AC 8265" rev 0x78, msi pchb2 at pci0 dev 8 function 0 "AMD AMD64 17h PCIE" rev 0x00 ppb4 at pci0 dev 8 function 1 "AMD AMD64 17h/1xh PCIE" rev 0x00 pci5 at ppb4 bus 5 amdgpu0 at pci5 dev 0 function 0 "ATI Radeon Vega" rev 0xc4 drm0 at amdgpu0 amdgpu0: msi azalia0 at pci5 dev 0 function 1 "ATI Radeon Vega HD Audio" rev 0x00: msi azalia0: no supported codecs ccp0 at pci5 dev 0 function 2 "AMD AMD64 17h/1xh Crypto" rev 0x00 xhci0 at pci5 dev 0 function 3 "AMD AMD64 17h/1xh xHCI" rev 0x00: msi, xHCI 1.10 usb0 at xhci0: USB revision 3.0 uhub0 at usb0 configuration 1 interface 0 "AMD xHCI root hub" rev 3.00/1.00 addr 1 xhci1 at pci5 dev 0 function 4 "AMD AMD64 17h/1xh xHCI" rev 0x00: msi, xHCI 1.10 usb1 at xhci1: USB revision 3.0 uhub1 at usb1 configuration 1 interface 0 "AMD xHCI root hub" rev 3.00/1.00 addr 1 azalia1 at pci5 dev 0 function 6 "AMD AMD64 17h/1xh HD Audio" rev 0x00: apic 33 int 30 azalia1: codecs: Conexant/0x5111 audio0 at azalia1 ppb5 at pci0 dev 8 function 2 "AMD AMD64 17h/1xh PCIE" rev 0x00 pci6 at ppb5 bus 6 ahci0 at pci6 dev 0 function 0 "AMD FCH AHCI" rev 0x61: msi, AHCI 1.3.1 ahci0: port 0: 6.0Gb/s scsibus2 at ahci0: 32 targets sd1 at scsibus2 targ 0 lun 0: <ATA, Samsung SSD 850, EXM0> SCSI3 0/direct fixed naa.50025388400c34c6 sd1: 488386MB, 512 bytes/sector, 1000215216 sectors, thin "AMD FCH SMBus" rev 0x61 at pci0 dev 20 function 0 not configured pcib0 at pci0 dev 20 function 3 "AMD FCH LPC" rev 0x51 pchb3 at pci0 dev 24 function 0 "AMD AMD64 17h/1xh Data Fabric" rev 0x00 pchb4 at pci0 dev 24 function 1 "AMD AMD64 17h/1xh Data Fabric" rev 0x00 pchb5 at pci0 dev 24 function 2 "AMD AMD64 17h/1xh Data Fabric" rev 0x00 pchb6 at pci0 dev 24 function 3 "AMD AMD64 17h/1xh Data Fabric" rev 0x00 pchb7 at pci0 dev 24 function 4 "AMD AMD64 17h/1xh Data Fabric" rev 0x00 pchb8 at pci0 dev 24 function 5 "AMD AMD64 17h/1xh Data Fabric" rev 0x00 pchb9 at pci0 dev 24 function 6 "AMD AMD64 17h/1xh Data Fabric" rev 0x00 pchb10 at pci0 dev 24 function 7 "AMD AMD64 17h/1xh Data Fabric" rev 0x00 isa0 at pcib0 isadma0 at isa0 pckbc0 at isa0 port 0x60/5 irq 1 irq 12 pckbd0 at pckbc0 (kbd slot) wskbd0 at pckbd0: console keyboard pms0 at pckbc0 (aux slot) wsmouse0 at pms0 mux 0 wsmouse1 at pms0 mux 0 pms0: Synaptics clickpad, firmware 8.16, 0x1e2b1 0x940300 pcppi0 at isa0 port 0x61 spkr0 at pcppi0 vmm0 at mainbus0: SVM/RVI efifb at mainbus0 not configured uhidev0 at uhub0 port 3 configuration 1 interface 0 "Microsoft Microsoft Notebook Optical Mouse with Tilt Wheel" rev 2.00/1.20 addr 2 uhidev0: iclass 3/1, 24 report ids ums0 at uhidev0 reportid 17: 3 buttons, Z dir wsmouse2 at ums0 mux 0 uhid0 at uhidev0 reportid 18: input=0, output=0, feature=1 uhid1 at uhidev0 reportid 19: input=1, output=0, feature=0 uhid2 at uhidev0 reportid 23: input=0, output=0, feature=1 uhid3 at uhidev0 reportid 24: input=0, output=0, feature=1 vscsi0 at root scsibus3 at vscsi0: 256 targets softraid0 at root scsibus4 at softraid0: 256 targets sd2 at scsibus4 targ 1 lun 0: <OPENBSD, SR CRYPTO, 006> SCSI2 0/direct fixed sd2: 227678MB, 512 bytes/sector, 466284711 sectors root on sd2a (88532b67c09ce3ee.a) swap on sd2b dump on sd2b TSC skew=-6129185140 drift=170 TSC skew=-6129184900 drift=-10 TSC skew=-6129184890 drift=-20 TSC skew=-6129184910 drift=30 TSC skew=-6129184910 drift=10 TSC skew=-6129184900 drift=20 TSC skew=-6129184910 drift=30 iwm0: hw rev 0x230, fw ver 22.361476.0, address 68:ec:c5:ad:9a:cb initializing kernel modesetting (RAVEN 0x1002:0x15DD 0x17AA:0x506F 0xC4). amdgpu0: 1920x1080, 32bpp wsdisplay0 at amdgpu0 mux 1: console (std, vt100 emulation), using wskbd0 wsdisplay0: screen 1-5 added (std, vt100 emulation)