Good catch. Thanks for pointing it out. I will send out patch to fix this.
On Tue, Apr 29, 2014 at 2:14 AM, Simon Horman <ho...@verge.net.au> wrote: > On Thu, Apr 24, 2014 at 10:34:15PM -0700, Andy Zhou wrote: >> Bond rebalancing was disabled for bonds not using recirculation. The >> patch fixes this bug. >> >> While fixing the bug, the bond_rebalance() was also restructured >> slightly to move bond related logic back into ofproto/bond.c >> >> Signed-off-by: Andy Zhou <az...@nicira.com> >> --- >> ofproto/bond.c | 21 +++++++++++++++------ >> ofproto/bond.h | 7 +++---- >> ofproto/ofproto-dpif.c | 12 +++--------- >> 3 files changed, 21 insertions(+), 19 deletions(-) >> >> diff --git a/ofproto/bond.c b/ofproto/bond.c >> index 2fa65a9..f5a9d47 100644 >> --- a/ofproto/bond.c >> +++ b/ofproto/bond.c >> @@ -861,7 +861,7 @@ bond_entry_account(struct bond_entry *entry, uint64_t >> rule_tx_bytes) >> } >> >> /* Maintain bond stats using post recirculation rule byte counters.*/ >> -void >> +static void >> bond_recirculation_account(struct bond *bond) >> { >> int i; >> @@ -1087,15 +1087,15 @@ reinsert_bal(struct list *bals, struct bond_slave >> *slave) >> * The caller should have called bond_account() for each active flow, or in >> case >> * of recirculation is used, have called bond_recirculation_account(bond), >> * to ensure that flow data is consistently accounted at this point. >> - * >> - * Return whether rebalancing took place.*/ >> -bool >> + */ >> +void >> bond_rebalance(struct bond *bond) >> { >> struct bond_slave *slave; >> struct bond_entry *e; >> struct list bals; >> bool rebalanced = false; >> + bool use_recirc; >> >> ovs_rwlock_wrlock(&rwlock); >> if (!bond_is_balanced(bond) || time_msec() < bond->next_rebalance) { > > Clang tells me that if the above if statement if false... > >> @@ -1103,6 +1103,13 @@ bond_rebalance(struct bond *bond) >> } >> bond->next_rebalance = time_msec() + bond->rebalance_interval; >> >> + use_recirc = ofproto_dpif_get_enable_recirc(bond->ofproto) && >> + bond_may_recirc(bond, NULL, NULL); >> + >> + if (use_recirc) { >> + bond_recirculation_account(bond); >> + } >> + >> /* Add each bond_entry to its slave's 'entries' list. >> * Compute each slave's tx_bytes as the sum of its entries' tx_bytes. */ >> HMAP_FOR_EACH (slave, hmap_node, &bond->slaves) { >> @@ -1158,7 +1165,7 @@ bond_rebalance(struct bond *bond) >> /* Re-sort 'bals'. */ >> reinsert_bal(&bals, from); >> reinsert_bal(&bals, to); >> - rebalanced = true; >> + rebalanced = true; >> } else { >> /* Can't usefully migrate anything away from 'from'. >> * Don't reconsider it. */ >> @@ -1174,8 +1181,10 @@ bond_rebalance(struct bond *bond) >> } >> >> done: >> + if (use_recirc && rebalanced) { > > ...then use_recirc is used unanitialised here. > > This is because the if statement in question simply calls > > goto done; > > And it is clear from the context above that use_recirc is indeed > uninitialised in that case. > > >> + bond_update_post_recirc_rules(bond,true); >> + } >> ovs_rwlock_unlock(&rwlock); >> - return rebalanced; >> } >> >> /* Bonding unixctl user interface functions. */ >> diff --git a/ofproto/bond.h b/ofproto/bond.h >> index e5ceb45..0d9a67a 100644 >> --- a/ofproto/bond.h >> +++ b/ofproto/bond.h >> @@ -96,7 +96,7 @@ void *bond_choose_output_slave(struct bond *, const struct >> flow *, >> /* Rebalancing. */ >> void bond_account(struct bond *, const struct flow *, uint16_t vlan, >> uint64_t n_bytes); >> -bool bond_rebalance(struct bond *); >> +void bond_rebalance(struct bond *); >> >> /* Recirculation >> * >> @@ -104,9 +104,9 @@ bool bond_rebalance(struct bond *); >> * >> * When recirculation is used, each bond port is assigned with a unique >> * recirc_id. The output action to the bond port will be replaced by >> - * a RECIRC action. >> + * a Hash action, followed by a RECIRC action. >> * >> - * ... actions= ... RECIRC(L4_HASH, recirc_id) .... >> + * ... actions= ... HASH(hash(L4)), RECIRC(recirc_id) .... >> * >> * On handling first output packet, 256 post recirculation flows are >> installed: >> * >> @@ -118,5 +118,4 @@ bool bond_rebalance(struct bond *); >> void bond_update_post_recirc_rules(struct bond *, const bool force); >> bool bond_may_recirc(const struct bond *, uint32_t *recirc_id, >> uint32_t *hash_bias); >> -void bond_recirculation_account(struct bond *); >> #endif /* bond.h */ >> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c >> index 30cbb24..bf8757c 100644 >> --- a/ofproto/ofproto-dpif.c >> +++ b/ofproto/ofproto-dpif.c >> @@ -1341,7 +1341,6 @@ run(struct ofproto *ofproto_) >> { >> struct ofproto_dpif *ofproto = ofproto_dpif_cast(ofproto_); >> uint64_t new_seq, new_dump_seq; >> - const bool enable_recirc = ofproto_dpif_get_enable_recirc(ofproto); >> >> if (mbridge_need_revalidate(ofproto->mbridge)) { >> ofproto->backer->need_revalidate = REV_RECONFIGURE; >> @@ -1419,17 +1418,12 @@ run(struct ofproto *ofproto_) >> >> /* All outstanding data in existing flows has been accounted, so >> it's a >> * good time to do bond rebalancing. */ >> - if (enable_recirc && ofproto->has_bonded_bundles) { >> + if (ofproto->has_bonded_bundles) { >> struct ofbundle *bundle; >> >> HMAP_FOR_EACH (bundle, hmap_node, &ofproto->bundles) { >> - struct bond *bond = bundle->bond; >> - >> - if (bond && bond_may_recirc(bond, NULL, NULL)) { >> - bond_recirculation_account(bond); >> - if (bond_rebalance(bundle->bond)) { >> - bond_update_post_recirc_rules(bond, true); >> - } >> + if (bundle->bond) { >> + bond_rebalance(bundle->bond); >> } >> } >> } >> -- >> 1.9.1 >> >> _______________________________________________ >> dev mailing list >> dev@openvswitch.org >> http://openvswitch.org/mailman/listinfo/dev >> _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev