libmemif: don't consume rx queue interrupt, if memif_rx_burst fails 38/25638/3
authorJan Cavojsky <jan.cavojsky@pantheon.tech>
Tue, 3 Mar 2020 15:25:58 +0000 (16:25 +0100)
committerDamjan Marion <dmarion@me.com>
Sat, 21 Mar 2020 12:12:13 +0000 (12:12 +0000)
Type: fix

Signed-off-by: Jan Cavojsky <jan.cavojsky@pantheon.tech>
Change-Id: Ic6c15c88c80c4045c290cd78533be6f070c7470a

extras/libmemif/docs/gettingstarted_doc.md
extras/libmemif/src/libmemif.h
extras/libmemif/src/main.c

index dbe465c..1e5ce22 100644 (file)
@@ -114,7 +114,7 @@ typedef struct
 ```
 
 5. Packet receive
-    - Api call memif\_rx\_burst will set all required fields in memif buffers provided by user application and dequeue received buffers.
+    - Api call memif\_rx\_burst will set all required fields in memif buffers provided by user application, dequeue received buffers and consume interrupt event on receive queue. The event is not consumed, if memif_rx_burst fails.
 ```C
 err = memif_rx_burst (c->conn, qid, c->bufs, MAX_MEMIF_BUFS, &rx);
 ```
index 244c3fe..66006f3 100644 (file)
@@ -669,6 +669,9 @@ int memif_tx_burst (memif_conn_handle_t conn, uint16_t qid,
     @param count - number of memif buffers to receive
     @param rx - returns number of received buffers
 
+    Consume interrupt event for receive queue.
+    The event is not consumed, if memif_rx_burst fails.
+
     \return memif_err_t
 */
 int memif_rx_burst (memif_conn_handle_t conn, uint16_t qid,
index 0c4adc2..b80dd64 100644 (file)
@@ -2506,14 +2506,18 @@ memif_rx_burst (memif_conn_handle_t conn, uint16_t qid,
   *rx = 0;
 
   uint64_t b;
-  ssize_t r = read (mq->int_fd, &b, sizeof (b));
-  if (EXPECT_FALSE ((r == -1) && (errno != EAGAIN)))
-    return memif_syscall_error_handler (errno);
+  ssize_t r;
 
   cur_slot = (c->args.is_master) ? mq->last_head : mq->last_tail;
   last_slot = (c->args.is_master) ? ring->head : ring->tail;
   if (cur_slot == last_slot)
-    return MEMIF_ERR_SUCCESS;
+    {
+      r = read (mq->int_fd, &b, sizeof (b));
+      if (EXPECT_FALSE ((r == -1) && (errno != EAGAIN)))
+                       return memif_syscall_error_handler (errno);
+
+      return MEMIF_ERR_SUCCESS;
+    }
 
   ns = last_slot - cur_slot;
 
@@ -2562,6 +2566,10 @@ memif_rx_burst (memif_conn_handle_t conn, uint16_t qid,
       return MEMIF_ERR_NOBUF;
     }
 
+  r = read (mq->int_fd, &b, sizeof (b));
+  if (EXPECT_FALSE ((r == -1) && (errno != EAGAIN)))
+    return memif_syscall_error_handler (errno);
+
   return MEMIF_ERR_SUCCESS;    /* 0 */
 }