Thanks for the reviews,

I¹m about to send a v2

On 9/19/14, 3:49 PM, "Pravin Shelar" <pshe...@nicira.com> wrote:

>On Fri, Sep 19, 2014 at 1:28 PM, Daniele Di Proietto
><ddiproie...@vmware.com> wrote:
>> If a packet didn't match a rule in the fast path classifier its memory
>>was
>> never freed. The issue was particularly clear with DPDK devices because
>>it was
>> not possible to process more than ~250000 DPDK mbufs in the slow path.
>>
>> This commit fixes the problem by:
>> * calling dpif_packet_delete() if the upcalls are disabled
>> * passing may_steal==true to dp_netdev_execute_actions() during normal
>>upcall
>>   processing
>>
>> Signed-off-by: Daniele Di Proietto <ddiproie...@vmware.com>
>> ---
>>  lib/dpif-netdev.c | 47 ++++++++++++++++++++++++++++++++---------------
>>  1 file changed, 32 insertions(+), 15 deletions(-)
>>
>> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
>> index 7e27acf..8df3b81 100644
>> --- a/lib/dpif-netdev.c
>> +++ b/lib/dpif-netdev.c
>> @@ -2576,7 +2576,7 @@ fast_path_processing(struct dp_netdev_pmd_thread
>>*pmd,
>>              /* We can't allow the packet batching in the next loop to
>>execute
>>               * the actions.  Otherwise, if there are any slow path
>>actions,
>>               * we'll send the packet up twice. */
>> -            dp_netdev_execute_actions(pmd, &packets[i], 1, false, md,
>> +            dp_netdev_execute_actions(pmd, &packets[i], 1, true, md,
>>                                        ofpbuf_data(&actions),
>>                                        ofpbuf_size(&actions));
>>
>> @@ -2602,6 +2602,17 @@ fast_path_processing(struct dp_netdev_pmd_thread
>>*pmd,
>>          ofpbuf_uninit(&actions);
>>          ofpbuf_uninit(&put_actions);
>>          fat_rwlock_unlock(&dp->upcall_rwlock);
>> +    } else if (OVS_UNLIKELY(any_miss)) {
>> +        int dropped_cnt = 0;
>> +
>> +        for (i = 0; i < cnt; i++) {
>> +            if (OVS_UNLIKELY(!rules[i] && mfs[i])) {
>> +                dpif_packet_delete(packets[i]);
>> +                dropped_cnt++;
>> +            }
>> +        }
>> +
>> +        dp_netdev_count_packet(dp, DP_STAT_LOST, dropped_cnt);
>>      }
>>
>>      n_batches = 0;
>> @@ -2658,6 +2669,18 @@ dpif_netdev_register_upcall_cb(struct dpif
>>*dpif, upcall_callback *cb,
>>  }
>>
>>  static void
>> +dp_netdev_drop_packets(struct dpif_packet ** packets, int cnt, bool
>>may_steal)
>> +{
>> +    int i;
>> +
>> +    if (may_steal) {
>> +        for (i = 0; i < cnt; i++) {
>> +            dpif_packet_delete(packets[i]);
>> +        }
>> +    }
>> +}
>> +
>> +static void
>>  dp_execute_cb(void *aux_, struct dpif_packet **packets, int cnt,
>>                struct pkt_metadata *md,
>>                const struct nlattr *a, bool may_steal)
>> @@ -2676,10 +2699,8 @@ dp_execute_cb(void *aux_, struct dpif_packet
>>**packets, int cnt,
>>          p = dp_netdev_lookup_port(dp, u32_to_odp(nl_attr_get_u32(a)));
>>          if (OVS_LIKELY(p)) {
>>              netdev_send(p->netdev, pmd->core_id, packets, cnt,
>>may_steal);
>> -        } else if (may_steal) {
>> -            for (i = 0; i < cnt; i++) {
>> -                dpif_packet_delete(packets[i]);
>> -            }
>> +        } else {
>> +            dp_netdev_drop_packets(packets, cnt, may_steal);
>>          }
>>          break;
>>
>> @@ -2702,17 +2723,17 @@ dp_execute_cb(void *aux_, struct dpif_packet
>>**packets, int cnt,
>>                                           DPIF_UC_ACTION, userdata,
>>&actions,
>>                                           NULL);
>>                  if (!error || error == ENOSPC) {
>> -                    dp_netdev_execute_actions(pmd, &packets[i], 1,
>>false, md,
>> -                                              ofpbuf_data(&actions),
>> +                    dp_netdev_execute_actions(pmd, &packets[i], 1,
>>may_steal,
>> +                                              md,
>>ofpbuf_data(&actions),
>>                                                ofpbuf_size(&actions));
>> -                }
>> -
>> -                if (may_steal) {
>> +                } else if (may_steal) {
>>                      dpif_packet_delete(packets[i]);
>>                  }
>>              }
>>              ofpbuf_uninit(&actions);
>>              fat_rwlock_unlock(&dp->upcall_rwlock);
>> +        } else {
>> +            dp_netdev_drop_packets(packets, cnt, may_steal);
>>          }
>>
>>          break;
>> @@ -2772,11 +2793,7 @@ dp_execute_cb(void *aux_, struct dpif_packet
>>**packets, int cnt,
>>              break;
>>          } else {
>>              VLOG_WARN("Packet dropped. Max recirculation depth
>>exceeded.");
>> -            if (may_steal) {
>> -                for (i = 0; i < cnt; i++) {
>> -                    dpif_packet_delete(packets[i]);
>> -                }
>> -            }
>> +            dp_netdev_drop_packets(packets, cnt, may_steal);
>>          }
>>          break;
>>
>You can move calls dp_netdev_drop_packets() at the bottom of
>dp_execute_cb()
>All successful switch-case can return immediately and error cases can
>drop packets if required.
>
>otherwise looks good.
>
>> --
>> 2.1.0.rc1
>>
>> _______________________________________________
>> dev mailing list
>> dev@openvswitch.org
>> 
>>https://urldefense.proofpoint.com/v1/url?u=http://openvswitch.org/mailman
>>/listinfo/dev&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=MV9BdLjtFIdhBDBaw5z%2
>>BU6SSA2gAfY4L%2F1HCy3VjlKU%3D%0A&m=RJWTUn8k5wT8pIg3bYcX0DQWkHIld%2BNwsgol
>>7TuQSHE%3D%0A&s=d8f26757a3a68813f4809cc2aece9235e2ad0455a421bacd321b2538f
>>03483a2

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

Reply via email to