RE: [EXTERNAL] Re: [PATCH v2 net-next] virtio_net: Improve RSS key size validation and use NETDEV_RSS_KEY_LEN
From: Srujana Challa <schalla@marvell.com>
Date: 2026-02-11 07:22:41
Also in:
virtualization
On Fri, Feb 06, 2026 at 05:31:54PM +0530, Srujana Challa wrote:quoted
Replace hardcoded RSS max key size limit with NETDEV_RSS_KEY_LEN to align with kernel's standard RSS key length. Add validation for RSS key size against spec minimum (40 bytes) and driver maximum. When validation fails, gracefully disable RSS features and continue initialization rather than failing completely. Signed-off-by: Srujana Challa <schalla@marvell.com>I'd CC stable on this actually. failing when device is more capable was a bad idea. can you add a Fixes: tag, too? Thanks!
Sure.
quoted
--- drivers/net/virtio_net.c | 62 +++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 26 deletions(-)diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c indexdb88dcaefb20..1fa4197dffc3 100644--- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c@@ -381,7 +381,8 @@ struct receive_queue { struct xdp_buff **xsk_buffs; }; -#define VIRTIO_NET_RSS_MAX_KEY_SIZE 40 +#define VIRTIO_NET_RSS_MAX_KEY_SIZE NETDEV_RSS_KEY_LEN +#define VIRTIO_NET_RSS_MIN_KEY_SIZE 40 /* Control VQ buffers: protected by the rtnl lock */ structcontrol_buf { @@ -6823,38 +6824,47 @@ static int virtnet_probe(struct virtio_device *vdev) if (virtio_has_feature(vdev, VIRTIO_NET_F_HASH_REPORT)) vi->has_rss_hash_report = true; - if (virtio_has_feature(vdev, VIRTIO_NET_F_RSS)) { + if (virtio_has_feature(vdev, VIRTIO_NET_F_RSS)) vi->has_rss = true; - vi->rss_indir_table_size = - virtio_cread16(vdev, offsetof(struct virtio_net_config, - rss_max_indirection_table_length)); - } - vi->rss_hdr = devm_kzalloc(&vdev->dev, virtnet_rss_hdr_size(vi),GFP_KERNEL);quoted
- if (!vi->rss_hdr) { - err = -ENOMEM; - goto free; - } - if (vi->has_rss || vi->has_rss_hash_report) { vi->rss_key_size = virtio_cread8(vdev, offsetof(struct virtio_net_config,rss_max_key_size));quoted
- if (vi->rss_key_size > VIRTIO_NET_RSS_MAX_KEY_SIZE) { - dev_err(&vdev->dev, "rss_max_key_size=%u exceedsthe limit %u.\n",quoted
- vi->rss_key_size,VIRTIO_NET_RSS_MAX_KEY_SIZE);quoted
- err = -EINVAL; - goto free; - } - vi->rss_hash_types_supported = - virtio_cread32(vdev, offsetof(struct virtio_net_config,supported_hash_types));quoted
- vi->rss_hash_types_supported &= - ~(VIRTIO_NET_RSS_HASH_TYPE_IP_EX | - VIRTIO_NET_RSS_HASH_TYPE_TCP_EX | - VIRTIO_NET_RSS_HASH_TYPE_UDP_EX); + /* Spec requires at least 40 bytes */ + if (vi->rss_key_size < VIRTIO_NET_RSS_MIN_KEY_SIZE) { + dev_warn(&vdev->dev, + "rss_max_key_size=%u is less than specminimum %u, disabling RSS\n",quoted
+ vi->rss_key_size,VIRTIO_NET_RSS_MIN_KEY_SIZE);quoted
+ vi->has_rss = false; + vi->has_rss_hash_report = false; + } else if (vi->rss_key_size > VIRTIO_NET_RSS_MAX_KEY_SIZE) { + dev_warn(&vdev->dev, + "rss_max_key_size=%u exceeds driver limit%u, disabling RSS\n",quoted
+ vi->rss_key_size,VIRTIO_NET_RSS_MAX_KEY_SIZE);quoted
+ vi->has_rss = false; + vi->has_rss_hash_report = false; + } else { + vi->rss_indir_table_size = + virtio_cread16(vdev, offsetof(structvirtio_net_config,quoted
+rss_max_indirection_table_length));quoted
+ vi->rss_hash_types_supported = + virtio_cread32(vdev, offsetof(structvirtio_net_config,quoted
+supported_hash_types));quoted
+ vi->rss_hash_types_supported &= +~(VIRTIO_NET_RSS_HASH_TYPE_IP_EX |quoted
+VIRTIO_NET_RSS_HASH_TYPE_TCP_EX |quoted
+VIRTIO_NET_RSS_HASH_TYPE_UDP_EX);quoted
+ + dev->hw_features |= NETIF_F_RXHASH; + dev->xdp_metadata_ops =&virtnet_xdp_metadata_ops;quoted
+ } + } - dev->hw_features |= NETIF_F_RXHASH; - dev->xdp_metadata_ops = &virtnet_xdp_metadata_ops; + vi->rss_hdr = devm_kzalloc(&vdev->dev, virtnet_rss_hdr_size(vi),GFP_KERNEL);quoted
+ if (!vi->rss_hdr) { + err = -ENOMEM; + goto free; }I feel these checks belong in virtnet_validate. Then we can disable features e.g. by clearing VIRTIO_NET_F_RSS and host will have some visibility that RSS can't be used.
Sure, will move to virtnet_validate() and clear feature bits. Thanks!
quoted
if (virtio_has_feature(vdev,VIRTIO_NET_F_GUEST_UDP_TUNNEL_GSO) ||quoted
-- 2.25.1