On 28 September 2016 at 14:22, Daniele Di Proietto <diproiet...@ovn.org> wrote:
>
>
> 2016-09-20 18:47 GMT-07:00 Joe Stringer <j...@ovn.org>:
>>
>> To make more of the core revalidate() functions do just one thing and
>> not modify state on the way, refactor them to prepare the xcache then
>> defer the ukey modification and stats/side effects execution to the end
>> of successful revalidation.
>>
>> If revalidation causes deletion, then the xcache will be prepared and
>> attached to the ukey, but the actual execution will be skipped since it
>> will be executed on flow_delete very soon anyway with final stats.
>>
>> Signed-off-by: Joe Stringer <j...@ovn.org>
>> ---
>>  ofproto/ofproto-dpif-upcall.c | 56
>> ++++++++++++++++++++++++++++++++-----------
>>  1 file changed, 42 insertions(+), 14 deletions(-)
>>
>> diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c
>> index 1caff84cfd38..eaf7c3b4dadc 100644
>> --- a/ofproto/ofproto-dpif-upcall.c
>> +++ b/ofproto/ofproto-dpif-upcall.c
>> @@ -1877,16 +1877,41 @@ xlate_key(struct udpif *udpif, const struct nlattr
>> *key, unsigned int len,
>>
>>  static int
>>  xlate_ukey(struct udpif *udpif, const struct udpif_key *ukey,
>> -           const struct dpif_flow_stats *push, struct reval_context *ctx)
>> +           uint16_t tcp_flags, struct reval_context *ctx)
>>  {
>> -    return xlate_key(udpif, ukey->key, ukey->key_len, push, ctx);
>> +    struct dpif_flow_stats push = {
>> +        .tcp_flags = tcp_flags,
>> +    };
>>
>> +    return xlate_key(udpif, ukey->key, ukey->key_len, &push, ctx);
>> +}
>> +
>> +static int
>> +populate_xcache(struct udpif *udpif, struct udpif_key *ukey,
>> +                uint16_t tcp_flags)
>> +    OVS_REQUIRES(ukey->mutex)
>> +{
>> +    struct reval_context ctx = {
>> +        .odp_actions = NULL,
>> +        .netflow = NULL,
>> +        .wc = NULL,
>> +    };
>> +    int error;
>> +
>> +    ovs_assert(!ukey->xcache);
>> +    ukey->xcache = ctx.xcache = xlate_cache_new();
>> +    error = xlate_ukey(udpif, ukey, tcp_flags, &ctx);
>> +    if (error) {
>> +        return error;
>> +    }
>> +    xlate_out_uninit(&ctx.xout);
>> +
>> +    return 0;
>>  }
>>
>>  static enum reval_result
>>  revalidate_ukey__(struct udpif *udpif, struct udpif_key *ukey,
>> -                  const struct dpif_flow_stats *push,
>> -                  struct ofpbuf *odp_actions, uint64_t reval_seq,
>> -                  struct recirc_refs *recircs)
>> +                  uint16_t tcp_flags, struct ofpbuf *odp_actions,
>> +                  uint64_t reval_seq, struct recirc_refs *recircs)
>>      OVS_REQUIRES(ukey->mutex)
>>  {
>>      bool need_revalidate = (ukey->reval_seq != reval_seq);
>> @@ -1911,7 +1936,7 @@ revalidate_ukey__(struct udpif *udpif, struct
>> udpif_key *ukey,
>>          ukey->xcache = xlate_cache_new();
>>      }
>>      ctx.xcache = ukey->xcache;
>> -    if (xlate_ukey(udpif, ukey, push, &ctx)) {
>> +    if (xlate_ukey(udpif, ukey, tcp_flags, &ctx)) {
>>          goto exit;
>>      }
>>      xoutp = &ctx.xout;
>> @@ -2008,23 +2033,26 @@ revalidate_ukey(struct udpif *udpif, struct
>> udpif_key *ukey,
>>      }
>>
>>      /* We will push the stats, so update the ukey stats cache. */
>
>
> I guess we should remove the comment too?
>
>>
>> -    ukey->stats = *stats;
>>
>>      if (!push.n_packets && !need_revalidate) {
>>          result = UKEY_KEEP;
>>          goto exit;
>>      }
>
>
> I think the 4 lines above can be removed, because the condition is covered
> by the lines immediately below.

Good catches, yes I missed these. Thanks!
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to