mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 18:21:24 +02:00
ALSA: xen-front: Reset event channel state on stream clear
xen_snd_front_evtchnl_pair_clear() resets evt_next_id for both
channels. That is correct for the request channel, where evt_next_id is
used to allocate the next request id. It is wrong for the event channel:
incoming events are validated against evt_id, and evt_id is incremented
by evtchnl_interrupt_evt().
This leaves the expected event id from the previous stream instance. A
backend that restarts event ids for a reopened stream can then have valid
current-position events dropped until the stale frontend id catches up.
Reset evt_id for the event channel. Also advance the event-page consumer
to the current producer while clearing the stream, so obsolete events
queued for the previous stream instance are not delivered to the next
ALSA runtime.
Fixes: 1cee559351 ("ALSA: xen-front: Implement ALSA virtual sound driver")
Signed-off-by: Cássio Gabriel <cassiogabrielcontato@gmail.com>
Link: https://patch.msgid.link/20260526-alsa-xen-event-channel-fixes-v1-1-91d3a6a50778@gmail.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
a238120042
commit
9cd8115237
|
|
@ -456,7 +456,11 @@ void xen_snd_front_evtchnl_pair_clear(struct xen_snd_front_evtchnl_pair *evt_pai
|
|||
}
|
||||
|
||||
scoped_guard(mutex, &evt_pair->evt.ring_io_lock) {
|
||||
evt_pair->evt.evt_next_id = 0;
|
||||
evt_pair->evt.evt_id = 0;
|
||||
/* Drop obsolete events queued for the previous stream instance. */
|
||||
evt_pair->evt.u.evt.page->in_cons =
|
||||
evt_pair->evt.u.evt.page->in_prod;
|
||||
/* Ensure the consumer index is visible before stream reuse. */
|
||||
virt_wmb();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -37,9 +37,9 @@ struct xen_snd_front_evtchnl {
|
|||
/* State of the event channel. */
|
||||
enum xen_snd_front_evtchnl_state state;
|
||||
enum xen_snd_front_evtchnl_type type;
|
||||
/* Either response id or incoming event id. */
|
||||
/* Current response id or next expected incoming event id. */
|
||||
u16 evt_id;
|
||||
/* Next request id or next expected event id. */
|
||||
/* Next request id. */
|
||||
u16 evt_next_id;
|
||||
/* Shared ring access lock. */
|
||||
struct mutex ring_io_lock;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user