diff options
author | Petri Savolainen <petri.savolainen@linaro.org> | 2018-02-06 13:44:04 +0200 |
---|---|---|
committer | Maxim Uvarov <maxim.uvarov@linaro.org> | 2018-02-26 14:13:59 +0300 |
commit | 41c5133aa472fe33514dbe605931cb508e855c8b (patch) | |
tree | 547d384d99ba1b2dc4ce33ba3ae546ff9b66bba6 | |
parent | 849ffeb85f44f666745a4d64ceb42bd1def33346 (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.c | 40 |
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, |