>
> warning: 1 line adds whitespace errors.
>
Fixed
>
> On Wed, Jun 11, 2014 at 2:24 PM, Andy Zhou <[email protected]> wrote:
>> When deleting a mask from the mask array, we always move the last entry
>> into its current location. Another approach can be NULL in its current
>> place, and periodically compact it.
>>
>> The approach taken by this patch is more efficient during run time.
>> During look up, fast path packet don't have to skip over NULL pointers.
>>
>> A more important advantage of this approach is that it tries to
>> keep the mask array index stable by avoiding periodic index reshuffle.
>>
>> This patch implements an optimization to further promote index
>> stability. By leaving the last entry value intact when moving it to
>> a new location, the old cache index can 'fix' themselves, by noticing
>> the index in the cache is outside the valid mask array region. The new
>> index can be found by scanning the mask pointer within the valid region.
>>
>> Signed-off-by: Andy Zhou <[email protected]>
>>
> I have couple of comments mostly related to optimizations.
> we can go from 0 to old->count, is there any reason for looping till old->max?
So we can preserve the mask array so we can prolong the life to cached index.
>
>> rcu_assign_pointer(tbl->mask_array, new);
>>
>> @@ -260,6 +260,59 @@ static int tbl_mask_array_realloc(struct flow_table
>> *tbl, int size)
>> return 0;
> If you merge tbl_mask_array_find_idx() and fixup_cache_entry_index()
> you can save above check.
> tbl_mask_array_find_idx() is not used anywhere, so this should not be a
> problem.
Good idea. I rewrote fixup_cache_entry_index() and it is actually simpler.
>
>> /*
>> * mask_cache maps flow to probable mask. This cache is not tightly
>> * coupled cache, It means updates to mask list can result in inconsistent
>> @@ -578,13 +643,21 @@ struct sw_flow *ovs_flow_tbl_lookup_stats(struct
>> flow_table *tbl,
>>
>> e = &entries[index];
>> if (e->skb_hash == skb_hash) {
>> - cache =
>> rcu_dereference_ovsl(ma->masks[e->mask_index]);
>> + int i = e->mask_index;
>> +
>> + if (i < ma->max)
>> + cache = rcu_dereference_ovsl(ma->masks[i]);
>> +
>> if (cache) {
>> + if (unlikely(i >= ma->count))
>> + fixup_cache_entry_index(e, ma,
>> cache);
>> +
>> flow = masked_flow_lookup(ti, key, cache,
>> n_mask_hit);
>> if (flow) /* Cache hit. */
>> return flow;
>> - }
>> + } else
>> + e->skb_hash = 0; /* Not a valid cache entry.
>> */
>>
> Better sequence would be to check in following order. So that most
> cases we have one condition check
> if (i < count) {
> guaranteed to have valid cache pointer for lookup
> } else {
> handle exceptions.
> }
>
Good idea. I re-organized the logic according to your suggestion. I
will send out the updated patch soon.
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev