libmemif: don't consume rx queue interrupt, if memif_rx_burst fails

Type: fix

Signed-off-by: Jan Cavojsky <jan.cavojsky@pantheon.tech>
Change-Id: Ic6c15c88c80c4045c290cd78533be6f070c7470a
(cherry picked from commit 77a95cdce2f3d80dac2832b68310eb5b23769c0e)
This commit is contained in:
Jan Cavojsky
2020-03-03 16:25:58 +01:00
committed by Andrew Yourtchenko
parent ffa14d74be
commit fd24264763
3 changed files with 16 additions and 5 deletions

View 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);
```

View 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,

View 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 */
}