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
34323432 (unsigned int)GOOD_PACKET_LEN);
34333433 }
34343434
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−
34583435 static int virtnet_find_vqs(struct virtnet_info *vi)
34593436 {
34603437 vq_callback_t **callbacks;
@@ -3462,7 +3439,6 @@ static int virtnet_find_vqs(struct virtnet_info *vi) · 1 unmodified line
34623439 int ret = -ENOMEM;
34633440 int i, total_vqs;
34643441 const char **names;
3465− u32 *sizes;
34663442 bool *ctx;
34673443
34683444 /* 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
34903466 ctx = NULL;
34913467 }
34923468
3493− sizes = kmalloc_array(total_vqs, sizeof(*sizes), GFP_KERNEL);
3494− if (!sizes)
3495− goto err_sizes;
3496−
34973469 /* Parameters for control virtqueue, if any */
34983470 if (vi->has_cvq) {
34993471 callbacks[total_vqs - 1] = NULL;
35003472 names[total_vqs - 1] = "control";
3501− sizes[total_vqs - 1] = 64;
35023473 }
35033474
35043475 /* Allocate/initialize parameters for send/receive virtqueues */
@@ -3513,10 +3484,8 @@ static int virtnet_find_vqs(struct virtnet_info *vi) · 8 unmodified lines
35133484 ctx[rxq2vq(i)] = true;
35143485 }
35153486
3516− virtnet_config_sizes(vi, sizes);
3517−
3518− ret = virtio_find_vqs_ctx_size(vi->vdev, total_vqs, vqs, callbacks,
3519− names, sizes, ctx, NULL);
3487+ ret = virtio_find_vqs_ctx(vi->vdev, total_vqs, vqs, callbacks,
3488+ names, ctx, NULL);
35203489 if (ret)
35213490 goto err_find;
35223491
@@ -3536,8 +3505,6 @@ static int virtnet_find_vqs(struct virtnet_info *vi) · 13 unmodified lines
35363505
35373506
35383507 err_find:
3539− kfree(sizes);
3540−err_sizes:
35413508 kfree(ctx);
35423509 err_ctx:
35433510 kfree(names);
@@ -3897,9 +3864,6 @@ static int virtnet_probe(struct virtio_device *vdev) · 353 unmodified lines
38973864 vi->curr_queue_pairs = num_online_cpus();
38983865 vi->max_queue_pairs = max_queue_pairs;
38993866
3900− virtnet_init_settings(dev);
3901− virtnet_update_settings(vi);
3902−
39033867 /* Allocate/initialize the rx/tx queues, and invoke find_vqs */
39043868 err = init_vqs(vi);
39053869 if (err)
@@ -3912,6 +3876,8 @@ static int virtnet_probe(struct virtio_device *vdev) · 6 unmodified lines
39123876 netif_set_real_num_tx_queues(dev, vi->curr_queue_pairs);
39133877 netif_set_real_num_rx_queues(dev, vi->curr_queue_pairs);
39143878
3879+ virtnet_init_settings(dev);
3880+
39153881 if (virtio_has_feature(vdev, VIRTIO_NET_F_STANDBY)) {
39163882 vi->failover = net_failover_create(vi->dev);
39173883 if (IS_ERR(vi->failover)) {