[ovs-dev] [PATCH] dp-packet: Introduce dp_packet_batch_add_unsafe().

Ilya Maximets i.maximets at samsung.com
Mon Aug 7 15:50:43 UTC 2017


Almost all batch usecases covered by the new API introduced
in commit 72c84bc2db23 ("dp-packet: Enhance packet batch APIs.")
except unsafe batch addition. It used in dpif-netdev for fast
per-flow batches filling. Introduction of this new function will
allow to avoid most direct accesses to the batch structure.

Function defined as 'inline' in .h file. Should not impact on
performance.

Additionally unsafe version now used in dp_packet_batch_clone()
to speed up it a little, and also fixed few cases missed while
API enchancing.

Signed-off-by: Ilya Maximets <i.maximets at samsung.com>
---
 lib/dp-packet.h        | 11 +++++++++--
 lib/dpif-netdev.c      |  2 +-
 lib/netdev-bsd.c       |  3 +--
 lib/netdev-dummy.c     |  3 +--
 tests/test-conntrack.c |  2 +-
 5 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/lib/dp-packet.h b/lib/dp-packet.h
index 9dbb611..8ab14ce 100644
--- a/lib/dp-packet.h
+++ b/lib/dp-packet.h
@@ -685,11 +685,18 @@ dp_packet_batch_init(struct dp_packet_batch *batch)
 }
 
 static inline void
+dp_packet_batch_add_unsafe(struct dp_packet_batch *batch,
+                           struct dp_packet *packet)
+{
+    batch->packets[batch->count++] = packet;
+}
+
+static inline void
 dp_packet_batch_add__(struct dp_packet_batch *batch,
                       struct dp_packet *packet, size_t limit)
 {
     if (batch->count < limit) {
-        batch->packets[batch->count++] = packet;
+        dp_packet_batch_add_unsafe(batch, packet);
     } else {
         dp_packet_delete(packet);
     }
@@ -764,7 +771,7 @@ dp_packet_batch_clone(struct dp_packet_batch *dst,
 
     dp_packet_batch_init(dst);
     DP_PACKET_BATCH_FOR_EACH (packet, src) {
-        dp_packet_batch_add(dst, dp_packet_clone(packet));
+        dp_packet_batch_add_unsafe(dst, dp_packet_clone(packet));
     }
     dst->trunc = src->trunc;
 }
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 8ecc9d1..d60f071 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -4604,7 +4604,7 @@ packet_batch_per_flow_update(struct packet_batch_per_flow *batch,
 {
     batch->byte_count += dp_packet_size(packet);
     batch->tcp_flags |= miniflow_get_tcp_flags(mf);
-    batch->array.packets[batch->array.count++] = packet;
+    dp_packet_batch_add_unsafe(&batch->array, packet);
 }
 
 static inline void
diff --git a/lib/netdev-bsd.c b/lib/netdev-bsd.c
index 8a4cdb3..92f1253 100644
--- a/lib/netdev-bsd.c
+++ b/lib/netdev-bsd.c
@@ -640,8 +640,7 @@ netdev_bsd_rxq_recv(struct netdev_rxq *rxq_, struct dp_packet_batch *batch)
     if (retval) {
         dp_packet_delete(packet);
     } else {
-        batch->packets[0] = packet;
-        batch->count = 1;
+        dp_packet_batch_init_packet(batch, packet);
     }
     return retval;
 }
diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c
index 752f157..b5a35b7 100644
--- a/lib/netdev-dummy.c
+++ b/lib/netdev-dummy.c
@@ -1017,8 +1017,7 @@ netdev_dummy_rxq_recv(struct netdev_rxq *rxq_, struct dp_packet_batch *batch)
     netdev->stats.rx_bytes += dp_packet_size(packet);
     ovs_mutex_unlock(&netdev->mutex);
 
-    batch->packets[0] = packet;
-    batch->count = 1;
+    dp_packet_batch_init_packet(batch, packet);
     return 0;
 }
 
diff --git a/tests/test-conntrack.c b/tests/test-conntrack.c
index 6a77db8..28a7dc0 100644
--- a/tests/test-conntrack.c
+++ b/tests/test-conntrack.c
@@ -175,7 +175,7 @@ pcap_batch_execute_conntrack(struct conntrack *ct,
                               NULL, NULL, NULL, NULL);
             dp_packet_batch_init(&new_batch);
         }
-        new_batch.packets[new_batch.count++] = packet;;
+        dp_packet_batch_add(&new_batch, packet);
     }
 
     if (!dp_packet_batch_is_empty(&new_batch)) {
-- 
2.7.4



More information about the dev mailing list