[v2] examples/vhost: workaround qemu abort

Message ID 20180725095654.66498-1-yong.liu@intel.com (mailing list archive)
State Superseded, archived
Headers
Series [v2] examples/vhost: workaround qemu abort |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Marvin Liu July 25, 2018, 9:56 a.m. UTC
  Current qemu vhost net ring start has a dependency on feature bit
VHOST_USER_F_PROTOCOL_FEATURES. If vhost device start without it, stop
action will be skipped. Consequently, same ioevent fd will be added
twice after reloading driver and then cause qemu abort. However, ring
should be initialized in an enabled state when this feature bit not
negotiated. Work around qemu issue by enabling this feature bit in vhost
user backend.

Signed-off-by: Marvin Liu <yong.liu@intel.com>
  

Comments

Tiwei Bie July 25, 2018, 2:18 a.m. UTC | #1
On Wed, Jul 25, 2018 at 05:56:54PM +0800, Marvin Liu wrote:
> Current qemu vhost net ring start has a dependency on feature bit
> VHOST_USER_F_PROTOCOL_FEATURES. If vhost device start without it, stop
> action will be skipped. Consequently, same ioevent fd will be added
> twice after reloading driver and then cause qemu abort. However, ring
> should be initialized in an enabled state when this feature bit not
> negotiated. Work around qemu issue by enabling this feature bit in vhost
> user backend.
> 
> Signed-off-by: Marvin Liu <yong.liu@intel.com>
> 
> diff --git a/examples/vhost/main.c b/examples/vhost/main.c
> index 2175c1186..4b87331fc 100644
> --- a/examples/vhost/main.c
> +++ b/examples/vhost/main.c
> @@ -1519,8 +1519,12 @@ main(int argc, char *argv[])
>  				"vhost driver register failure.\n");
>  		}
>  
> -		if (builtin_net_driver)
> +		if (builtin_net_driver) {
>  			rte_vhost_driver_set_features(file, VIRTIO_NET_FEATURES);
> +			/* Workaround for qemu vhost net device startup */
> +			rte_vhost_driver_set_features(file,
> +				1ULL << VHOST_USER_F_PROTOCOL_FEATURES);

rte_vhost_driver_set_features() will overwrite the
existing value. You need to OR VIRTIO_NET_FEATURES
and (1ULL << VHOST_USER_F_PROTOCOL_FEATURES).



> +		}
>  
>  		if (mergeable == 0) {
>  			rte_vhost_driver_disable_features(file,
> -- 
> 2.17.0
>
  
Marvin Liu July 25, 2018, 2:42 a.m. UTC | #2
> -----Original Message-----
> From: Bie, Tiwei
> Sent: Wednesday, July 25, 2018 10:19 AM
> To: Liu, Yong <yong.liu@intel.com>
> Cc: dev@dpdk.org
> Subject: Re: [PATCH v2] examples/vhost: workaround qemu abort
> 
> On Wed, Jul 25, 2018 at 05:56:54PM +0800, Marvin Liu wrote:
> > Current qemu vhost net ring start has a dependency on feature bit
> > VHOST_USER_F_PROTOCOL_FEATURES. If vhost device start without it, stop
> > action will be skipped. Consequently, same ioevent fd will be added
> > twice after reloading driver and then cause qemu abort. However, ring
> > should be initialized in an enabled state when this feature bit not
> > negotiated. Work around qemu issue by enabling this feature bit in vhost
> > user backend.
> >
> > Signed-off-by: Marvin Liu <yong.liu@intel.com>
> >
> > diff --git a/examples/vhost/main.c b/examples/vhost/main.c
> > index 2175c1186..4b87331fc 100644
> > --- a/examples/vhost/main.c
> > +++ b/examples/vhost/main.c
> > @@ -1519,8 +1519,12 @@ main(int argc, char *argv[])
> >  				"vhost driver register failure.\n");
> >  		}
> >
> > -		if (builtin_net_driver)
> > +		if (builtin_net_driver) {
> >  			rte_vhost_driver_set_features(file, VIRTIO_NET_FEATURES);
> > +			/* Workaround for qemu vhost net device startup */
> > +			rte_vhost_driver_set_features(file,
> > +				1ULL << VHOST_USER_F_PROTOCOL_FEATURES);
> 
> rte_vhost_driver_set_features() will overwrite the
> existing value. You need to OR VIRTIO_NET_FEATURES
> and (1ULL << VHOST_USER_F_PROTOCOL_FEATURES).
> 
> 

Tiwei,
Thanks for point out the error, I have sent v3 for correcting this.

Regards,
Marvin
> 
> > +		}
> >
> >  		if (mergeable == 0) {
> >  			rte_vhost_driver_disable_features(file,
> > --
> > 2.17.0
> >
  

Patch

diff --git a/examples/vhost/main.c b/examples/vhost/main.c
index 2175c1186..4b87331fc 100644
--- a/examples/vhost/main.c
+++ b/examples/vhost/main.c
@@ -1519,8 +1519,12 @@  main(int argc, char *argv[])
 				"vhost driver register failure.\n");
 		}
 
-		if (builtin_net_driver)
+		if (builtin_net_driver) {
 			rte_vhost_driver_set_features(file, VIRTIO_NET_FEATURES);
+			/* Workaround for qemu vhost net device startup */
+			rte_vhost_driver_set_features(file,
+				1ULL << VHOST_USER_F_PROTOCOL_FEATURES);
+		}
 
 		if (mergeable == 0) {
 			rte_vhost_driver_disable_features(file,