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 | (unsigned int)GOOD_PACKET_LEN); | 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 | static int virtnet_find_vqs(struct virtnet_info *vi) | 3435 | static 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 by | 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 | 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 | ||
| 3538 | err_find: | 3507 | err_find: |
| 3539 | kfree(sizes); | ||
| 3540 | err_sizes: | ||
| 3541 | kfree(ctx); | 3508 | kfree(ctx); |
| 3542 | err_ctx: | 3509 | err_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)) { |