Go for it mpi.. move forward. ok beck@
On Mon, Feb 6, 2017 at 7:48 AM, Martin Pieuchot <m...@openbsd.org> wrote: > On 24/01/17(Tue) 13:35, Martin Pieuchot wrote: > > Userland threads are preempt()'d when hogging a CPU or when processing > > an AST. Currently when such a thread is preempted the scheduler looks > > for an idle CPU and puts it on its run queue. That means the number of > > involuntary context switch often result in a migration. > > > > This is not a problem per se and one could argue that if another CPU > > is idle it makes sense to move. However with the KERNEL_LOCK() moving > > to another CPU won't necessarily allows the preempt()'d thread to run. > > It's even worse, it increases contention. > > > > If you add to this behavior the fact that sched_choosecpu() prefers idle > > CPUs in a linear order, meaning CPU0 > CPU1 > .. > CPUN, you'll > > understand that the set of idle CPUs will change every time preempt() is > > called. > > > > I believe this behavior affects kernel threads by side effect, since > > the set of idle CPU changes every time a thread is preempted. With this > > diff the 'softnet' thread didn't move on a 2 CPUs machine during simple > > benchmarks. Without, it plays ping-pong between CPU. > > > > The goal of this diff is to reduce the number of migrations. You > > can compare the value of 'sched_nomigrations' and 'sched_nmigrations' > > with and without it. > > > > As usual, I'd like to know what's the impact of this diff on your > > favorite benchmark. Please test and report back. > > I only got positive test results so I'd like to commit the diff below. > > ok? > > Index: kern/sched_bsd.c > =================================================================== > RCS file: /cvs/src/sys/kern/sched_bsd.c,v > retrieving revision 1.44 > diff -u -p -r1.44 sched_bsd.c > --- kern/sched_bsd.c 25 Jan 2017 06:15:50 -0000 1.44 > +++ kern/sched_bsd.c 6 Feb 2017 14:47:28 -0000 > @@ -329,7 +329,6 @@ preempt(struct proc *newp) > SCHED_LOCK(s); > p->p_priority = p->p_usrpri; > p->p_stat = SRUN; > - p->p_cpu = sched_choosecpu(p); > setrunqueue(p); > p->p_ru.ru_nivcsw++; > mi_switch(); > >