Thanks for the review, pushed to master.

  Jarno

> On Jul 15, 2015, at 3:05 PM, Ben Pfaff <b...@nicira.com> wrote:
> 
> On Wed, Jul 15, 2015 at 01:11:54PM -0700, Jarno Rajahalme wrote:
>> 
>>> On Jul 14, 2015, at 4:50 PM, Ben Pfaff <b...@nicira.com> wrote:
>>> 
>>> On Fri, Jul 10, 2015 at 10:35:21AM -0700, Jarno Rajahalme wrote:
>>>> Now that performance critical code already inlines miniflows and
>>>> minimasks, we can simplify struct miniflow by always dynamically
>>>> allocating miniflows and minimasks to the correct size.  This changes
>>>> the struct minimatch to always contain pointers to its miniflow and
>>>> minimask.
>>>> 
>>>> Signed-off-by: Jarno Rajahalme <jrajaha...@nicira.com>
>>> 
>>> I like simplifying things so that two possibilities become one.  It's
>>> nice.
>>> 
>>> I see two possible ways to simplify this, each with its own tradeoffs:
>>> 
>>>      1. The way that you did it, which means that one must always
>>>         either dynamically allocate struct miniflow to a proper size
>>>         or ensure that there's enough space for the maximum size flow
>>>         immediately following struct miniflow.  
>>> 
>>>      2. Change struct miniflow to:
>>> 
>>>           struct miniflow {
>>>               uint64_t map;
>>>               uint64_t *values;
>>>           };
>>> 
>>>         With this strategy, there's no need to dynamically allocate
>>>         struct miniflow itself, so it can be directly embedded in
>>>         larger structures instead of via pointer.  The usual time cost
>>>         of accessing miniflow data is again one pointer dereference
>>>         (of 'values').
>>> 
>>>         This can be kind of nice because you're not fighting with the
>>>         compiler to put data in the right place.
>>> 
>>> Either way, the usual time cost of accessing miniflow data is one
>>> pointer dereference (in case #1, from whatever contains the miniflow; in
>>> case #2, dereference of 'values'), and the usual space cost of embedding
>>> a miniflow is one pointer (although in case #1 the pointer is in what
>>> contains the miniflow and in case #2 the pointer is in the miniflow
>>> itself).
>>> 
>>> Anyway, I wanted to make sure that you considered both of these
>>> solutions and decided that #1 was better.  If so:
>>> 
>> 
>> I agree that case #2 is syntactically nicer in the generic case, where
>> one pointer dereference is always needed. However, we already embed
>> miniflows to other data structures (flow keys and masks in classifier
>> and userspace datapath), where avoid the dereference and hence make
>> accessing the miniflow faster. With case #2 we’d need to define
>> another “struct inline_miniflow” (basically the case #1) to avoid the
>> dereference. IMO it is better to use the case #1 everywhere than
>> defining two different miniflow structures.
> 
> OK, I'm glad that you considered the possibility then.

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

Reply via email to