Add couple memory barries to serialize tdq_cpu_idle and tdq_load accesses.

This change fixes transient performance drops in some of my benchmarks,
vanishing as soon as I am trying to collect any stats from the scheduler.
It looks like reordered access to those variables sometimes caused loss of
IPI_PREEMPT, that delayed thread execution until some later interrupt.

MFC after:	3 days
This commit is contained in:
Alexander Motin 2014-09-14 22:13:19 +00:00
parent 759e01ce9a
commit 7e9b58eaaa
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=271604

View File

@ -1037,6 +1037,7 @@ tdq_notify(struct tdq *tdq, struct thread *td)
ctd = pcpu_find(cpu)->pc_curthread;
if (!sched_shouldpreempt(pri, ctd->td_priority, 1))
return;
mb();
if (TD_IS_IDLETHREAD(ctd)) {
/*
* If the MD code has an idle wakeup routine try that before
@ -2640,6 +2641,7 @@ sched_idletd(void *dummy)
/* Run main MD idle handler. */
tdq->tdq_cpu_idle = 1;
mb();
cpu_idle(switchcnt * 4 > sched_idlespinthresh);
tdq->tdq_cpu_idle = 0;