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:
parent
759e01ce9a
commit
7e9b58eaaa
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=271604
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user