diff mbox

[dpdk-dev] eal: add counter size for efd clean

Message ID 1502440441-37830-1-git-send-email-jingjing.wu@intel.com (mailing list archive)
State Superseded, archived
Headers show

Checks

Context Check Description
ci/checkpatch warning coding style issues
ci/Intel-compilation success Compilation OK

Commit Message

Jingjing Wu Aug. 11, 2017, 8:34 a.m. UTC
For virtual device, the rte_intr_handle struct is
initialized by the virtual device driver, including
the event fd assignment. If the event fd need to be
read for clean, an argument is required for the reading.

This patch adds efd_counter_size in rte_intr_handle
struct to tell the rx interrupt process know the size
should read.

Signed-off-by: Jingjing Wu <jingjing.wu@intel.com>
---
 drivers/net/virtio/virtio_user/virtio_user_dev.c      |  2 ++
 lib/librte_eal/linuxapp/eal/eal_interrupts.c          | 19 ++++++++++++-------
 .../linuxapp/eal/include/exec-env/rte_interrupts.h    |  1 +
 3 files changed, 15 insertions(+), 7 deletions(-)
diff mbox

Patch

diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c
index 7941271..06303c7 100644
--- a/drivers/net/virtio/virtio_user/virtio_user_dev.c
+++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c
@@ -270,6 +270,8 @@  virtio_user_fill_intr_handle(struct virtio_user_dev *dev)
 	eth_dev->intr_handle->nb_efd = dev->max_queue_pairs;
 	eth_dev->intr_handle->max_intr = dev->max_queue_pairs + 1;
 	eth_dev->intr_handle->type = RTE_INTR_HANDLE_VDEV;
+	/* For virtio vdev, not need to read counter for clean */
+	eth_dev->intr_handle->efd_counter_size = 0;
 	if (dev->vhostfd >= 0)
 		eth_dev->intr_handle->fd = dev->vhostfd;
 
diff --git a/lib/librte_eal/linuxapp/eal/eal_interrupts.c b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
index 3e9ac41..5e0d186 100644
--- a/lib/librte_eal/linuxapp/eal/eal_interrupts.c
+++ b/lib/librte_eal/linuxapp/eal/eal_interrupts.c
@@ -914,7 +914,7 @@  static void
 eal_intr_proc_rxtx_intr(int fd, const struct rte_intr_handle *intr_handle)
 {
 	union rte_intr_read_buffer buf;
-	int bytes_read = 1;
+	int bytes_read = 0;
 	int nbytes;
 
 	switch (intr_handle->type) {
@@ -930,11 +930,9 @@  eal_intr_proc_rxtx_intr(int fd, const struct rte_intr_handle *intr_handle)
 		break;
 #endif
 	case RTE_INTR_HANDLE_VDEV:
-		/* for vdev, fd points to:
-		 * a. eventfd which does not need to read out;
-		 * b. datapath fd which needs PMD to read out.
-		 */
-		return;
+		bytes_read = intr_handle->efd_counter_size;
+		/* For vdev, number of bytes to read is set by driver */
+		break;
 	case RTE_INTR_HANDLE_EXT:
 		return;
 	default:
@@ -947,6 +945,8 @@  eal_intr_proc_rxtx_intr(int fd, const struct rte_intr_handle *intr_handle)
 	 * read out to clear the ready-to-be-read flag
 	 * for epoll_wait.
 	 */
+	if (bytes_read == 0)
+		return;
 	do {
 		nbytes = read(fd, &buf, bytes_read);
 		if (nbytes < 0) {
@@ -1206,7 +1206,12 @@  rte_intr_efd_enable(struct rte_intr_handle *intr_handle, uint32_t nb_efd)
 		intr_handle->nb_efd   = n;
 		intr_handle->max_intr = NB_OTHER_INTR + n;
 	} else if (intr_handle->type == RTE_INTR_HANDLE_VDEV) {
-		/* do nothing, and let vdev driver to initialize this struct */
+		/* only check, initilization would be done in vdev driver.*/
+		if (intr_handle->efd_counter_size >
+		    sizeof(union rte_intr_read_buffer)) {
+			RTE_LOG(ERR, EAL, "the efd_counter_size is oversized");
+			return -EINVAL;
+		}
 	} else {
 		intr_handle->efds[0]  = intr_handle->fd;
 		intr_handle->nb_efd   = RTE_MIN(nb_efd, 1U);
diff --git a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_interrupts.h b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_interrupts.h
index 6daffeb..fd4ea6c 100644
--- a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_interrupts.h
+++ b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_interrupts.h
@@ -93,6 +93,7 @@  struct rte_intr_handle {
 	enum rte_intr_handle_type type;  /**< handle type */
 	uint32_t max_intr;             /**< max interrupt requested */
 	uint32_t nb_efd;               /**< number of available efd(event fd) */
+	uint8_t efd_counter_size;      /**< size of efd counter, used for vdev */
 	int efds[RTE_MAX_RXTX_INTR_VEC_ID];  /**< intr vectors/efds mapping */
 	struct rte_epoll_event elist[RTE_MAX_RXTX_INTR_VEC_ID];
 				       /**< intr vector epoll event */