diff options
author | Laurent Vivier <lvivier@redhat.com> | 2025-07-09 10:24:22 +0200 |
---|---|---|
committer | Jason Wang <jasowang@redhat.com> | 2025-07-14 13:27:09 +0800 |
commit | 33b78a30a3e8e1cf16ef423bf2e78caf3d560985 (patch) | |
tree | 79d9f8d1b33215fe0e64dab503814d39227cd9b8 /hw | |
parent | 1652f1b335fb5bec921c64ff7f378e6732510ca4 (diff) | |
download | qemu-33b78a30a3e8e1cf16ef423bf2e78caf3d560985.zip qemu-33b78a30a3e8e1cf16ef423bf2e78caf3d560985.tar.gz qemu-33b78a30a3e8e1cf16ef423bf2e78caf3d560985.tar.bz2 |
net: Allow network backends to advertise max TX queue size
This commit refactors how the maximum transmit queue size for
virtio-net devices is determined, making the mechanism more generic
and extensible.
Previously, virtio_net_max_tx_queue_size() contained hardcoded
checks for specific network backend types (vhost-user and
vhost-vdpa) to determine their supported maximum queue size. This
created direct dependencies and would require modifications for
every new backend that supports variable queue sizes.
To improve flexibility, a new max_tx_queue_size field is added
to the vhost_net structure. This allows each network backend
to advertise its supported maximum transmit queue size directly.
The virtio_net_max_tx_queue_size() function now retrieves the max
TX queue size from the vhost_net struct, if available and set.
Otherwise, it defaults to VIRTIO_NET_TX_QUEUE_DEFAULT_SIZE.
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
Diffstat (limited to 'hw')
-rw-r--r-- | hw/net/vhost_net.c | 1 | ||||
-rw-r--r-- | hw/net/virtio-net.c | 24 |
2 files changed, 13 insertions, 12 deletions
diff --git a/hw/net/vhost_net.c b/hw/net/vhost_net.c index 976d2b3..74d2e3e 100644 --- a/hw/net/vhost_net.c +++ b/hw/net/vhost_net.c @@ -245,6 +245,7 @@ struct vhost_net *vhost_net_init(VhostNetOptions *options) net->dev.nvqs = options->nvqs; net->feature_bits = options->feature_bits; net->save_acked_features = options->save_acked_features; + net->max_tx_queue_size = options->max_tx_queue_size; net->dev.max_queues = 1; net->dev.vqs = net->vqs; diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index e3400f1..39fc280 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -670,22 +670,22 @@ static void virtio_net_set_mrg_rx_bufs(VirtIONet *n, int mergeable_rx_bufs, static int virtio_net_max_tx_queue_size(VirtIONet *n) { NetClientState *peer = n->nic_conf.peers.ncs[0]; + struct vhost_net *net; - /* - * Backends other than vhost-user or vhost-vdpa don't support max queue - * size. - */ if (!peer) { - return VIRTIO_NET_TX_QUEUE_DEFAULT_SIZE; + goto default_value; } - switch(peer->info->type) { - case NET_CLIENT_DRIVER_VHOST_USER: - case NET_CLIENT_DRIVER_VHOST_VDPA: - return VIRTQUEUE_MAX_SIZE; - default: - return VIRTIO_NET_TX_QUEUE_DEFAULT_SIZE; - }; + net = get_vhost_net(peer); + + if (!net || !net->max_tx_queue_size) { + goto default_value; + } + + return net->max_tx_queue_size; + +default_value: + return VIRTIO_NET_TX_QUEUE_DEFAULT_SIZE; } static int peer_attach(VirtIONet *n, int index) |