I removed the comments from the .h file before pushing.

  Jarno

On Apr 23, 2014, at 4:53 PM, Ethan Jackson <et...@nicira.com> wrote:

> Traditionally we've put function comments just in the .c file, not in
> the .c and .h file as you've done for rule_dpif_lookup().  That said,
> I don't know where that convention came from and don't care that much
> . . .
> 
> Acked-by: Ethan Jackson <et...@nicira.com>
> 
> 
> On Wed, Apr 23, 2014 at 4:20 PM, Jarno Rajahalme <jrajaha...@nicira.com> 
> wrote:
>> Prior to this paths the rule lookup functions have always taken a
>> reference on the found rule before returning.  Make this conditional,
>> so that unnecessary refs/unrefs can be avoided in a later patch.
>> 
>> Signed-off-by: Jarno Rajahalme <jrajaha...@nicira.com>
>> ---
>> ofproto/ofproto-dpif-xlate.c |    8 +++---
>> ofproto/ofproto-dpif.c       |   58 
>> +++++++++++++++++++++++++++++-------------
>> ofproto/ofproto-dpif.h       |   20 ++++++++++++---
>> 3 files changed, 62 insertions(+), 24 deletions(-)
>> 
>> diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
>> index 248382f..c62424a 100644
>> --- a/ofproto/ofproto-dpif-xlate.c
>> +++ b/ofproto/ofproto-dpif-xlate.c
>> @@ -2057,7 +2057,7 @@ xlate_table_action(struct xlate_ctx *ctx, ofp_port_t 
>> in_port, uint8_t table_id,
>>                                               !skip_wildcards
>>                                               ? &ctx->xout->wc : NULL,
>>                                               honor_table_miss,
>> -                                              &ctx->table_id, &rule);
>> +                                              &ctx->table_id, &rule, true);
>>         ctx->xin->flow.in_port.ofp_port = old_in_port;
>> 
>>         if (ctx->xin->resubmit_hook) {
>> @@ -2090,7 +2090,7 @@ xlate_table_action(struct xlate_ctx *ctx, ofp_port_t 
>> in_port, uint8_t table_id,
>>         }
>> 
>>         choose_miss_rule(config, ctx->xbridge->miss_rule,
>> -                         ctx->xbridge->no_packet_in_rule, &rule);
>> +                         ctx->xbridge->no_packet_in_rule, &rule, true);
>> 
>> match:
>>         if (rule) {
>> @@ -2654,7 +2654,7 @@ xlate_learn_action(struct xlate_ctx *ctx,
>>         entry = xlate_cache_add_entry(ctx->xin->xcache, XC_LEARN);
>>         entry->u.learn.ofproto = ctx->xin->ofproto;
>>         rule_dpif_lookup(ctx->xbridge->ofproto, &ctx->xin->flow, NULL,
>> -                         &entry->u.learn.rule);
>> +                         &entry->u.learn.rule, true);
>>     }
>> }
>> 
>> @@ -3263,7 +3263,7 @@ xlate_actions__(struct xlate_in *xin, struct xlate_out 
>> *xout)
>>     if (!xin->ofpacts && !ctx.rule) {
>>         ctx.table_id = rule_dpif_lookup(ctx.xbridge->ofproto, flow,
>>                                         !xin->skip_wildcards ? wc : NULL,
>> -                                        &rule);
>> +                                        &rule, true);
>>         if (ctx.xin->resubmit_stats) {
>>             rule_dpif_credit_stats(rule, ctx.xin->resubmit_stats);
>>         }
>> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
>> index 983cad5..5669cd1 100644
>> --- a/ofproto/ofproto-dpif.c
>> +++ b/ofproto/ofproto-dpif.c
>> @@ -3189,10 +3189,16 @@ rule_dpif_get_actions(const struct rule_dpif *rule)
>>  *
>>  * The return value will be zero unless there was a miss and
>>  * OFPTC11_TABLE_MISS_CONTINUE is in effect for the sequence of tables
>> - * where misses occur. */
>> + * where misses occur.
>> + *
>> + * The rule is returned in '*rule', which is valid at least until the next
>> + * RCU quiescent period.  If the '*rule' needs to stay around longer,
>> + * a non-zero 'take_ref' must be passed in to cause a reference to be taken
>> + * on it before this returns. */
>> uint8_t
>> rule_dpif_lookup(struct ofproto_dpif *ofproto, struct flow *flow,
>> -                 struct flow_wildcards *wc, struct rule_dpif **rule)
>> +                 struct flow_wildcards *wc, struct rule_dpif **rule,
>> +                 bool take_ref)
>> {
>>     enum rule_dpif_lookup_verdict verdict;
>>     enum ofputil_port_config config = 0;
>> @@ -3219,7 +3225,7 @@ rule_dpif_lookup(struct ofproto_dpif *ofproto, struct 
>> flow *flow,
>>     }
>> 
>>     verdict = rule_dpif_lookup_from_table(ofproto, flow, wc, true,
>> -                                          &table_id, rule);
>> +                                          &table_id, rule, take_ref);
>> 
>>     switch (verdict) {
>>     case RULE_DPIF_LOOKUP_VERDICT_MATCH:
>> @@ -3248,13 +3254,17 @@ rule_dpif_lookup(struct ofproto_dpif *ofproto, 
>> struct flow *flow,
>>     }
>> 
>>     choose_miss_rule(config, ofproto->miss_rule,
>> -                     ofproto->no_packet_in_rule, rule);
>> +                     ofproto->no_packet_in_rule, rule, take_ref);
>>     return table_id;
>> }
>> 
>> +/* The returned rule is valid at least until the next RCU quiescent period.
>> + * If the '*rule' needs to stay around longer, a non-zero 'take_ref' must be
>> + * passed in to cause a reference to be taken on it before this returns. */
>> static struct rule_dpif *
>> rule_dpif_lookup_in_table(struct ofproto_dpif *ofproto, uint8_t table_id,
>> -                          const struct flow *flow, struct flow_wildcards 
>> *wc)
>> +                          const struct flow *flow, struct flow_wildcards 
>> *wc,
>> +                          bool take_ref)
>> {
>>     struct classifier *cls = &ofproto->up.tables[table_id].cls;
>>     const struct cls_rule *cls_rule;
>> @@ -3288,7 +3298,9 @@ rule_dpif_lookup_in_table(struct ofproto_dpif 
>> *ofproto, uint8_t table_id,
>>     }
>> 
>>     rule = rule_dpif_cast(rule_from_cls_rule(cls_rule));
>> -    rule_dpif_ref(rule);
>> +    if (take_ref) {
>> +        rule_dpif_ref(rule);
>> +    }
>>     fat_rwlock_unlock(&cls->rwlock);
>> 
>>     return rule;
>> @@ -3323,13 +3335,19 @@ rule_dpif_lookup_in_table(struct ofproto_dpif 
>> *ofproto, uint8_t table_id,
>>  *
>>  *    - RULE_DPIF_LOOKUP_VERDICT_DEFAULT if no rule was found,
>>  *      'honor_table_miss' is true and a table miss configuration has
>> - *      not been specified in this case. */
>> + *      not been specified in this case.
>> + *
>> + * The rule is returned in '*rule', which is valid at least until the next
>> + * RCU quiescent period.  If the '*rule' needs to stay around longer,
>> + * a non-zero 'take_ref' must be passed in to cause a reference to be taken
>> + * on it before this returns. */
>> enum rule_dpif_lookup_verdict
>> rule_dpif_lookup_from_table(struct ofproto_dpif *ofproto,
>>                             const struct flow *flow,
>>                             struct flow_wildcards *wc,
>>                             bool honor_table_miss,
>> -                            uint8_t *table_id, struct rule_dpif **rule)
>> +                            uint8_t *table_id, struct rule_dpif **rule,
>> +                            bool take_ref)
>> {
>>     uint8_t next_id;
>> 
>> @@ -3338,7 +3356,8 @@ rule_dpif_lookup_from_table(struct ofproto_dpif 
>> *ofproto,
>>          next_id++, next_id += (next_id == TBL_INTERNAL))
>>     {
>>         *table_id = next_id;
>> -        *rule = rule_dpif_lookup_in_table(ofproto, *table_id, flow, wc);
>> +        *rule = rule_dpif_lookup_in_table(ofproto, *table_id, flow, wc,
>> +                                          take_ref);
>>         if (*rule) {
>>             return RULE_DPIF_LOOKUP_VERDICT_MATCH;
>>         } else if (!honor_table_miss) {
>> @@ -3365,13 +3384,21 @@ rule_dpif_lookup_from_table(struct ofproto_dpif 
>> *ofproto,
>> 
>> /* Given a port configuration (specified as zero if there's no port), chooses
>>  * which of 'miss_rule' and 'no_packet_in_rule' should be used in case of a
>> - * flow table miss. */
>> + * flow table miss.
>> + *
>> + * The rule is returned in '*rule', which is valid at least until the next
>> + * RCU quiescent period.  If the '*rule' needs to stay around longer,
>> + * a reference must be taken on it (rule_dpif_ref()).
>> + */
>> void
>> choose_miss_rule(enum ofputil_port_config config, struct rule_dpif 
>> *miss_rule,
>> -                 struct rule_dpif *no_packet_in_rule, struct rule_dpif 
>> **rule)
>> +                 struct rule_dpif *no_packet_in_rule, struct rule_dpif 
>> **rule,
>> +                 bool take_ref)
>> {
>>     *rule = config & OFPUTIL_PC_NO_PACKET_IN ? no_packet_in_rule : miss_rule;
>> -    rule_dpif_ref(*rule);
>> +    if (take_ref) {
>> +        rule_dpif_ref(*rule);
>> +    }
>> }
>> 
>> void
>> @@ -4197,7 +4224,7 @@ ofproto_trace(struct ofproto_dpif *ofproto, struct 
>> flow *flow,
>>     if (ofpacts) {
>>         rule = NULL;
>>     } else {
>> -        rule_dpif_lookup(ofproto, flow, &trace.wc, &rule);
>> +        rule_dpif_lookup(ofproto, flow, &trace.wc, &rule, false);
>> 
>>         trace_format_rule(ds, 0, rule);
>>         if (rule == ofproto->miss_rule) {
>> @@ -4253,8 +4280,6 @@ ofproto_trace(struct ofproto_dpif *ofproto, struct 
>> flow *flow,
>> 
>>         xlate_out_uninit(&trace.xout);
>>     }
>> -
>> -    rule_dpif_unref(rule);
>> }
>> 
>> /* Store the current ofprotos in 'ofproto_shash'.  Returns a sorted list
>> @@ -4819,9 +4844,8 @@ ofproto_dpif_add_internal_flow(struct ofproto_dpif 
>> *ofproto,
>>     }
>> 
>>     rule = rule_dpif_lookup_in_table(ofproto, TBL_INTERNAL, &match->flow,
>> -                                     &match->wc);
>> +                                     &match->wc, false);
>>     if (rule) {
>> -        rule_dpif_unref(rule);
>>         *rulep = &rule->up;
>>     } else {
>>         OVS_NOT_REACHED();
>> diff --git a/ofproto/ofproto-dpif.h b/ofproto/ofproto-dpif.h
>> index eb4787c..88b6684 100644
>> --- a/ofproto/ofproto-dpif.h
>> +++ b/ofproto/ofproto-dpif.h
>> @@ -86,15 +86,25 @@ extern struct ovs_rwlock xlate_rwlock;
>> size_t ofproto_dpif_get_max_mpls_depth(const struct ofproto_dpif *);
>> bool ofproto_dpif_get_enable_recirc(const struct ofproto_dpif *);
>> 
>> +/* The rule is returned in '*rule', which is valid at least until the next
>> + * RCU quiescent period.  If the '*rule' needs to stay around longer,
>> + * a non-zero 'take_ref' must be passed in to cause a reference to be taken
>> + * on it before this returns. */
>> uint8_t rule_dpif_lookup(struct ofproto_dpif *, struct flow *,
>> -                      struct flow_wildcards *, struct rule_dpif **rule);
>> +                         struct flow_wildcards *, struct rule_dpif **rule,
>> +                         bool take_ref);
>> 
>> +/* The rule is returned in '*rule', which is valid at least until the next
>> + * RCU quiescent period.  If the '*rule' needs to stay around longer,
>> + * a non-zero 'take_ref' must be passed in to cause a reference to be taken
>> + * on it before this returns. */
>> enum rule_dpif_lookup_verdict rule_dpif_lookup_from_table(struct 
>> ofproto_dpif *,
>>                                                           const struct flow 
>> *,
>>                                                           struct 
>> flow_wildcards *,
>>                                                           bool 
>> force_controller_on_miss,
>>                                                           uint8_t *table_id,
>> -                                                          struct rule_dpif 
>> **rule);
>> +                                                          struct rule_dpif 
>> **rule,
>> +                                                          bool take_ref);
>> 
>> void rule_dpif_ref(struct rule_dpif *);
>> void rule_dpif_unref(struct rule_dpif *);
>> @@ -114,10 +124,14 @@ ovs_be64 rule_dpif_get_flow_cookie(const struct 
>> rule_dpif *rule);
>> void rule_dpif_reduce_timeouts(struct rule_dpif *rule, uint16_t idle_timeout,
>>                                uint16_t hard_timeout);
>> 
>> +/* The rule is returned in '*rule', which is valid at least until the next
>> + * RCU quiescent period.  If the '*rule' needs to stay around longer,
>> + * a non-zero 'take_ref' must be passed in to cause a reference to be taken
>> + * on it before this returns. */
>> void choose_miss_rule(enum ofputil_port_config,
>>                       struct rule_dpif *miss_rule,
>>                       struct rule_dpif *no_packet_in_rule,
>> -                      struct rule_dpif **rule);
>> +                      struct rule_dpif **rule, bool take_ref);
>> 
>> bool group_dpif_lookup(struct ofproto_dpif *ofproto, uint32_t group_id,
>>                        struct group_dpif **group);
>> --
>> 1.7.10.4
>> 
>> _______________________________________________
>> dev mailing list
>> dev@openvswitch.org
>> http://openvswitch.org/mailman/listinfo/dev

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to