[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] virtio-net: do not start queues that are not en

From: Jason Wang
Subject: Re: [Qemu-devel] [PATCH] virtio-net: do not start queues that are not enabled by the guest
Date: Thu, 21 Feb 2019 17:40:22 +0800
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.4.0

On 2019/2/21 下午4:18, Yuri Benditovich wrote:
For 1.0 device, we can fix the queue_enable, but for 0.9x device how do
you enable one specific queue in this case? (setting status?)

Do I understand correctly that for 0.9 device in some cases the device will
receive feature _MQ set, but will not receive VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET?
Or the problem is different?

Let me clarify, VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET is used to control the the number of queue pairs used by device for doing transmission and reception. It was not used to enable or disable a virtqueue.

For 1.0 device, we should use queue_enable in pci cfg to enable and disable queue:

We could do:

1) allocate memory and set queue_enable for vq0

2) allocate memory and set queue_enable for vq1

3) Set vq paris to 1

4) allocate memory and set queue_enable for vq2

5) allocate memory and set queue_enable for vq3

6) set vq pairs to 2

But this requires a proper implementation for queue_enable for vhost which is missed in qemu and probably what you really want to do.

but for 0.9x device, there's no such way to do this. That's the issue. So driver must allocate all queBes before starting the device, otherwise there's no way to enable it afterwards. There're tricks to make it work like what is done in your patch, but it depends on a specific implementation like qemu which is sub-optimal.

A fundamental question is what prevents you from just initialization all
queues during driver start? It looks to me this save lots of efforts
than allocating queue dynamically.

This is not so trivial in Windows driver, as it does not have objects for queues
that it does not use. Linux driver first of all allocates all the
queues and then
adds Rx/Tx to those it will use. Windows driver first decides how many queues
it will use then allocates objects for them and initializes them from zero to
fully functional state.

Well, you just need to allocate some memory for the virtqueue, there's no need to make it visible to the rest until it was enabled.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]