[ovs-dev] [PATCH 4/8] lib/pvector: Non-intrusive RCU priority vector.

Ben Pfaff blp at nicira.com
Fri Jun 13 17:06:33 UTC 2014


On Mon, Jun 09, 2014 at 11:53:51AM -0700, Jarno Rajahalme wrote:
> Factor out the priority vector code from the classifier.
> 
> Making the classifier use RCU instead of locking requires parallel
> access to the priority vector, pointing to subtables in descending
> priority order.  When a new subtable is added, a new copy of the
> priority vector is allocated, while the current readers can keep on
> using the old copy they started with.  Adding and removing subtables
> is usually less frequent than adding and removing rules, so this
> should not have a visible performance implication.  As on optimization

As "an" optimization

> for the userspace datapath use, where all the subtables have the same
> priority, new subtables can be added to the end of the vector without
> reallocation and without disturbing readers.
> 
> cls_subtables_reset() is now removed, as it served it's purpose in bug

"its" purpose

> hunting.  Checks on the new pvector are now incorporated into
> tests/test-classifier.c.
> 
> Signed-off-by: Jarno Rajahalme <jrajahalme at nicira.com>

I would start the top-level comment in pvector.h with a sentence or
short paragraph that briefly describes what a concurrent priority
vector is.  As is, it jumps in with what readers and writers can do,
without saying what the overall data structure is for.

I think that the size calculation in pvector_impl_dup() is wrong,
because it does not include sizeof(struct pvector_impl).

It looks like PVECTOR_EXTRA_ALLOC only affects the allocation when a
pvector_element is removed, but it seems to me that it could be
equally useful to have extra space in other cases.

"Poisoning" in pvector_destroy() seems like a good idea that we could
apply elsewhere.

pvector.c defines PVECTOR_IMPL_FOR_EACH_REVERSE but does not use it.

I spent some time studying the code that rearranges the priority
vectors upon insertion, deletion, and priority change.  I did not see
any bugs.

classifier_lookup() could be a little more straightforward if it did
not open-code the cursor iteration.  Did you consider adding a pvector
iteration macro that embeds lookahead?  Then it could easily be used
in find_match_miniflow() also (is there reason to believe that this
function wouldn't benefit from lookahead too?).

Thanks,

Ben.



More information about the dev mailing list