From patchwork Tue Feb 27 10:13:40 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhihong Wang X-Patchwork-Id: 36242 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 410077CC4; Mon, 19 Mar 2018 11:13:01 +0100 (CET) Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by dpdk.org (Postfix) with ESMTP id AB1616841 for ; Mon, 19 Mar 2018 11:12:57 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Mar 2018 03:12:57 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.48,330,1517904000"; d="scan'208";a="38658282" Received: from unknown (HELO dpdk99.sh.intel.com) ([10.67.110.156]) by fmsmga004.fm.intel.com with ESMTP; 19 Mar 2018 03:12:55 -0700 From: Zhihong Wang To: dev@dpdk.org Cc: jianfeng.tan@intel.com, tiwei.bie@intel.com, maxime.coquelin@redhat.com, yliu@fridaylinux.org, cunming.liang@intel.com, xiao.w.wang@intel.com, dan.daly@intel.com, Zhihong Wang Date: Tue, 27 Feb 2018 18:13:40 +0800 Message-Id: <20180227101342.18521-4-zhihong.wang@intel.com> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20180227101342.18521-1-zhihong.wang@intel.com> References: <1517614137-62926-1-git-send-email-zhihong.wang@intel.com> <20180227101342.18521-1-zhihong.wang@intel.com> Subject: [dpdk-dev] [PATCH v3 3/5] vhost: add apis for datapath configuration 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" This patch adds APIs for datapath configuration. The eid and did of the vhost-user socket can be configured to identify the actual device. When the default software datapath is used, eid and did are set to -1. When alternative datapath is used, eid and did are set by app to specify which device to use. Each vhost-user socket can have only 1 connection in this case. Signed-off-by: Zhihong Wang --- lib/librte_vhost/rte_vhost.h | 70 ++++++++++++++++++++++++++++++++++ lib/librte_vhost/rte_vhost_version.map | 6 +++ lib/librte_vhost/socket.c | 65 +++++++++++++++++++++++++++++++ lib/librte_vhost/vhost.c | 50 ++++++++++++++++++++++++ lib/librte_vhost/vhost.h | 10 +++++ 5 files changed, 201 insertions(+) diff --git a/lib/librte_vhost/rte_vhost.h b/lib/librte_vhost/rte_vhost.h index 671ea5053..7aa57ca87 100644 --- a/lib/librte_vhost/rte_vhost.h +++ b/lib/librte_vhost/rte_vhost.h @@ -200,6 +200,54 @@ int rte_vhost_driver_register(const char *path, uint64_t flags); int rte_vhost_driver_unregister(const char *path); /** + * Set the engine id, enforce single connection per socket + * + * @param path + * The vhost-user socket file path + * @param eid + * Engine id + * @return + * 0 on success, -1 on failure + */ +int __rte_experimental +rte_vhost_driver_set_vdpa_eid(const char *path, int eid); + +/** + * Set the device id, enforce single connection per socket + * + * @param path + * The vhost-user socket file path + * @param did + * Device id + * @return + * 0 on success, -1 on failure + */ +int __rte_experimental +rte_vhost_driver_set_vdpa_did(const char *path, int did); + +/** + * Get the engine id + * + * @param path + * The vhost-user socket file path + * @return + * Engine id, -1 on failure + */ +int __rte_experimental +rte_vhost_driver_get_vdpa_eid(const char *path); + +/** + * Get the device id + * + * @param path + * The vhost-user socket file path + * @return + * Device id, -1 on failure + */ +int __rte_experimental +rte_vhost_driver_get_vdpa_did(const char *path); + +/** * Set the feature bits the vhost-user driver supports. * * @param path @@ -464,6 +512,28 @@ int rte_vhost_vring_call(int vid, uint16_t vring_idx); */ uint32_t rte_vhost_rx_queue_count(int vid, uint16_t qid); +/** + * Get vdpa engine id for vhost device. + * + * @param vid + * vhost device ID + * @return + * engine id + */ +int __rte_experimental +rte_vhost_get_vdpa_eid(int vid); + +/** + * Get vdpa device id for vhost device. + * + * @param vid + * vhost device ID + * @return + * device id + */ +int __rte_experimental +rte_vhost_get_vdpa_did(int vid); + #ifdef __cplusplus } #endif diff --git a/lib/librte_vhost/rte_vhost_version.map b/lib/librte_vhost/rte_vhost_version.map index 57a3edd01..c505596c5 100644 --- a/lib/librte_vhost/rte_vhost_version.map +++ b/lib/librte_vhost/rte_vhost_version.map @@ -66,4 +66,10 @@ EXPERIMENTAL { rte_vdpa_find_engine_id; rte_vdpa_info_query; rte_vdpa_register_driver; + rte_vhost_driver_set_vdpa_eid; + rte_vhost_driver_set_vdpa_did; + rte_vhost_driver_get_vdpa_eid; + rte_vhost_driver_get_vdpa_did; + rte_vhost_get_vdpa_eid; + rte_vhost_get_vdpa_did; } DPDK_18.02; diff --git a/lib/librte_vhost/socket.c b/lib/librte_vhost/socket.c index cfc31e179..8551eb58c 100644 --- a/lib/librte_vhost/socket.c +++ b/lib/librte_vhost/socket.c @@ -52,6 +52,13 @@ struct vhost_user_socket { uint64_t supported_features; uint64_t features; + /* engine and device id to identify a certain port on a specific + * backend, both are set to -1 for sw. when used, one socket can + * have 1 connection only. + */ + int eid; + int did; + struct vhost_device_ops const *notify_ops; }; @@ -545,6 +552,64 @@ find_vhost_user_socket(const char *path) } int +rte_vhost_driver_set_vdpa_eid(const char *path, int eid) +{ + struct vhost_user_socket *vsocket; + + pthread_mutex_lock(&vhost_user.mutex); + vsocket = find_vhost_user_socket(path); + if (vsocket) + vsocket->eid = eid; + pthread_mutex_unlock(&vhost_user.mutex); + + return vsocket ? 0 : -1; +} + +int +rte_vhost_driver_set_vdpa_did(const char *path, int did) +{ + struct vhost_user_socket *vsocket; + + pthread_mutex_lock(&vhost_user.mutex); + vsocket = find_vhost_user_socket(path); + if (vsocket) + vsocket->did = did; + pthread_mutex_unlock(&vhost_user.mutex); + + return vsocket ? 0 : -1; +} + +int +rte_vhost_driver_get_vdpa_eid(const char *path) +{ + struct vhost_user_socket *vsocket; + int eid = -1; + + pthread_mutex_lock(&vhost_user.mutex); + vsocket = find_vhost_user_socket(path); + if (vsocket) + eid = vsocket->eid; + pthread_mutex_unlock(&vhost_user.mutex); + + return eid; +} + +int +rte_vhost_driver_get_vdpa_did(const char *path) +{ + struct vhost_user_socket *vsocket; + int did = -1; + + pthread_mutex_lock(&vhost_user.mutex); + vsocket = find_vhost_user_socket(path); + if (vsocket) + did = vsocket->did; + pthread_mutex_unlock(&vhost_user.mutex); + + return did; +} + +int rte_vhost_driver_disable_features(const char *path, uint64_t features) { struct vhost_user_socket *vsocket; diff --git a/lib/librte_vhost/vhost.c b/lib/librte_vhost/vhost.c index f6f12a03b..45cf90f99 100644 --- a/lib/librte_vhost/vhost.c +++ b/lib/librte_vhost/vhost.c @@ -283,6 +283,8 @@ vhost_new_device(void) dev->vid = i; dev->flags = VIRTIO_DEV_BUILTIN_VIRTIO_NET; dev->slave_req_fd = -1; + dev->eid = -1; + dev->did = -1; return i; } @@ -311,6 +313,34 @@ vhost_destroy_device(int vid) } void +vhost_set_vdpa_eid(int vid, int eid) +{ + struct virtio_net *dev = get_device(vid); + + if (eid < 0 || eid >= MAX_VDPA_ENGINE_NUM || vdpa_engines[eid] == NULL) + return; + + if (dev == NULL) + return; + + dev->eid = eid; +} + +void +vhost_set_vdpa_did(int vid, int did) +{ + struct virtio_net *dev = get_device(vid); + + if (did < 0) + return; + + if (dev == NULL) + return; + + dev->did = did; +} + +void vhost_set_ifname(int vid, const char *if_name, unsigned int if_len) { struct virtio_net *dev; @@ -614,3 +644,23 @@ rte_vhost_rx_queue_count(int vid, uint16_t qid) return *((volatile uint16_t *)&vq->avail->idx) - vq->last_avail_idx; } + +int rte_vhost_get_vdpa_eid(int vid) +{ + struct virtio_net *dev = get_device(vid); + + if (dev == NULL) + return -1; + + return dev->eid; +} + +int rte_vhost_get_vdpa_did(int vid) +{ + struct virtio_net *dev = get_device(vid); + + if (dev == NULL) + return -1; + + return dev->did; +} diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h index 2e28e4026..e06d789fa 100644 --- a/lib/librte_vhost/vhost.h +++ b/lib/librte_vhost/vhost.h @@ -19,6 +19,7 @@ #include #include "rte_vhost.h" +#include "rte_vdpa.h" /* Used to indicate that the device is running on a data core */ #define VIRTIO_DEV_RUNNING 1 @@ -239,6 +240,12 @@ struct virtio_net { struct guest_page *guest_pages; int slave_req_fd; + + /* engine and device id to identify a certain port on a specific + * backend, both are set to -1 for sw. + */ + int eid; + int did; } __rte_cache_aligned; @@ -365,6 +372,9 @@ void free_vq(struct vhost_virtqueue *vq); int alloc_vring_queue(struct virtio_net *dev, uint32_t vring_idx); +void vhost_set_vdpa_eid(int vid, int eid); +void vhost_set_vdpa_did(int vid, int did); + void vhost_set_ifname(int, const char *if_name, unsigned int if_len); void vhost_enable_dequeue_zero_copy(int vid); void vhost_set_builtin_virtio_net(int vid, bool enable);