From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pa0-f43.google.com (mail-pa0-f43.google.com [209.85.220.43]) by dpdk.org (Postfix) with ESMTP id 7529895A4 for ; Thu, 22 Oct 2015 11:46:07 +0200 (CEST) Received: by pabrc13 with SMTP id rc13so82635511pab.0 for ; Thu, 22 Oct 2015 02:46:06 -0700 (PDT) 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=COanu/jwlfAe3FeWyYIWjtUZDB5jqvnwpmccO267NKI=; b=lCPrxe7ycysYMllZCt4dHTt8EuGpkDqnJzcq02Y4deJOZr7WpNq632Ue6hk8F5oCne yShPYj8WPNbX25rMpykBS1UdMGBeoQOOAk32MY1sc0ADOPHXN5m1QYlFtebItyM7QtvI y++1qyuTLvlsIE6yZzmk/DZm93yRGJxST5FQGKCgVcClIdgkTUYtjagw7P/TLO9U6VEn jcWwXfFJKLYWMxjllGhKutKS8Bs7+7SUvMbsYkntrNCzPwioUjIJLrOIrDigNDanvJgz DE3cTChbJyejAnYoZd9juewA+yQNzO/xEUarmOQCQwTdN/hMWK0E2G/xEwjNz8KjiCdQ HXSg== 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=COanu/jwlfAe3FeWyYIWjtUZDB5jqvnwpmccO267NKI=; b=IPnu9T20EOTSWMr+KhWAMQkOGGAJUdILKoVNjJTagm2vwfgoofizBrWL6JqVC1Cb32 HQnkRYKx/0y1fESz3AigY9AaptrFB3Cumgm4owyQJlSEWjnvpdtoXAaSgFgAYD4a/ImL JdmCzie3c7qYRAkhNHj7gsh6dtFh+sP9dBpMj0uPyYs7ldUHE+XT0kZTaesu95aysyQX p/cLSi4UfwqL5j0OKuHtw72YKY5KrKX0LxUB+KCZYx02g02EDttan4d+QK84RlSP50S+ s+smloxfpA4JPUWCABaSzs+qv3CGfV4p5QYN3f4WGRDQuKjrYDG3I9HkINqN1lKKhDvf INHg== X-Gm-Message-State: ALoCoQm5RnVFq/fH3VcrDYbFxat2o3aH7QPo4zQs0Ubo5HL5ZJxk69AbUF0OnoVVPaxkiTUS6pUt X-Received: by 10.68.161.162 with SMTP id xt2mr16509418pbb.89.1445507166787; Thu, 22 Oct 2015 02:46:06 -0700 (PDT) Received: from eris.hq.igel.co.jp (napt.igel.co.jp. [219.106.231.132]) by smtp.gmail.com with ESMTPSA id fa14sm13199260pac.8.2015.10.22.02.46.04 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 22 Oct 2015 02:46:06 -0700 (PDT) From: Tetsuya Mukawa To: dev@dpdk.org, ciara.loftus@intel.com Date: Thu, 22 Oct 2015 18:45:49 +0900 Message-Id: <1445507150-1481-2-git-send-email-mukawa@igel.co.jp> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1445507150-1481-1-git-send-email-mukawa@igel.co.jp> References: <1440993326-21205-2-git-send-email-mukawa@igel.co.jp> <1445507150-1481-1-git-send-email-mukawa@igel.co.jp> Cc: ann.zhuangyanying@huawei.com Subject: [dpdk-dev] [RFC PATCH v3 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: , X-List-Received-Date: Thu, 22 Oct 2015 09:46:07 -0000 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_virtio_net.h | 3 ++ lib/librte_vhost/vhost_user/virtio-net-user.c | 8 +++--- lib/librte_vhost/virtio-net.c | 40 +++++++++++++++++++++++++-- lib/librte_vhost/virtio-net.h | 3 +- 4 files changed, 47 insertions(+), 7 deletions(-) diff --git a/lib/librte_vhost/rte_virtio_net.h b/lib/librte_vhost/rte_virtio_net.h index 93d3e27..ec84c9b 100644 --- a/lib/librte_vhost/rte_virtio_net.h +++ b/lib/librte_vhost/rte_virtio_net.h @@ -108,6 +108,7 @@ struct virtio_net { uint32_t virt_qp_nb; uint32_t mem_idx; /** Used in set memory layout, unique for each queue within virtio device. */ void *priv; /**< private context */ + void *pmd_priv; /**< private context for vhost PMD */ } __rte_cache_aligned; /** @@ -198,6 +199,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 6a12d96..a75697f 100644 --- a/lib/librte_vhost/vhost_user/virtio-net-user.c +++ b/lib/librte_vhost/vhost_user/virtio-net-user.c @@ -288,7 +288,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); } /* @@ -302,7 +302,7 @@ user_get_vring_base(struct vhost_device_ctx ctx, /* 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); @@ -333,7 +333,7 @@ user_reset_owner(struct vhost_device_ctx ctx, /* 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); RTE_LOG(INFO, VHOST_CONFIG, "reset owner --- state idx:%d state num:%d\n", state->index, state->num); @@ -379,7 +379,7 @@ user_destroy_device(struct vhost_device_ctx ctx) uint32_t i; if (dev && (dev->flags & VIRTIO_DEV_RUNNING)) - notify_ops->destroy_device(dev); + notify_destroy_device(dev); for (i = 0; i < dev->virt_qp_nb; i++) if (dev && dev->mem_arr[i]) { diff --git a/lib/librte_vhost/virtio-net.c b/lib/librte_vhost/virtio-net.c index 3131719..eec3c22 100644 --- a/lib/librte_vhost/virtio-net.c +++ b/lib/librte_vhost/virtio-net.c @@ -64,6 +64,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; @@ -84,6 +86,29 @@ static uint64_t VHOST_FEATURES = VHOST_SUPPORTED_FEATURES; static uint64_t VHOST_PROTOCOL_FEATURES = VHOST_SUPPORTED_PROTOCOL_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); +} + /* * Converts QEMU virtual address to Vhost virtual address. This function is * used to convert the ring addresses to our address space. @@ -421,7 +446,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 { @@ -884,7 +909,7 @@ set_backend(struct vhost_device_ctx ctx, struct vhost_vring_file *file) dev->virtqueue[VIRTIO_RXQ]->enabled = 1; dev->virtqueue[VIRTIO_TXQ]->enabled = 1; } - return notify_ops->new_device(dev); + return notify_new_device(dev); } /* Otherwise we remove it. */ } else @@ -1006,3 +1031,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 ef6efae..f92ed73 100644 --- a/lib/librte_vhost/virtio-net.h +++ b/lib/librte_vhost/virtio-net.h @@ -39,7 +39,8 @@ #define VHOST_USER_PROTOCOL_F_VRING_FLAG 2 -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); #endif -- 2.1.4