aboutsummaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorPetri Savolainen <petri.savolainen@linaro.org>2018-10-10 10:12:37 +0300
committerMaxim Uvarov <maxim.uvarov@linaro.org>2018-10-15 21:53:08 +0300
commita8cc1677b95448509bbc0258734c4a0c6465a2ae (patch)
tree921a4c3b473e248d9fb9af425fe4ffc8fc1fc7a5 /platform
parent0f6ebf74b3f77bf7e02558778e32d317cb983393 (diff)
linux-gen: pktio: fix index calculation of multiple dest_queue
Packets to different destination queues interleaved resulted bad indexes when pktin_recv_buf() was recording which packets belong to the same dest_queue. Signed-off-by: Petri Savolainen <petri.savolainen@linaro.org> Reviewed-by: Bill Fischofer <bill.fischofer@linaro.org> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
Diffstat (limited to 'platform')
-rw-r--r--platform/linux-generic/odp_packet_io.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/platform/linux-generic/odp_packet_io.c b/platform/linux-generic/odp_packet_io.c
index 26be844c8..92c14cc2d 100644
--- a/platform/linux-generic/odp_packet_io.c
+++ b/platform/linux-generic/odp_packet_io.c
@@ -614,7 +614,7 @@ static inline int pktin_recv_buf(pktio_entry_t *entry, int pktin_index,
odp_packet_t packets[num];
odp_packet_hdr_t *pkt_hdr;
odp_buffer_hdr_t *buf_hdr;
- int i, pkts, num_rx, num_ev, num_dst, num_cur, cur_dst;
+ int i, pkts, num_rx, num_ev, num_dst;
odp_queue_t cur_queue;
odp_event_t ev[num];
odp_queue_t dst[num];
@@ -622,6 +622,10 @@ static inline int pktin_recv_buf(pktio_entry_t *entry, int pktin_index,
num_rx = 0;
num_dst = 0;
+ num_ev = 0;
+
+ /* Some compilers need this dummy initialization */
+ cur_queue = ODP_QUEUE_INVALID;
pkts = entry->s.ops->recv(entry, pktin_index, packets, num);
@@ -632,29 +636,23 @@ static inline int pktin_recv_buf(pktio_entry_t *entry, int pktin_index,
if (odp_unlikely(pkt_hdr->p.input_flags.dst_queue)) {
/* Sort events for enqueue multi operation(s) */
- if (num_dst == 0) {
- num_ev = 0;
+ if (odp_unlikely(num_dst == 0)) {
num_dst = 1;
- num_cur = 0;
cur_queue = pkt_hdr->dst_queue;
dst[0] = cur_queue;
dst_idx[0] = 0;
}
ev[num_ev] = odp_packet_to_event(pkt);
- num_ev++;
if (cur_queue != pkt_hdr->dst_queue) {
- cur_dst = num_dst;
- num_dst++;
cur_queue = pkt_hdr->dst_queue;
- dst[cur_dst] = cur_queue;
- dst_idx[cur_dst] = num_cur;
- num_cur = 0;
+ dst[num_dst] = cur_queue;
+ dst_idx[num_dst] = num_ev;
+ num_dst++;
}
- num_cur++;
-
+ num_ev++;
continue;
}
buffer_hdrs[num_rx++] = buf_hdr;