diff options
author | Ben Pfaff <blp@nicira.com> | 2012-06-20 13:18:25 -0700 |
---|---|---|
committer | Ben Pfaff <blp@nicira.com> | 2012-06-20 13:18:46 -0700 |
commit | d6a556b757f6482aeb2d1762d6e85a0b5fe80b1e (patch) | |
tree | 70e71a9fa4282526681316ab3fad35139c12631a | |
parent | 0428e519ceee3b0459936cda7c6d7723c5d0c272 (diff) |
ofproto-dpif-governor: Wake up only when there is genuinely work to do.
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>
-rw-r--r-- | ofproto/ofproto-dpif-governor.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/ofproto/ofproto-dpif-governor.c b/ofproto/ofproto-dpif-governor.c index 817186ae..458f8d71 100644 --- a/ofproto/ofproto-dpif-governor.c +++ b/ofproto/ofproto-dpif-governor.c @@ -93,7 +93,9 @@ governor_run(struct governor *g) 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 |