From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jianfeng Tan Subject: [PATCH v2 3/5] net/virtio-user: add rxq interrupt mode support Date: Tue, 28 Mar 2017 08:21:54 +0000 Message-ID: <1490689316-131625-4-git-send-email-jianfeng.tan@intel.com> References: <1488563803-87754-1-git-send-email-jianfeng.tan@intel.com> <1490689316-131625-1-git-send-email-jianfeng.tan@intel.com> Cc: yuanhan.liu@linux.intel.com, david.marchand@6wind.com, maxime.coquelin@redhat.com, Jianfeng Tan To: dev@dpdk.org Return-path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by dpdk.org (Postfix) with ESMTP id 05DD8CF80 for ; Tue, 28 Mar 2017 10:21:16 +0200 (CEST) In-Reply-To: <1490689316-131625-1-git-send-email-jianfeng.tan@intel.com> List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" For rxq interrupt, the device (backend driver) will notify driver through callfd. Each virtqueue has a callfd. To keep compatible with the existing framework, we will give these callfds to interrupt thread for listening for interrupts. Signed-off-by: Jianfeng Tan --- doc/guides/rel_notes/release_17_05.rst | 7 +++++++ drivers/net/virtio/virtio_user/virtio_user_dev.c | 25 +++++++++++++++++++++++- drivers/net/virtio/virtio_user/virtio_user_dev.h | 2 +- drivers/net/virtio/virtio_user_ethdev.c | 12 +++++++++++- 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/doc/guides/rel_notes/release_17_05.rst b/doc/guides/rel_notes/release_17_05.rst index bb64428..2b5eaab 100644 --- a/doc/guides/rel_notes/release_17_05.rst +++ b/doc/guides/rel_notes/release_17_05.rst @@ -57,6 +57,13 @@ New Features * Enable Vhost PMD's MTU get feature. * Get max MTU value from host in Virtio PMD +* **Added interrupt mode support for virtio-user.** + + Implemented Rxq interrupt mode support for virtio-user as a virtual + device. Supported cases: + + * Rxq interrupt for virtio-user + vhost-user as the backend. + * Rxq interrupt for virtio-user + vhost-kernel as the backend. Resolved Issues --------------- diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c index 9dcdac8..e269ad1 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c @@ -140,8 +140,28 @@ virtio_user_queue_setup(struct virtio_user_dev *dev, return 0; } +static void +virtio_user_fill_intr_handle(struct virtio_user_dev *dev, uint8_t portid) +{ + uint32_t i; + struct rte_eth_dev *eth_dev = &rte_eth_devices[portid]; + + if (!eth_dev->intr_handle) { + eth_dev->intr_handle = malloc(sizeof(*eth_dev->intr_handle)); + if (!eth_dev->intr_handle) + return; + memset(eth_dev->intr_handle, 0, sizeof(*eth_dev->intr_handle)); + } + + for (i = 0; i < dev->max_queue_pairs; ++i) + eth_dev->intr_handle->efds[i] = dev->callfds[i]; + 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; +} + int -virtio_user_start_device(struct virtio_user_dev *dev) +virtio_user_start_device(struct virtio_user_dev *dev, uint8_t portid) { uint64_t features; int ret; @@ -175,6 +195,9 @@ virtio_user_start_device(struct virtio_user_dev *dev) */ dev->ops->enable_qp(dev, 0, 1); + /* Step 5: prepare for interrupt mode */ + virtio_user_fill_intr_handle(dev, portid); + return 0; error: /* TODO: free resource here or caller to check */ diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.h b/drivers/net/virtio/virtio_user/virtio_user_dev.h index bd2e4ca..de4bb5c 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.h +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.h @@ -66,7 +66,7 @@ struct virtio_user_dev { struct virtio_user_backend_ops *ops; }; -int virtio_user_start_device(struct virtio_user_dev *dev); +int virtio_user_start_device(struct virtio_user_dev *dev, uint8_t portid); int virtio_user_stop_device(struct virtio_user_dev *dev); int virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, int cq, int queue_size, const char *mac); diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index 2961e6b..e4d4c03 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -101,7 +101,7 @@ virtio_user_set_status(struct virtio_hw *hw, uint8_t status) struct virtio_user_dev *dev = virtio_user_get_dev(hw); if (status & VIRTIO_CONFIG_STATUS_DRIVER_OK) - virtio_user_start_device(dev); + virtio_user_start_device(dev, hw->port_id); else if (status == VIRTIO_CONFIG_STATUS_RESET) virtio_user_reset(hw); dev->status = status; @@ -148,6 +148,15 @@ virtio_user_set_config_irq(struct virtio_hw *hw __rte_unused, return VIRTIO_MSI_NO_VECTOR; } +static uint16_t +virtio_user_set_queue_irq(struct virtio_hw *hw __rte_unused, + struct virtqueue *vq __rte_unused, + uint16_t vec) +{ + /* pretend we have done that */ + return vec; +} + /* This function is to get the queue size, aka, number of descs, of a specified * queue. Different with the VHOST_USER_GET_QUEUE_NUM, which is used to get the * max supported queues. @@ -226,6 +235,7 @@ const struct virtio_pci_ops virtio_user_ops = { .set_features = virtio_user_set_features, .get_isr = virtio_user_get_isr, .set_config_irq = virtio_user_set_config_irq, + .set_queue_irq = virtio_user_set_queue_irq, .get_queue_num = virtio_user_get_queue_num, .setup_queue = virtio_user_setup_queue, .del_queue = virtio_user_del_queue, -- 2.7.4