I upgraded my clang from 3.4 to 3.5. Now I can also reproduce the warning message.
On Tue, Apr 29, 2014 at 2:32 AM, Simon Horman <ho...@verge.net.au> wrote: > Thanks. > > On Tue, Apr 29, 2014 at 02:30:26AM -0700, Andy Zhou wrote: >> 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