All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Jason Wang <jasowang@redhat.com>
Cc: linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org
Subject: Re: [PATCH V3 2/2] virtio-net: sanitize buggy features advertised by host
Date: Mon, 17 Nov 2014 12:08:38 +0200	[thread overview]
Message-ID: <20141117100838.GD20133@redhat.com> (raw)
In-Reply-To: <1416215838-21700-2-git-send-email-jasowang@redhat.com>

On Mon, Nov 17, 2014 at 05:17:18PM +0800, Jason Wang wrote:
> This patch tries to detect the possible buggy features advertised by host
> and sanitize them. One example is booting virtio-net with only ctrl_vq
> disabled, qemu may still advertise many features which depends on it. This
> will trigger several BUG()s in virtnet_send_command().
> 
> This patch utilizes the sanitize_features() method, and disables all
> features that depends on ctrl_vq if it was not advertised.
> 
> This fixes the crash when booting with ctrl_vq=off using qemu.
> 
> Cc: Rusty Russell <rusty@rustcorp.com.au>
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Cc: Cornelia Huck <cornelia.huck@de.ibm.com>
> Cc: Wanlong Gao <gaowanlong@cn.fujitsu.com>
> Signed-off-by: Jason Wang <jasowang@redhat.com>


So I'm not sure this is useful.
The spec says:
	The device MUST NOT offer a feature which requires another feature which
	was not offered.
So this is a buggy hypervisor, and I believe we should just fail probe.
This can be done without crashing, and is generally a better
idea that second-guessing what hypervisor wants us to do.





However, assuming that we do want this change:
This can be replaced with a table driven design in virtio core, but
since you chose to open code it, I would drop table below altogether.


Just make it
	if (!virtio_has_feature(dev, VIRTIO_NET_F_CTRL_VQ)) {
		virtio_disable_feature(dev, VIRTIO_NET_F_CTRL_RX);
		virtio_disable_feature(dev, VIRTIO_NET_F_CTRL_VLAN);
		virtio_disable_feature(dev, VIRTIO_NET_F_GUEST_ANNOUNCE);
		virtio_disable_feature(dev, VIRTIO_NET_F_MQ);
		virtio_disable_feature(dev, VIRTIO_NET_F_CTRL_MAC_ADDR);
	}




> ---
> Changes from V1:
> - fix the cut-and-paste error
> Changes from V2:
> - loop through an array of feature bits
> - switch to use dev_warn()
> ---
>  drivers/net/virtio_net.c | 26 ++++++++++++++++++++++++++
>  1 file changed, 26 insertions(+)
> 
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index ec2a8b4..6fadd8c 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -1948,6 +1948,31 @@ static int virtnet_restore(struct virtio_device *vdev)
>  }
>  #endif
>  
> +static void virtnet_sanitize_features(struct virtio_device *dev)
> +{
> +	unsigned int features_for_ctrl_vq[] = {
> +		VIRTIO_NET_F_CTRL_RX,
> +		VIRTIO_NET_F_CTRL_VLAN,
> +		VIRTIO_NET_F_GUEST_ANNOUNCE,
> +		VIRTIO_NET_F_MQ,
> +		VIRTIO_NET_F_CTRL_MAC_ADDR
> +	};

This is not the only dependency: checksums
have dependencies too. See virtio 1.0 spec.



> +	int i;
> +
> +	if (!virtio_has_feature(dev, VIRTIO_NET_F_CTRL_VQ)) {
> +		for (i = 0; i < ARRAY_SIZE(features_for_ctrl_vq); i++) {
> +			unsigned int f = features_for_ctrl_vq[i];
> +			if (virtio_has_feature(dev, f)) {
> +				virtio_disable_feature(dev, f);
> +				dev_warn(&dev->dev,
> +					 "buggy hyperviser: disable feature "
> +					 "0x%x since VIRTIO_NET_F_CTRL_VQ was "
> +					 "not advertised.\n", f);
> +			}
> +		}
> +	}
> +}
> +
>  static struct virtio_device_id id_table[] = {
>  	{ VIRTIO_ID_NET, VIRTIO_DEV_ANY_ID },
>  	{ 0 },
> @@ -1975,6 +2000,7 @@ static struct virtio_driver virtio_net_driver = {
>  	.probe =	virtnet_probe,
>  	.remove =	virtnet_remove,
>  	.config_changed = virtnet_config_changed,
> +	.sanitize_features = virtnet_sanitize_features,
>  #ifdef CONFIG_PM_SLEEP
>  	.freeze =	virtnet_freeze,
>  	.restore =	virtnet_restore,
> -- 
> 1.9.1

WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Jason Wang <jasowang@redhat.com>
Cc: rusty@rustcorp.com.au, virtualization@lists.linux-foundation.org,
	linux-kernel@vger.kernel.org,
	Cornelia Huck <cornelia.huck@de.ibm.com>,
	Wanlong Gao <gaowanlong@cn.fujitsu.com>
Subject: Re: [PATCH V3 2/2] virtio-net: sanitize buggy features advertised by host
Date: Mon, 17 Nov 2014 12:08:38 +0200	[thread overview]
Message-ID: <20141117100838.GD20133@redhat.com> (raw)
In-Reply-To: <1416215838-21700-2-git-send-email-jasowang@redhat.com>

On Mon, Nov 17, 2014 at 05:17:18PM +0800, Jason Wang wrote:
> This patch tries to detect the possible buggy features advertised by host
> and sanitize them. One example is booting virtio-net with only ctrl_vq
> disabled, qemu may still advertise many features which depends on it. This
> will trigger several BUG()s in virtnet_send_command().
> 
> This patch utilizes the sanitize_features() method, and disables all
> features that depends on ctrl_vq if it was not advertised.
> 
> This fixes the crash when booting with ctrl_vq=off using qemu.
> 
> Cc: Rusty Russell <rusty@rustcorp.com.au>
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Cc: Cornelia Huck <cornelia.huck@de.ibm.com>
> Cc: Wanlong Gao <gaowanlong@cn.fujitsu.com>
> Signed-off-by: Jason Wang <jasowang@redhat.com>


So I'm not sure this is useful.
The spec says:
	The device MUST NOT offer a feature which requires another feature which
	was not offered.
So this is a buggy hypervisor, and I believe we should just fail probe.
This can be done without crashing, and is generally a better
idea that second-guessing what hypervisor wants us to do.





However, assuming that we do want this change:
This can be replaced with a table driven design in virtio core, but
since you chose to open code it, I would drop table below altogether.


Just make it
	if (!virtio_has_feature(dev, VIRTIO_NET_F_CTRL_VQ)) {
		virtio_disable_feature(dev, VIRTIO_NET_F_CTRL_RX);
		virtio_disable_feature(dev, VIRTIO_NET_F_CTRL_VLAN);
		virtio_disable_feature(dev, VIRTIO_NET_F_GUEST_ANNOUNCE);
		virtio_disable_feature(dev, VIRTIO_NET_F_MQ);
		virtio_disable_feature(dev, VIRTIO_NET_F_CTRL_MAC_ADDR);
	}




> ---
> Changes from V1:
> - fix the cut-and-paste error
> Changes from V2:
> - loop through an array of feature bits
> - switch to use dev_warn()
> ---
>  drivers/net/virtio_net.c | 26 ++++++++++++++++++++++++++
>  1 file changed, 26 insertions(+)
> 
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index ec2a8b4..6fadd8c 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -1948,6 +1948,31 @@ static int virtnet_restore(struct virtio_device *vdev)
>  }
>  #endif
>  
> +static void virtnet_sanitize_features(struct virtio_device *dev)
> +{
> +	unsigned int features_for_ctrl_vq[] = {
> +		VIRTIO_NET_F_CTRL_RX,
> +		VIRTIO_NET_F_CTRL_VLAN,
> +		VIRTIO_NET_F_GUEST_ANNOUNCE,
> +		VIRTIO_NET_F_MQ,
> +		VIRTIO_NET_F_CTRL_MAC_ADDR
> +	};

This is not the only dependency: checksums
have dependencies too. See virtio 1.0 spec.



> +	int i;
> +
> +	if (!virtio_has_feature(dev, VIRTIO_NET_F_CTRL_VQ)) {
> +		for (i = 0; i < ARRAY_SIZE(features_for_ctrl_vq); i++) {
> +			unsigned int f = features_for_ctrl_vq[i];
> +			if (virtio_has_feature(dev, f)) {
> +				virtio_disable_feature(dev, f);
> +				dev_warn(&dev->dev,
> +					 "buggy hyperviser: disable feature "
> +					 "0x%x since VIRTIO_NET_F_CTRL_VQ was "
> +					 "not advertised.\n", f);
> +			}
> +		}
> +	}
> +}
> +
>  static struct virtio_device_id id_table[] = {
>  	{ VIRTIO_ID_NET, VIRTIO_DEV_ANY_ID },
>  	{ 0 },
> @@ -1975,6 +2000,7 @@ static struct virtio_driver virtio_net_driver = {
>  	.probe =	virtnet_probe,
>  	.remove =	virtnet_remove,
>  	.config_changed = virtnet_config_changed,
> +	.sanitize_features = virtnet_sanitize_features,
>  #ifdef CONFIG_PM_SLEEP
>  	.freeze =	virtnet_freeze,
>  	.restore =	virtnet_restore,
> -- 
> 1.9.1

  reply	other threads:[~2014-11-17 10:08 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-17  9:17 [PATCH V3 1/2] virtio: introduce methods of sanitizing device features Jason Wang
2014-11-17  9:17 ` Jason Wang
2014-11-17  9:17 ` [PATCH V3 2/2] virtio-net: sanitize buggy features advertised by host Jason Wang
2014-11-17  9:17   ` Jason Wang
2014-11-17 10:08   ` Michael S. Tsirkin [this message]
2014-11-17 10:08     ` Michael S. Tsirkin
2014-11-18  3:03     ` Jason Wang
2014-11-18  3:03       ` Jason Wang
2014-11-18 11:02       ` Michael S. Tsirkin
2014-11-18 11:02         ` Michael S. Tsirkin
2014-11-17  9:37 ` [PATCH V3 1/2] virtio: introduce methods of sanitizing device features Michael S. Tsirkin
2014-11-17  9:37   ` Michael S. Tsirkin
2014-11-17  9:44   ` Cornelia Huck
2014-11-17  9:44     ` Cornelia Huck
2014-11-17 10:11     ` Michael S. Tsirkin
2014-11-17 10:11       ` Michael S. Tsirkin
2014-11-17 10:20       ` Cornelia Huck
2014-11-17 10:20         ` Cornelia Huck
2014-11-17 10:28         ` Michael S. Tsirkin
2014-11-17 10:28           ` Michael S. Tsirkin
2014-11-17 11:20           ` Cornelia Huck
2014-11-17 11:20             ` Cornelia Huck
2014-11-18  3:23       ` Jason Wang
2014-11-18  3:23         ` Jason Wang
2014-11-18 11:04         ` Michael S. Tsirkin
2014-11-18 11:04           ` Michael S. Tsirkin
2014-11-19  3:00           ` Jason Wang
2014-11-19  3:00             ` Jason Wang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20141117100838.GD20133@redhat.com \
    --to=mst@redhat.com \
    --cc=jasowang@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=virtualization@lists.linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.