From 91d345e4fd204aaf1938d1465261199e97e91ae9 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Wed, 20 Jun 2012 13:18:25 -0700 Subject: [PATCH] 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 Signed-off-by: Ben Pfaff --- ofproto/ofproto-dpif-governor.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ofproto/ofproto-dpif-governor.c b/ofproto/ofproto-dpif-governor.c index 817186ae5..458f8d71f 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 -- 2.43.0