The ethtool RSS and RXHASH paths update the driver's cached RSS state before committing the change to the device. If the control virtqueue command fails, the cached hash types, key or indirection table can then report a configuration that the device did not accept. Preserve the previous local state around RSS/hash control commands and restore it when the device update fails, while propagating the error to the caller. v1 -> v2: - Use kvmemdup() instead of kmemdup() in virtnet_set_rxfh() for the saved RSS header, since the indirection table can push the header size up to ~128K. Signed-off-by: Xiong Weimin --- drivers/net/virtio_net.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index ccd96315a..995ca4640 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c @@ -5573,8 +5573,8 @@ static int virtnet_set_rxfh(struct net_device *dev, } if (rxfh->indir) { - old_rss_hdr = kmemdup(vi->rss_hdr, virtnet_rss_hdr_size(vi), - GFP_KERNEL); + old_rss_hdr = kvmemdup(vi->rss_hdr, virtnet_rss_hdr_size(vi), + GFP_KERNEL); if (!old_rss_hdr) return -ENOMEM; -- 2.43.0