From patchwork Mon Nov 2 03:58:56 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tetsuya Mukawa X-Patchwork-Id: 8512 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id DEA768E7E; Mon, 2 Nov 2015 04:59:16 +0100 (CET) Received: from mail-pa0-f52.google.com (mail-pa0-f52.google.com [209.85.220.52]) by dpdk.org (Postfix) with ESMTP id A10458D9F for ; Mon, 2 Nov 2015 04:59:15 +0100 (CET) Received: by padec8 with SMTP id ec8so25454409pad.1 for ; Sun, 01 Nov 2015 19:59:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=igel_co_jp.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=M9HOK9Ymbx/Z3Gf7dje8jkcjqNa9XN2YLPlXvwPidZE=; b=L+21xI7ABffyC9ypU2NGFl49H35buShG4sre5lK1QqjnYDMNfb3h1/XF6rG8mG9ORs FyNpp/u1Tz5Qvuu2Ph5mAz+gDr1tCLOgIKJlgpRLGUVfL5UMSXXbNf19RxYeYosE1xoG FhI5cjAMhn2xAzJibPqeZBEZoqkRII/82Gat+gLeSSv8dDDIfaYOrCCaCR9y29ZV2tB4 +59KFzs2SyYMTem+9MTzV7fI0ua4v14NWp7PksmhOJbTf75x3xe8mVDktssZigBT/CY5 mt1FfA5QL7N25p6OXuK7klPttEfD8FEB179AXeQVAWg+Q/AOAgjTpnalTVk856KRMZ/4 xKmw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=M9HOK9Ymbx/Z3Gf7dje8jkcjqNa9XN2YLPlXvwPidZE=; b=CpFd8inDggU+dktjLrvwNPln10yg5vhg7rsejrcX4aedPoZ92L6Jqugu42LV25Gd1X df/Ajbt/aAxad0DpTNIMkNUr8MKTLUaPJVwjreynvvI5T/VV1PCRv7+gqjrCJJPRHocZ cMdENFtu8f2qJQKUpajBqIalh0AniiLSOEE+8mxXpOFAzwM4xPNXmmVY75OWjqEng9ZD O4HcEFFFbaSyWJEu24XB+eQ5urNQVW9zaaGqm7hHQL96i0HT0jo5mCCfaKonGuMlEDxU NN6Oz0/fnnylDsLWY0rLCVuu+R2ALuqLigQB3oNLMdbL6J6qhQgWBd1fw/sZ6sK6QoRJ eFpg== X-Gm-Message-State: ALoCoQk5b9uGqei689fhnATWj10qeCSvCEjZT24o/jXZQqyc2JoOY6pIednJRYfrx/JcBM0OTlSM X-Received: by 10.66.228.199 with SMTP id sk7mr25007810pac.8.1446436755015; Sun, 01 Nov 2015 19:59:15 -0800 (PST) Received: from localhost.localdomain (napt.igel.co.jp. [219.106.231.132]) by smtp.gmail.com with ESMTPSA id d7sm4808772pas.31.2015.11.01.19.59.12 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 01 Nov 2015 19:59:14 -0800 (PST) From: Tetsuya Mukawa To: dev@dpdk.org Date: Mon, 2 Nov 2015 12:58:56 +0900 Message-Id: <1446436737-25606-2-git-send-email-mukawa@igel.co.jp> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1446436737-25606-1-git-send-email-mukawa@igel.co.jp> References: <1445926375-18986-4-git-send-email-mukawa@igel.co.jp> <1446436737-25606-1-git-send-email-mukawa@igel.co.jp> Cc: ann.zhuangyanying@huawei.com Subject: [dpdk-dev] [PATCH v2 1/2] vhost: Add callback and private data for vhost PMD X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" These variables are needed to be able to manage one of virtio devices using both vhost library APIs and vhost PMD. For example, if vhost PMD uses current callback handler and private data provided by vhost library, A DPDK application that links vhost library cannot use some of vhost library APIs. To avoid it, callback and private data for vhost PMD are needed. Signed-off-by: Tetsuya Mukawa --- lib/librte_vhost/rte_vhost_version.map | 6 +++ lib/librte_vhost/rte_virtio_net.h | 3 ++ lib/librte_vhost/vhost_user/virtio-net-user.c | 13 +++---- lib/librte_vhost/virtio-net.c | 56 +++++++++++++++++++++++++-- lib/librte_vhost/virtio-net.h | 4 +- 5 files changed, 70 insertions(+), 12 deletions(-) diff --git a/lib/librte_vhost/rte_vhost_version.map b/lib/librte_vhost/rte_vhost_version.map index 3d8709e..00a9ce5 100644 --- a/lib/librte_vhost/rte_vhost_version.map +++ b/lib/librte_vhost/rte_vhost_version.map @@ -20,3 +20,9 @@ DPDK_2.1 { rte_vhost_driver_unregister; } DPDK_2.0; + +DPDK_2.2 { + global: + + rte_vhost_driver_pmd_callback_register; +} DPDK_2.1; diff --git a/lib/librte_vhost/rte_virtio_net.h b/lib/librte_vhost/rte_virtio_net.h index b6386f9..033edde 100644 --- a/lib/librte_vhost/rte_virtio_net.h +++ b/lib/librte_vhost/rte_virtio_net.h @@ -121,6 +121,7 @@ struct virtio_net { char ifname[IF_NAME_SZ]; /**< Name of the tap device or socket path. */ uint32_t virt_qp_nb; /**< number of queue pair we have allocated */ void *priv; /**< private context */ + void *pmd_priv; /**< private context for vhost PMD */ struct vhost_virtqueue *virtqueue[VHOST_MAX_QUEUE_PAIRS * 2]; /**< Contains all virtqueue information. */ } __rte_cache_aligned; @@ -217,6 +218,8 @@ int rte_vhost_driver_unregister(const char *dev_name); /* Register callbacks. */ int rte_vhost_driver_callback_register(struct virtio_net_device_ops const * const); +/* Register callbacks for vhost PMD (Only for internal). */ +int rte_vhost_driver_pmd_callback_register(struct virtio_net_device_ops const * const); /* Start vhost driver session blocking loop. */ int rte_vhost_driver_session_start(void); diff --git a/lib/librte_vhost/vhost_user/virtio-net-user.c b/lib/librte_vhost/vhost_user/virtio-net-user.c index d07452a..d8ae2fc 100644 --- a/lib/librte_vhost/vhost_user/virtio-net-user.c +++ b/lib/librte_vhost/vhost_user/virtio-net-user.c @@ -111,7 +111,7 @@ user_set_mem_table(struct vhost_device_ctx ctx, struct VhostUserMsg *pmsg) /* Remove from the data plane. */ if (dev->flags & VIRTIO_DEV_RUNNING) - notify_ops->destroy_device(dev); + notify_destroy_device(dev); if (dev->mem) { free_mem_region(dev); @@ -272,7 +272,7 @@ user_set_vring_kick(struct vhost_device_ctx ctx, struct VhostUserMsg *pmsg) if (virtio_is_ready(dev) && !(dev->flags & VIRTIO_DEV_RUNNING)) - notify_ops->new_device(dev); + notify_new_device(dev); } /* @@ -288,7 +288,7 @@ user_get_vring_base(struct vhost_device_ctx ctx, return -1; /* We have to stop the queue (virtio) if it is running. */ if (dev->flags & VIRTIO_DEV_RUNNING) - notify_ops->destroy_device(dev); + notify_destroy_device(dev); /* Here we are safe to get the last used index */ ops->get_vring_base(ctx, state->index, state); @@ -324,10 +324,7 @@ user_set_vring_enable(struct vhost_device_ctx ctx, "set queue enable: %d to qp idx: %d\n", enable, state->index); - if (notify_ops->vring_state_changed) { - notify_ops->vring_state_changed(dev, base_idx / VIRTIO_QNUM, - enable); - } + notify_vring_state_changed(dev, base_idx / VIRTIO_QNUM, enable); dev->virtqueue[base_idx + VIRTIO_RXQ]->enabled = enable; dev->virtqueue[base_idx + VIRTIO_TXQ]->enabled = enable; @@ -341,7 +338,7 @@ user_destroy_device(struct vhost_device_ctx ctx) struct virtio_net *dev = get_device(ctx); if (dev && (dev->flags & VIRTIO_DEV_RUNNING)) - notify_ops->destroy_device(dev); + notify_destroy_device(dev); if (dev && dev->mem) { free_mem_region(dev); diff --git a/lib/librte_vhost/virtio-net.c b/lib/librte_vhost/virtio-net.c index 3e82605..ee54beb 100644 --- a/lib/librte_vhost/virtio-net.c +++ b/lib/librte_vhost/virtio-net.c @@ -65,6 +65,8 @@ struct virtio_net_config_ll { /* device ops to add/remove device to/from data core. */ struct virtio_net_device_ops const *notify_ops; +/* device ops for vhost PMD to add/remove device to/from data core. */ +struct virtio_net_device_ops const *pmd_notify_ops; /* root address of the linked list of managed virtio devices */ static struct virtio_net_config_ll *ll_root; @@ -80,6 +82,43 @@ static struct virtio_net_config_ll *ll_root; static uint64_t VHOST_FEATURES = VHOST_SUPPORTED_FEATURES; +int +notify_new_device(struct virtio_net *dev) +{ + if ((pmd_notify_ops != NULL) && (pmd_notify_ops->new_device != NULL)) { + int ret = pmd_notify_ops->new_device(dev); + if (ret != 0) + return ret; + } + if ((notify_ops != NULL) && (notify_ops->new_device != NULL)) + return notify_ops->new_device(dev); + + return 0; +} + +void +notify_destroy_device(volatile struct virtio_net *dev) +{ + if ((pmd_notify_ops != NULL) && (pmd_notify_ops->destroy_device != NULL)) + pmd_notify_ops->destroy_device(dev); + if ((notify_ops != NULL) && (notify_ops->destroy_device != NULL)) + notify_ops->destroy_device(dev); +} + +int +notify_vring_state_changed(struct virtio_net *dev, uint16_t queue_id, int enable) +{ + if ((pmd_notify_ops != NULL) && (pmd_notify_ops->vring_state_changed != NULL)) { + int ret = pmd_notify_ops->vring_state_changed(dev, queue_id, enable); + if (ret != 0) + return ret; + } + if ((notify_ops != NULL) && (notify_ops->vring_state_changed != NULL)) + return notify_ops->vring_state_changed(dev, queue_id, enable); + + return 0; +} + /* * Converts QEMU virtual address to Vhost virtual address. This function is * used to convert the ring addresses to our address space. @@ -377,7 +416,7 @@ destroy_device(struct vhost_device_ctx ctx) * the function to remove it from the data core. */ if ((ll_dev_cur->dev.flags & VIRTIO_DEV_RUNNING)) - notify_ops->destroy_device(&(ll_dev_cur->dev)); + notify_destroy_device(&(ll_dev_cur->dev)); ll_dev_cur = rm_config_ll_entry(ll_dev_cur, ll_dev_last); } else { @@ -793,12 +832,12 @@ set_backend(struct vhost_device_ctx ctx, struct vhost_vring_file *file) if (!(dev->flags & VIRTIO_DEV_RUNNING)) { if (((int)dev->virtqueue[VIRTIO_TXQ]->backend != VIRTIO_DEV_STOPPED) && ((int)dev->virtqueue[VIRTIO_RXQ]->backend != VIRTIO_DEV_STOPPED)) { - return notify_ops->new_device(dev); + return notify_new_device(dev); } /* Otherwise we remove it. */ } else if (file->fd == VIRTIO_DEV_STOPPED) - notify_ops->destroy_device(dev); + notify_destroy_device(dev); return 0; } @@ -882,3 +921,14 @@ rte_vhost_driver_callback_register(struct virtio_net_device_ops const * const op return 0; } + +/* + * Register ops so that we can add/remove device to data core. + */ +int +rte_vhost_driver_pmd_callback_register(struct virtio_net_device_ops const * const ops) +{ + pmd_notify_ops = ops; + + return 0; +} diff --git a/lib/librte_vhost/virtio-net.h b/lib/librte_vhost/virtio-net.h index 75fb57e..0816e71 100644 --- a/lib/librte_vhost/virtio-net.h +++ b/lib/librte_vhost/virtio-net.h @@ -37,7 +37,9 @@ #include "vhost-net.h" #include "rte_virtio_net.h" -struct virtio_net_device_ops const *notify_ops; struct virtio_net *get_device(struct vhost_device_ctx ctx); +int notify_new_device(struct virtio_net *dev); +void notify_destroy_device(volatile struct virtio_net *dev); +int notify_vring_state_changed(struct virtio_net *dev, uint16_t queue_id, int enable); #endif