Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

virtio_net: Revert "virtio_net: set the default max ring size by find_vqs()"

This reverts commit 762faee5a2678559d3dc09d95f8f2c54cd0466a7.

This has been reported to trip up guests on GCP (Google Cloud).
The reason is that virtio_find_vqs_ctx_size is broken on legacy
devices. We can in theory fix virtio_find_vqs_ctx_size but
in fact the patch itself has several other issues:

- It treats unknown speed as < 10G
- It leaves userspace no way to find out the ring size set by hypervisor
- It tests speed when link is down
- It ignores the virtio spec advice:
Both \field{speed} and \field{duplex} can change, thus the driver
is expected to re-read these values after receiving a
configuration change notification.
- It is not clear the performance impact has been tested properly

Revert the patch for now.

Reported-by: Andres Freund <andres@anarazel.de>
Link: https://lore.kernel.org/r/20220814212610.GA3690074%40roeck-us.net
Link: https://lore.kernel.org/r/20220815070203.plwjx7b3cyugpdt7%40awork3.anarazel.de
Link: https://lore.kernel.org/r/3df6bb82-1951-455d-a768-e9e1513eb667%40www.fastmail.com
Link: https://lore.kernel.org/r/FCDC5DDE-3CDD-4B8A-916F-CA7D87B547CE%40anarazel.de
Fixes: 762faee5a267 ("virtio_net: set the default max ring size by find_vqs()")
Cc: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
Cc: Jason Wang <jasowang@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Tested-by: Andres Freund <andres@anarazel.de>
Tested-by: Guenter Roeck <linux@roeck-us.net>
Message-Id: <20220816053602.173815-2-mst@redhat.com>

+4 -38
+4 -38
drivers/net/virtio_net.c
··· 3432 3432 (unsigned int)GOOD_PACKET_LEN); 3433 3433 } 3434 3434 3435 - static void virtnet_config_sizes(struct virtnet_info *vi, u32 *sizes) 3436 - { 3437 - u32 i, rx_size, tx_size; 3438 - 3439 - if (vi->speed == SPEED_UNKNOWN || vi->speed < SPEED_10000) { 3440 - rx_size = 1024; 3441 - tx_size = 1024; 3442 - 3443 - } else if (vi->speed < SPEED_40000) { 3444 - rx_size = 1024 * 4; 3445 - tx_size = 1024 * 4; 3446 - 3447 - } else { 3448 - rx_size = 1024 * 8; 3449 - tx_size = 1024 * 8; 3450 - } 3451 - 3452 - for (i = 0; i < vi->max_queue_pairs; i++) { 3453 - sizes[rxq2vq(i)] = rx_size; 3454 - sizes[txq2vq(i)] = tx_size; 3455 - } 3456 - } 3457 - 3458 3435 static int virtnet_find_vqs(struct virtnet_info *vi) 3459 3436 { 3460 3437 vq_callback_t **callbacks; ··· 3439 3462 int ret = -ENOMEM; 3440 3463 int i, total_vqs; 3441 3464 const char **names; 3442 - u32 *sizes; 3443 3465 bool *ctx; 3444 3466 3445 3467 /* We expect 1 RX virtqueue followed by 1 TX virtqueue, followed by ··· 3466 3490 ctx = NULL; 3467 3491 } 3468 3492 3469 - sizes = kmalloc_array(total_vqs, sizeof(*sizes), GFP_KERNEL); 3470 - if (!sizes) 3471 - goto err_sizes; 3472 - 3473 3493 /* Parameters for control virtqueue, if any */ 3474 3494 if (vi->has_cvq) { 3475 3495 callbacks[total_vqs - 1] = NULL; 3476 3496 names[total_vqs - 1] = "control"; 3477 - sizes[total_vqs - 1] = 64; 3478 3497 } 3479 3498 3480 3499 /* Allocate/initialize parameters for send/receive virtqueues */ ··· 3484 3513 ctx[rxq2vq(i)] = true; 3485 3514 } 3486 3515 3487 - virtnet_config_sizes(vi, sizes); 3488 - 3489 - ret = virtio_find_vqs_ctx_size(vi->vdev, total_vqs, vqs, callbacks, 3490 - names, sizes, ctx, NULL); 3516 + ret = virtio_find_vqs_ctx(vi->vdev, total_vqs, vqs, callbacks, 3517 + names, ctx, NULL); 3491 3518 if (ret) 3492 3519 goto err_find; 3493 3520 ··· 3505 3536 3506 3537 3507 3538 err_find: 3508 - kfree(sizes); 3509 - err_sizes: 3510 3539 kfree(ctx); 3511 3540 err_ctx: 3512 3541 kfree(names); ··· 3864 3897 vi->curr_queue_pairs = num_online_cpus(); 3865 3898 vi->max_queue_pairs = max_queue_pairs; 3866 3899 3867 - virtnet_init_settings(dev); 3868 - virtnet_update_settings(vi); 3869 - 3870 3900 /* Allocate/initialize the rx/tx queues, and invoke find_vqs */ 3871 3901 err = init_vqs(vi); 3872 3902 if (err) ··· 3875 3911 #endif 3876 3912 netif_set_real_num_tx_queues(dev, vi->curr_queue_pairs); 3877 3913 netif_set_real_num_rx_queues(dev, vi->curr_queue_pairs); 3914 + 3915 + virtnet_init_settings(dev); 3878 3916 3879 3917 if (virtio_has_feature(vdev, VIRTIO_NET_F_STANDBY)) { 3880 3918 vi->failover = net_failover_create(vi->dev);