Calling poll each time in send and recv routines has its cost, calling poll only
when needed gives a better performance with the cost of possibly losing some
frames on the TX side.

Signed-off-by: Ciprian Barbu <[email protected]>
---
 platform/linux-netmap/odp_packet_netmap.c | 26 ++++++++++++++------------
 1 file changed, 14 insertions(+), 12 deletions(-)

diff --git a/platform/linux-netmap/odp_packet_netmap.c 
b/platform/linux-netmap/odp_packet_netmap.c
index 8e68d34..50062ea 100644
--- a/platform/linux-netmap/odp_packet_netmap.c
+++ b/platform/linux-netmap/odp_packet_netmap.c
@@ -318,13 +318,14 @@ int recv_pkt_netmap(pkt_netmap_t * const pkt_nm, 
odp_packet_t pkt_table[],
        args.pkt_nm = pkt_nm;
 
        odp_ticketlock_lock(&pkt_nm->nm_dev->rx_lock);
-       ret = poll(fds, 1, POLL_TMO);
-       if (ret <= 0 || (fds[0].revents & POLLERR)) {
-               odp_ticketlock_unlock(&pkt_nm->nm_dev->rx_lock);
-               return 0;
-       }
-
        nm_dispatch(pkt_nm->desc, len, nm_recv_cb, (uint8_t *)&args);
+       if (args.nb_rx == 0) {
+               ret = poll(fds, 1, POLL_TMO);
+               if (ret <= 0 || (fds[0].revents & POLLERR)) {
+                       odp_ticketlock_unlock(&pkt_nm->nm_dev->rx_lock);
+                       return 0;
+               }
+       }
        odp_ticketlock_unlock(&pkt_nm->nm_dev->rx_lock);
 
        return args.nb_rx;
@@ -342,12 +343,6 @@ int send_pkt_netmap(pkt_netmap_t * const pkt_nm, 
odp_packet_t pkt_table[],
        fds[0].events = POLLOUT;
 
        odp_ticketlock_lock(&pkt_nm->nm_dev->tx_lock);
-       ret = poll(fds, 1, POLL_TMO);
-       if (ret <= 0 || (fds[0].revents & POLLERR)) {
-               odp_ticketlock_unlock(&pkt_nm->nm_dev->tx_lock);
-               goto out;
-       }
-
        for (nb_tx = 0; nb_tx < len; nb_tx++) {
                odp_packet_t pkt = pkt_table[nb_tx];
                uint8_t *frame = odp_packet_l2(pkt);
@@ -355,6 +350,13 @@ int send_pkt_netmap(pkt_netmap_t * const pkt_nm, 
odp_packet_t pkt_table[],
                if (nm_inject(pkt_nm->desc, frame, frame_len) == 0)
                        break;
        }
+       if (nb_tx == 0) {
+               ret = poll(fds, 1, POLL_TMO);
+               if (ret <= 0 || (fds[0].revents & POLLERR)) {
+                       odp_ticketlock_unlock(&pkt_nm->nm_dev->tx_lock);
+                       goto out;
+               }
+       }
        odp_ticketlock_unlock(&pkt_nm->nm_dev->tx_lock);
 
 out:
-- 
1.8.3.2


_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to