This also fixes a memory leak if an upcall fails
Signed-off-by: Daniele Di Proietto <[email protected]>
---
lib/dpif-netdev.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index a1db620..11aacc3 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -2430,10 +2430,6 @@ dp_netdev_upcall(struct dp_netdev *dp, struct
dpif_packet *packet_,
{
struct ofpbuf *packet = &packet_->ofpbuf;
- if (type == DPIF_UC_MISS) {
- dp_netdev_count_packet(dp, DP_STAT_MISS, 1);
- }
-
if (OVS_UNLIKELY(!dp->upcall_cb)) {
return ENODEV;
}
@@ -2651,6 +2647,7 @@ fast_path_processing(struct dp_netdev_pmd_thread *pmd,
if (OVS_UNLIKELY(any_miss) && !fat_rwlock_tryrdlock(&dp->upcall_rwlock)) {
uint64_t actions_stub[512 / 8], slow_stub[512 / 8];
struct ofpbuf actions, put_actions;
+ int miss_cnt = 0, dropped_cnt = 0;
struct match match;
ofpbuf_use_stub(&actions, actions_stub, sizeof actions_stub);
@@ -2683,8 +2680,11 @@ fast_path_processing(struct dp_netdev_pmd_thread *pmd,
DPIF_UC_MISS, NULL, &actions,
&put_actions);
if (OVS_UNLIKELY(error && error != ENOSPC)) {
+ dpif_packet_delete(packets[i]);
+ dropped_cnt++;
continue;
}
+ miss_cnt++;
/* We can't allow the packet batching in the next loop to execute
* the actions. Otherwise, if there are any slow path actions,
@@ -2715,6 +2715,8 @@ fast_path_processing(struct dp_netdev_pmd_thread *pmd,
ofpbuf_uninit(&actions);
ofpbuf_uninit(&put_actions);
fat_rwlock_unlock(&dp->upcall_rwlock);
+ dp_netdev_count_packet(dp, DP_STAT_MISS, miss_cnt);
+ dp_netdev_count_packet(dp, DP_STAT_LOST, dropped_cnt);
} else if (OVS_UNLIKELY(any_miss)) {
int dropped_cnt = 0;
--
2.1.0.rc1
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev