From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by dpdk.org (Postfix) with ESMTP id 14DFA7CE3 for ; Mon, 14 Aug 2017 22:06:36 +0200 (CEST) Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 14 Aug 2017 13:06:35 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.41,374,1498546800"; d="scan'208";a="1003540276" Received: from tanjianf-mobl.ccr.corp.intel.com (HELO [10.24.12.141]) ([10.24.12.141]) by orsmga003.jf.intel.com with ESMTP; 14 Aug 2017 13:06:35 -0700 To: Jingjing Wu References: <1502440441-37830-1-git-send-email-jingjing.wu@intel.com> <1502636600-46889-1-git-send-email-jingjing.wu@intel.com> Cc: dev@dpdk.org From: "Tan, Jianfeng" Message-ID: Date: Mon, 14 Aug 2017 13:06:35 -0700 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 MIME-Version: 1.0 In-Reply-To: <1502636600-46889-1-git-send-email-jingjing.wu@intel.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [dpdk-dev] [PATCH v2] eal: add counter size for efd clean X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Aug 2017 20:06:37 -0000 On 8/13/2017 8:03 AM, Jingjing Wu wrote: > 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 know the read > size. remove "know". > > Signed-off-by: Jingjing Wu Besides, looks good to me. Reviewed-by: Jianfeng Tan Thanks, Jianfeng > --- > > 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 */