datapath: Don't rcu_dereference() objects in table.
authorJesse Gross <jesse@nicira.com>
Mon, 6 Dec 2010 19:26:16 +0000 (11:26 -0800)
committerJesse Gross <jesse@nicira.com>
Fri, 10 Dec 2010 01:43:37 +0000 (17:43 -0800)
Each time that we modify the flow/port table, we reallocate the
array of pointers to objects in a particular bucket.  We then use
RCU to update the link to that bucket.  This means that we don't
need to use RCU to access the individual object pointers, since
they are constant for a given instance of the bucket data structure.
This doesn't cause a problem per se (though it does restrict the
optimizations that the compiler can perform and adds a memory barrier
on Alpha).  However, it is confusing and inconsistent since the
pointers are not protected by RCU and we don't use rcu_assign_pointer().

Found by sparse.

Signed-off-by: Jesse Gross <jesse@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
datapath/table.c

index 86236e924c3c256678529d79295e61cbec687899..cfe7b2b95976fb65de054b5ce9d1f1759935db8b 100644 (file)
@@ -174,7 +174,7 @@ static int search_bucket(const struct tbl_bucket *bucket, void *target, u32 hash
        int i;
 
        for (i = 0; i < bucket->n_objs; i++) {
-               struct tbl_node *obj = rcu_dereference(bucket->objs[i]);
+               struct tbl_node *obj = bucket->objs[i];
                if (obj->hash == hash && likely(cmp(obj, target)))
                        return i;
        }