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.
Unified · Split
| @@ -3432,29 +3432,6 @@ static unsigned int mergeable_min_buf_len(struct virtnet_info *vi, struct virtqu · 3431 unmodified lines | ||
| 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; |
| @@ -3462,7 +3439,6 @@ static int virtnet_find_vqs(struct virtnet_info *vi) · 1 unmodified line | ||
| 3462 | 3439 | int ret = -ENOMEM; |
| 3463 | 3440 | int i, total_vqs; |
| 3464 | 3441 | const char **names; |
| 3465 | − u32 *sizes; | |
| 3466 | 3442 | bool *ctx; |
| 3467 | 3443 | |
| 3468 | 3444 | /* 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 | 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 | 3469 | /* Parameters for control virtqueue, if any */ |
| 3498 | 3470 | if (vi->has_cvq) { |
| 3499 | 3471 | callbacks[total_vqs - 1] = NULL; |
| 3500 | 3472 | names[total_vqs - 1] = "control"; |
| 3501 | − sizes[total_vqs - 1] = 64; | |
| 3502 | 3473 | } |
| 3503 | 3474 | |
| 3504 | 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 | 3484 | ctx[rxq2vq(i)] = true; |
| 3514 | 3485 | } |
| 3515 | 3486 | |
| 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); | |
| 3520 | 3489 | if (ret) |
| 3521 | 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 | |
| 3538 | 3507 | err_find: |
| 3539 | − kfree(sizes); | |
| 3540 | −err_sizes: | |
| 3541 | 3508 | kfree(ctx); |
| 3542 | 3509 | err_ctx: |
| 3543 | 3510 | kfree(names); |
| @@ -3897,9 +3864,6 @@ static int virtnet_probe(struct virtio_device *vdev) · 353 unmodified lines | ||
| 3897 | 3864 | vi->curr_queue_pairs = num_online_cpus(); |
| 3898 | 3865 | vi->max_queue_pairs = max_queue_pairs; |
| 3899 | 3866 | |
| 3900 | − virtnet_init_settings(dev); | |
| 3901 | − virtnet_update_settings(vi); | |
| 3902 | − | |
| 3903 | 3867 | /* Allocate/initialize the rx/tx queues, and invoke find_vqs */ |
| 3904 | 3868 | err = init_vqs(vi); |
| 3905 | 3869 | if (err) |
| @@ -3912,6 +3876,8 @@ static int virtnet_probe(struct virtio_device *vdev) · 6 unmodified lines | ||
| 3912 | 3876 | netif_set_real_num_tx_queues(dev, vi->curr_queue_pairs); |
| 3913 | 3877 | netif_set_real_num_rx_queues(dev, vi->curr_queue_pairs); |
| 3914 | 3878 | |
| 3879 | + virtnet_init_settings(dev); | |
| 3880 | + | |
| 3915 | 3881 | if (virtio_has_feature(vdev, VIRTIO_NET_F_STANDBY)) { |
| 3916 | 3882 | vi->failover = net_failover_create(vi->dev); |
| 3917 | 3883 | if (IS_ERR(vi->failover)) { |