[ovs-dev] [PATCH 3/3] ofproto: Rename struct rule's evict lock and use it more widely.

Jarno Rajahalme jrajahalme at nicira.com
Wed Sep 4 21:46:40 UTC 2013


On Sep 4, 2013, at 12:37 PM, Ethan Jackson <ethan at nicira.com> wrote:
…
> @@ -240,15 +242,18 @@ struct rule {
>     struct heap_node evg_node;   /* In eviction_group's "rules" heap. */
>     struct eviction_group *eviction_group; /* NULL if not in any group. */
> 
> -    /* The evict lock is used to prevent rules from being evicted while child
> -     * threads are using them to xlate flows.  A read lock means the rule is
> -     * currently being used.  A write lock means the rule is in the process of
> -     * being evicted and should be considered gone.  A rule will not be evicted
> -     * unless both its own and its classifiers write locks are held.
> -     * Therefore, while holding a classifier readlock, one can be assured that
> -     * even write locked rules are safe. */
> -    struct ovs_rwlock evict;
> +    /* The rwlock is used to protect those elements in struct rule which are
> +     * accessed by multiple threads.  While maintaing a pointer to struct rule,
> +     * threads are requires to hold a readlock.  The main ofproto code is
> +     * guarnated not to evict the rule, or change any of the elements "Guarded

/s/guarnated/guaranteed/

> +     * by rwlock" without holding the writelock.
> +     *
> +     * A rule will not be evicted unless both its own and its classifier's
> +     * write locks are held.  Therefore, while holding a classifier readlock,
> +     * one can be assured that ewrite locked rules are safe to reference. */

/s/ewrite/write/

> +    struct ovs_rwlock rwlock;
> 
> +    /* Guarded by rwlock. */
>     struct ofpact *ofpacts;      /* Sequence of "struct ofpacts". */
>     unsigned int ofpacts_len;    /* Size of 'ofpacts', in bytes. */
> 
...
> @@ -2847,7 +2847,9 @@ ofproto_rule_change_cookie(struct ofproto *ofproto, struct rule *rule,
>     if (new_cookie != rule->flow_cookie) {
>         cookies_remove(ofproto, rule);
> 
> +        ovs_rwlock_wrlock(&rule->rwlock);
>         rule->flow_cookie = new_cookie;
> +        ovs_rwlock_unlock(&rule->rwlock);
> 

Is this necessary on 64-bit systems?

>         cookies_insert(ofproto, rule);
>     }
> 

  Jarno




More information about the dev mailing list