History

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.

Michael S. Tsirkin committed 4 years ago

Commit 2e9ca761 parent 568035b1 file · +4 −38Browse files

Unified · Split

drivers/net/virtio_net.c+4−38
@@ -3432,29 +3432,6 @@ static unsigned int mergeable_min_buf_len(struct virtnet_info *vi, struct virtqu · 3431 unmodified lines
3432 (unsigned int)GOOD_PACKET_LEN);3432 (unsigned int)GOOD_PACKET_LEN);
3433}3433}
3434 3434
3435static 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
3458static int virtnet_find_vqs(struct virtnet_info *vi)3435static int virtnet_find_vqs(struct virtnet_info *vi)
3459{3436{
3460 vq_callback_t **callbacks;3437 vq_callback_t **callbacks;
@@ -3462,7 +3439,6 @@ static int virtnet_find_vqs(struct virtnet_info *vi) · 1 unmodified line
3462 int ret = -ENOMEM;3439 int ret = -ENOMEM;
3463 int i, total_vqs;3440 int i, total_vqs;
3464 const char **names;3441 const char **names;
3465 u32 *sizes;
3466 bool *ctx;3442 bool *ctx;
3467 3443
3468 /* We expect 1 RX virtqueue followed by 1 TX virtqueue, followed by3444 /* We expect 1 RX virtqueue followed by 1 TX virtqueue, followed by
@@ -3490,15 +3466,10 @@ static int virtnet_find_vqs(struct virtnet_info *vi) · 21 unmodified lines
3490 ctx = NULL;3466 ctx = NULL;
3491 }3467 }
3492 3468
3493 sizes = kmalloc_array(total_vqs, sizeof(*sizes), GFP_KERNEL);
3494 if (!sizes)
3495 goto err_sizes;
3496
3497 /* Parameters for control virtqueue, if any */3469 /* Parameters for control virtqueue, if any */
3498 if (vi->has_cvq) {3470 if (vi->has_cvq) {
3499 callbacks[total_vqs - 1] = NULL;3471 callbacks[total_vqs - 1] = NULL;
3500 names[total_vqs - 1] = "control";3472 names[total_vqs - 1] = "control";
3501 sizes[total_vqs - 1] = 64;
3502 }3473 }
3503 3474
3504 /* Allocate/initialize parameters for send/receive virtqueues */3475 /* Allocate/initialize parameters for send/receive virtqueues */
@@ -3513,10 +3484,8 @@ static int virtnet_find_vqs(struct virtnet_info *vi) · 8 unmodified lines
3513 ctx[rxq2vq(i)] = true;3484 ctx[rxq2vq(i)] = true;
3514 }3485 }
3515 3486
3516 virtnet_config_sizes(vi, sizes);3487 ret = virtio_find_vqs_ctx(vi->vdev, total_vqs, vqs, callbacks,
3517 3488 names, ctx, NULL);
3518 ret = virtio_find_vqs_ctx_size(vi->vdev, total_vqs, vqs, callbacks,
3519 names, sizes, ctx, NULL);
3520 if (ret)3489 if (ret)
3521 goto err_find;3490 goto err_find;
3522 3491
@@ -3536,8 +3505,6 @@ static int virtnet_find_vqs(struct virtnet_info *vi) · 13 unmodified lines
3536 3505
3537 3506
3538err_find:3507err_find:
3539 kfree(sizes);
3540err_sizes:
3541 kfree(ctx);3508 kfree(ctx);
3542err_ctx:3509err_ctx:
3543 kfree(names);3510 kfree(names);
@@ -3897,9 +3864,6 @@ static int virtnet_probe(struct virtio_device *vdev) · 353 unmodified lines
3897 vi->curr_queue_pairs = num_online_cpus();3864 vi->curr_queue_pairs = num_online_cpus();
3898 vi->max_queue_pairs = max_queue_pairs;3865 vi->max_queue_pairs = max_queue_pairs;
3899 3866
3900 virtnet_init_settings(dev);
3901 virtnet_update_settings(vi);
3902
3903 /* Allocate/initialize the rx/tx queues, and invoke find_vqs */3867 /* Allocate/initialize the rx/tx queues, and invoke find_vqs */
3904 err = init_vqs(vi);3868 err = init_vqs(vi);
3905 if (err)3869 if (err)
@@ -3912,6 +3876,8 @@ static int virtnet_probe(struct virtio_device *vdev) · 6 unmodified lines
3912 netif_set_real_num_tx_queues(dev, vi->curr_queue_pairs);3876 netif_set_real_num_tx_queues(dev, vi->curr_queue_pairs);
3913 netif_set_real_num_rx_queues(dev, vi->curr_queue_pairs);3877 netif_set_real_num_rx_queues(dev, vi->curr_queue_pairs);
3914 3878
3879 virtnet_init_settings(dev);
3880
3915 if (virtio_has_feature(vdev, VIRTIO_NET_F_STANDBY)) {3881 if (virtio_has_feature(vdev, VIRTIO_NET_F_STANDBY)) {
3916 vi->failover = net_failover_create(vi->dev);3882 vi->failover = net_failover_create(vi->dev);
3917 if (IS_ERR(vi->failover)) {3883 if (IS_ERR(vi->failover)) {