> -----Original Message----- > From: Wu, Jingjing > Sent: Thursday, August 24, 2017 10:11 AM > To: Tan, Jianfeng > Cc: Wu, Jingjing; dev@dpdk.org > Subject: [PATCH v3] eal: add counter size for efd clean > > 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 proper > event fd read. > > This patch adds efd_counter_size in rte_intr_handle > struct to tell the rx interrupt process the read size. > > Signed-off-by: Jingjing Wu <jingjing...@intel.com>
Reviewed-by: Jianfeng Tan <jianfeng....@intel.com> Thanks, Jianfeng > --- > > v3 change: > - rework commit log > > v2 change: > - fix typo and reword commit log > > 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 --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c > b/drivers/net/virtio/virtio_user/virtio_user_dev.c > index 7941271..906d7a2 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, no 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..7de39c3 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, initialization 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 */ > -- > 2.4.11