Commit 6bd4a6d4 authored by Paolo Bonzini's avatar Paolo Bonzini
Browse files

tests/libqos: support multiqueue for virtio-net



Initialize the additional virtqueues if they are supported.
This is needed to switch vhost-user-test's multiqueue test
to the virtio-net qgraph.

Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 6ae333f9
Loading
Loading
Loading
Loading
+17 −4
Original line number Diff line number Diff line
@@ -27,14 +27,19 @@ static QGuestAllocator *alloc;

static void virtio_net_cleanup(QVirtioNet *interface)
{
    qvirtqueue_cleanup(interface->vdev->bus, interface->rx, alloc);
    qvirtqueue_cleanup(interface->vdev->bus, interface->tx, alloc);
    int i;

    for (i = 0; i < interface->n_queues; i++) {
        qvirtqueue_cleanup(interface->vdev->bus, interface->queues[i], alloc);
    }
    g_free(interface->queues);
}

static void virtio_net_setup(QVirtioNet *interface)
{
    QVirtioDevice *vdev = interface->vdev;
    uint64_t features;
    int i;

    features = qvirtio_get_features(vdev);
    features &= ~(QVIRTIO_F_BAD_FEATURE |
@@ -42,8 +47,16 @@ static void virtio_net_setup(QVirtioNet *interface)
                  (1u << VIRTIO_RING_F_EVENT_IDX));
    qvirtio_set_features(vdev, features);

    interface->rx = qvirtqueue_setup(vdev, alloc, 0);
    interface->tx = qvirtqueue_setup(vdev, alloc, 1);
    if (features & (1u << VIRTIO_NET_F_MQ)) {
        interface->n_queues = qvirtio_config_readw(vdev, 8) * 2;
    } else {
        interface->n_queues = 2;
    }

    interface->queues = g_new(QVirtQueue *, interface->n_queues);
    for (i = 0; i < interface->n_queues; i++) {
        interface->queues[i] = qvirtqueue_setup(vdev, alloc, i);
    }
    qvirtio_set_driver_ok(vdev);
}

+2 −2
Original line number Diff line number Diff line
@@ -26,8 +26,8 @@ typedef struct QVirtioNetDevice QVirtioNetDevice;

struct QVirtioNet {
    QVirtioDevice *vdev;
    QVirtQueue *rx;
    QVirtQueue *tx;
    int n_queues;
    QVirtQueue **queues;
};

struct QVirtioNetPCI {
+3 −3
Original line number Diff line number Diff line
@@ -136,8 +136,8 @@ static void send_recv_test(void *obj, void *data, QGuestAllocator *t_alloc)
{
    QVirtioNet *net_if = obj;
    QVirtioDevice *dev = net_if->vdev;
    QVirtQueue *rx = net_if->rx;
    QVirtQueue *tx = net_if->tx;
    QVirtQueue *rx = net_if->queues[0];
    QVirtQueue *tx = net_if->queues[1];
    int *sv = data;

    rx_test(dev, t_alloc, rx, sv[0]);
@@ -148,7 +148,7 @@ static void stop_cont_test(void *obj, void *data, QGuestAllocator *t_alloc)
{
    QVirtioNet *net_if = obj;
    QVirtioDevice *dev = net_if->vdev;
    QVirtQueue *rx = net_if->rx;
    QVirtQueue *rx = net_if->queues[0];
    int *sv = data;

    rx_stop_cont_test(dev, t_alloc, rx, sv[0]);