[dpdk-dev,v3,06/22] vhost: introduce API to fetch negotiated features

Message ID 1490705142-893-7-git-send-email-yuanhan.liu@linux.intel.com (mailing list archive)
State Superseded, archived
Delegated to: Yuanhan Liu
Headers

Checks

Context Check Description
ci/Intel-compilation fail apply patch file failure
ci/checkpatch success coding style OK

Commit Message

Yuanhan Liu March 28, 2017, 12:45 p.m. UTC
  Signed-off-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
---
 lib/librte_vhost/rte_vhost_version.map |  1 +
 lib/librte_vhost/rte_virtio_net.h      | 10 ++++++++++
 lib/librte_vhost/vhost.c               | 12 ++++++++++++
 3 files changed, 23 insertions(+)
  

Comments

Maxime Coquelin March 31, 2017, 7:45 a.m. UTC | #1
On 03/28/2017 02:45 PM, Yuanhan Liu wrote:
> Signed-off-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
> ---
>  lib/librte_vhost/rte_vhost_version.map |  1 +
>  lib/librte_vhost/rte_virtio_net.h      | 10 ++++++++++
>  lib/librte_vhost/vhost.c               | 12 ++++++++++++
>  3 files changed, 23 insertions(+)
>
> diff --git a/lib/librte_vhost/rte_vhost_version.map b/lib/librte_vhost/rte_vhost_version.map
> index 664a5f3..cec1e9e 100644
> --- a/lib/librte_vhost/rte_vhost_version.map
> +++ b/lib/librte_vhost/rte_vhost_version.map
> @@ -37,5 +37,6 @@ DPDK_17.05 {
>  	rte_vhost_driver_set_features;
>  	rte_vhost_get_mem_table;
>  	rte_vhost_get_mtu;
> +	rte_vhost_get_negotiated_features;
>
>  } DPDK_16.07;
> diff --git a/lib/librte_vhost/rte_virtio_net.h b/lib/librte_vhost/rte_virtio_net.h
> index 5a91f97..57e57e3 100644
> --- a/lib/librte_vhost/rte_virtio_net.h
> +++ b/lib/librte_vhost/rte_virtio_net.h
> @@ -154,6 +154,16 @@ struct virtio_net_device_ops {
>   */
>  uint64_t rte_vhost_driver_get_features(const char *path);
>
> +/**
> + * Get the feature bits after negotiation
> + *
> + * @param vid
> + *  Vhost device ID
> + * @return
> + *  Negotiated feature bits on success, 0 on failure
> + */
> +uint64_t rte_vhost_get_negotiated_features(int vid);
> +
>  /* Register callbacks. */
>  int rte_vhost_driver_callback_register(const char *path,
>  	struct virtio_net_device_ops const * const ops);
> diff --git a/lib/librte_vhost/vhost.c b/lib/librte_vhost/vhost.c
> index 2b41652..08dccfb 100644
> --- a/lib/librte_vhost/vhost.c
> +++ b/lib/librte_vhost/vhost.c
> @@ -359,6 +359,18 @@ struct virtio_net *
>  	return 0;
>  }
>
> +uint64_t
> +rte_vhost_get_negotiated_features(int vid)
> +{
> +	struct virtio_net *dev;
> +
> +	dev = get_device(vid);
> +	if (!dev)
> +		return 0;
It's unlikely to happen with net devices, but as this series is about
generalizing the use of this lib, couldn't we have cases where the
negotiated features is 0?

If so, shouldn't be preferable the caller passes features pointer as
argument?

> +
> +	return dev->features;
> +}
> +
>  int
>  rte_vhost_get_mem_table(int vid, struct rte_vhost_memory **mem)
>  {
>

Thanks,
Maxime
  
Yuanhan Liu March 31, 2017, 8:51 a.m. UTC | #2
On Fri, Mar 31, 2017 at 09:45:11AM +0200, Maxime Coquelin wrote:
> >+uint64_t
> >+rte_vhost_get_negotiated_features(int vid)
> >+{
> >+	struct virtio_net *dev;
> >+
> >+	dev = get_device(vid);
> >+	if (!dev)
> >+		return 0;
> It's unlikely to happen with net devices, but as this series is about
> generalizing the use of this lib, couldn't we have cases where the
> negotiated features is 0?

Yes, I think so.

> If so, shouldn't be preferable the caller passes features pointer as
> argument?

I thought of that. The reason I did that is to keep the semantics with
rte_vhost_driver_get_feature(path). But you are right, we don't have
to follow that. More importantly, we may also need change the return
value of rte_vhost_driver_get_features(path): which could also fail
if 'path' is not found.

	--yliu
  

Patch

diff --git a/lib/librte_vhost/rte_vhost_version.map b/lib/librte_vhost/rte_vhost_version.map
index 664a5f3..cec1e9e 100644
--- a/lib/librte_vhost/rte_vhost_version.map
+++ b/lib/librte_vhost/rte_vhost_version.map
@@ -37,5 +37,6 @@  DPDK_17.05 {
 	rte_vhost_driver_set_features;
 	rte_vhost_get_mem_table;
 	rte_vhost_get_mtu;
+	rte_vhost_get_negotiated_features;
 
 } DPDK_16.07;
diff --git a/lib/librte_vhost/rte_virtio_net.h b/lib/librte_vhost/rte_virtio_net.h
index 5a91f97..57e57e3 100644
--- a/lib/librte_vhost/rte_virtio_net.h
+++ b/lib/librte_vhost/rte_virtio_net.h
@@ -154,6 +154,16 @@  struct virtio_net_device_ops {
  */
 uint64_t rte_vhost_driver_get_features(const char *path);
 
+/**
+ * Get the feature bits after negotiation
+ *
+ * @param vid
+ *  Vhost device ID
+ * @return
+ *  Negotiated feature bits on success, 0 on failure
+ */
+uint64_t rte_vhost_get_negotiated_features(int vid);
+
 /* Register callbacks. */
 int rte_vhost_driver_callback_register(const char *path,
 	struct virtio_net_device_ops const * const ops);
diff --git a/lib/librte_vhost/vhost.c b/lib/librte_vhost/vhost.c
index 2b41652..08dccfb 100644
--- a/lib/librte_vhost/vhost.c
+++ b/lib/librte_vhost/vhost.c
@@ -359,6 +359,18 @@  struct virtio_net *
 	return 0;
 }
 
+uint64_t
+rte_vhost_get_negotiated_features(int vid)
+{
+	struct virtio_net *dev;
+
+	dev = get_device(vid);
+	if (!dev)
+		return 0;
+
+	return dev->features;
+}
+
 int
 rte_vhost_get_mem_table(int vid, struct rte_vhost_memory **mem)
 {