Until now, governor_wait() has awakened the poll loop whenever the
generation timer expires, to allow it to shrink the governor to the next
smaller size in governor_run(). However, if the governor is already the
smallest possible size, then governor_run() will not have anything to do
and will not restart the timer, which means that governor_wait() will again
immediately wake up the poll loop, and we end up using 100% CPU.
This is kind of hard to trigger because normally the client will destroy
a governor in such a case. However, if there are too many subfacets, the
client will keep even a minimum-size governor, triggering the bug.
Bug #12106.
Reported-by: Alex Yip <alex@nicira.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
void
governor_wait(struct governor *g)
{
- poll_timer_wait_until(g->start + MAX_ELAPSED);
+ if (g->size > MIN_SIZE) {
+ poll_timer_wait_until(g->start + MAX_ELAPSED);
+ }
}
/* Returns true if 'g' has been doing only a minimal amount of work and thus