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