Skip to content

Commit 2e9ca76

Browse files
committed
virtio_net: Revert "virtio_net: set the default max ring size by find_vqs()"
This reverts commit 762faee. 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 <[email protected]> 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: 762faee ("virtio_net: set the default max ring size by find_vqs()") Cc: Xuan Zhuo <[email protected]> Cc: Jason Wang <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]> Tested-by: Andres Freund <[email protected]> Tested-by: Guenter Roeck <[email protected]> Message-Id: <[email protected]>
1 parent 568035b commit 2e9ca76

File tree

1 file changed

+4
-38
lines changed

1 file changed

+4
-38
lines changed

drivers/net/virtio_net.c

Lines changed: 4 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3432,37 +3432,13 @@ static unsigned int mergeable_min_buf_len(struct virtnet_info *vi, struct virtqu
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;
34613438
struct virtqueue **vqs;
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)
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)
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)
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)
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)
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)) {

0 commit comments

Comments
 (0)