The bonding code neglected to call netdev_monitor_poll() on its monitor during bond_run(). Thus carrier changes would be permanently queued in the monitor, preventing it from ever allowing poll_loop to sleep. --- lib/bond.c | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-)
diff --git a/lib/bond.c b/lib/bond.c index 2b54052..12cb3be 100644 --- a/lib/bond.c +++ b/lib/bond.c @@ -18,6 +18,7 @@ #include "bond.h" +#include <errno.h> #include <limits.h> #include <stdint.h> #include <stdlib.h> @@ -466,6 +467,16 @@ bond_run(struct bond *bond, struct tag_set *tags, bool lacp_negotiated) bond->miimon_next_update = time_msec() + bond->miimon_interval; } + if (bond->monitor) { + char *name; + + /* If bond->monitor is not cleared, netdev_monitor_poll_wait() will + * never sleep. */ + while (netdev_monitor_poll(bond->monitor, &name) != EAGAIN) { + free(name); + } + } + /* Enable slaves based on link status and LACP feedback. */ HMAP_FOR_EACH (slave, hmap_node, &bond->slaves) { bond_link_status_update(slave, tags); -- 1.7.4.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev