[ovs-dev] [PATCH 1/6] ofproto: Hold ofproto_mutex when enabling or disabling eviction.

Jarno Rajahalme jrajahalme at nicira.com
Thu Jul 2 12:40:32 UTC 2015


Acked-by: Jarno Rajahalme <jrajahalme at nicira.com>

I would have expected clang to flag different annotations as a warning… Did you look if we have similar situations with other functions? Would it be possible to automate such a check somehow?

I’ll review the rest of the series as well,

  Jarno

> On Jul 1, 2015, at 2:06 PM, Ben Pfaff <blp at nicira.com> wrote:
> 
> Jarno, this patch is probably a good one for you to look at.  It's a
> possible important bug fix and I know that you're knowledgeable about
> the mutex in question.
> 
> (If you wanted to look at the rest of the series that would be nice too
> but this patch in particular may be important.)
> 
> On Wed, Jun 24, 2015 at 10:57:01AM -0700, Ben Pfaff wrote:
>> ofproto_enable_eviction() and ofproto_disable_eviction() require
>> ofproto_mutex (and they were even annotated that way, though not on their
>> prototypes but only at definition), but it wasn't being held.  This fixes
>> the problem.
>> 
>> Found by inspection.
>> 
>> Signed-off-by: Ben Pfaff <blp at nicira.com>
>> ---
>> ofproto/ofproto.c | 21 ++++++++++++---------
>> 1 file changed, 12 insertions(+), 9 deletions(-)
>> 
>> diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
>> index 08ba043..278c97f 100644
>> --- a/ofproto/ofproto.c
>> +++ b/ofproto/ofproto.c
>> @@ -83,10 +83,12 @@ static void oftable_set_name(struct oftable *, const char *name);
>> 
>> static enum ofperr evict_rules_from_table(struct oftable *)
>>     OVS_REQUIRES(ofproto_mutex);
>> -static void oftable_disable_eviction(struct oftable *);
>> +static void oftable_disable_eviction(struct oftable *)
>> +    OVS_REQUIRES(ofproto_mutex);
>> static void oftable_enable_eviction(struct oftable *,
>>                                     const struct mf_subfield *fields,
>> -                                    size_t n_fields);
>> +                                    size_t n_fields)
>> +    OVS_REQUIRES(ofproto_mutex);
>> 
>> /* A set of rules within a single OpenFlow table (oftable) that have the same
>>  * values for the oftable's eviction_fields.  A rule to be evicted, when one is
>> @@ -1419,13 +1421,6 @@ ofproto_configure_table(struct ofproto *ofproto, int table_id,
>>         return;
>>     }
>> 
>> -    if (s->groups) {
>> -        oftable_enable_eviction(table, s->groups, s->n_groups);
>> -    } else {
>> -        oftable_disable_eviction(table);
>> -    }
>> -
>> -    table->max_flows = s->max_flows;
>> 
>>     if (classifier_set_prefix_fields(&table->cls,
>>                                      s->prefix_fields, s->n_prefix_fields)) {
>> @@ -1433,6 +1428,12 @@ ofproto_configure_table(struct ofproto *ofproto, int table_id,
>>     }
>> 
>>     ovs_mutex_lock(&ofproto_mutex);
>> +    if (s->groups) {
>> +        oftable_enable_eviction(table, s->groups, s->n_groups);
>> +    } else {
>> +        oftable_disable_eviction(table);
>> +    }
>> +    table->max_flows = s->max_flows;
>>     evict_rules_from_table(table);
>>     ovs_mutex_unlock(&ofproto_mutex);
>> }
>> @@ -7431,7 +7432,9 @@ static void
>> oftable_destroy(struct oftable *table)
>> {
>>     ovs_assert(classifier_is_empty(&table->cls));
>> +    ovs_mutex_lock(&ofproto_mutex);
>>     oftable_disable_eviction(table);
>> +    ovs_mutex_unlock(&ofproto_mutex);
>>     classifier_destroy(&table->cls);
>>     free(table->name);
>> }
>> -- 
>> 2.1.3
>> 




More information about the dev mailing list