mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 15:53:54 -06:00
virtio-snd: rewrite invalid tx/rx message handling
The current handling of invalid virtqueue elements inside the TX/RX virt queue handlers is wrong. They are added in a per-stream invalid queue to be processed after the handler is done examining each message, but the invalid message might not be specifying any stream_id; which means it's invalid to add it to any stream->invalid queue since stream could be NULL at this point. This commit moves the invalid queue to the VirtIOSound struct which guarantees there will always be a valid temporary place to store them inside the tx/rx handlers. The queue will be emptied before the handler returns, so the queue must be empty at any other point of the device's lifetime. Signed-off-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org> Message-Id: <virtio-snd-rewrite-invalid-tx-rx-message-handling-v1.manos.pitsidianakis@linaro.org> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
a45f09935c
commit
731655f87f
2 changed files with 77 additions and 76 deletions
|
@ -151,7 +151,6 @@ struct VirtIOSoundPCMStream {
|
|||
QemuMutex queue_mutex;
|
||||
bool active;
|
||||
QSIMPLEQ_HEAD(, VirtIOSoundPCMBuffer) queue;
|
||||
QSIMPLEQ_HEAD(, VirtIOSoundPCMBuffer) invalid;
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -223,6 +222,21 @@ struct VirtIOSound {
|
|||
QemuMutex cmdq_mutex;
|
||||
QTAILQ_HEAD(, virtio_snd_ctrl_command) cmdq;
|
||||
bool processing_cmdq;
|
||||
/*
|
||||
* Convenience queue to keep track of invalid tx/rx queue messages inside
|
||||
* the tx/rx callbacks.
|
||||
*
|
||||
* In the callbacks as a first step we are emptying the virtqueue to handle
|
||||
* each message and we cannot add an invalid message back to the queue: we
|
||||
* would re-process it in subsequent loop iterations.
|
||||
*
|
||||
* Instead, we add them to this queue and after finishing examining every
|
||||
* virtqueue element, we inform the guest for each invalid message.
|
||||
*
|
||||
* This queue must be empty at all times except for inside the tx/rx
|
||||
* callbacks.
|
||||
*/
|
||||
QSIMPLEQ_HEAD(, VirtIOSoundPCMBuffer) invalid;
|
||||
};
|
||||
|
||||
struct virtio_snd_ctrl_command {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue