aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetri Savolainen <petri.savolainen@linaro.org>2018-02-06 13:44:04 +0200
committerMaxim Uvarov <maxim.uvarov@linaro.org>2018-02-26 14:13:59 +0300
commit41c5133aa472fe33514dbe605931cb508e855c8b (patch)
tree547d384d99ba1b2dc4ce33ba3ae546ff9b66bba6
parent849ffeb85f44f666745a4d64ceb42bd1def33346 (diff)
linux-gen: pktio: fix recv timeout issue with socket mmap
Validation test failed sometimes when select returned that there are packets but sock_mmap_recv did find those (or it dropped those). Continue timeout wait with select if sock_mmap_recv didn't find any packets. Select updates timeout value automatically to reflect the amount of time not slept. Fixes https://bugs.linaro.org/show_bug.cgi?id=3615 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>
-rw-r--r--platform/linux-generic/pktio/socket_mmap.c40
1 files changed, 27 insertions, 13 deletions
diff --git a/platform/linux-generic/pktio/socket_mmap.c b/platform/linux-generic/pktio/socket_mmap.c
index fd8232055..deaa6da15 100644
--- a/platform/linux-generic/pktio/socket_mmap.c
+++ b/platform/linux-generic/pktio/socket_mmap.c
@@ -693,10 +693,19 @@ static int sock_mmap_recv_tmo(pktio_entry_t *pktio_entry, int index,
FD_ZERO(&readfds);
maxfd = sock_mmap_fd_set(pktio_entry, index, &readfds);
- if (select(maxfd + 1, &readfds, NULL, NULL, &timeout) == 0)
- return 0;
+ while (1) {
+ ret = select(maxfd + 1, &readfds, NULL, NULL, &timeout);
+
+ if (ret <= 0)
+ return ret;
+
+ ret = sock_mmap_recv(pktio_entry, index, pkt_table, num);
+
+ if (ret)
+ return ret;
- return sock_mmap_recv(pktio_entry, index, pkt_table, num);
+ /* If no packets, continue wait until timeout expires */
+ }
}
static int sock_mmap_recv_mq_tmo(pktio_entry_t *pktio_entry[], int index[],
@@ -730,20 +739,25 @@ static int sock_mmap_recv_mq_tmo(pktio_entry_t *pktio_entry[], int index[],
timeout.tv_sec = usecs / (1000 * 1000);
timeout.tv_usec = usecs - timeout.tv_sec * (1000ULL * 1000ULL);
- if (select(maxfd + 1, &readfds, NULL, NULL, &timeout) == 0)
- return 0;
+ while (1) {
+ ret = select(maxfd + 1, &readfds, NULL, NULL, &timeout);
- for (i = 0; i < num_q; i++) {
- ret = sock_mmap_recv(pktio_entry[i], index[i], pkt_table, num);
+ if (ret <= 0)
+ return ret;
- if (ret > 0 && from)
- *from = i;
+ for (i = 0; i < num_q; i++) {
+ ret = sock_mmap_recv(pktio_entry[i], index[i],
+ pkt_table, num);
- if (ret != 0)
- return ret;
- }
+ if (ret > 0 && from)
+ *from = i;
- return 0;
+ if (ret)
+ return ret;
+ }
+
+ /* If no packets, continue wait until timeout expires */
+ }
}
static int sock_mmap_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED,