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

[PATCH 1/2] 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: 1cee559351a7 ("ALSA: xen-front: Implement ALSA virtual sound driver")
Signed-off-by: Cássio Gabriel <cassiogabrielcontato@xxxxxxxxx>
---
 sound/xen/xen_snd_front_evtchnl.c | 8 ++++++--
 sound/xen/xen_snd_front_evtchnl.h | 4 ++--
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/sound/xen/xen_snd_front_evtchnl.c 
b/sound/xen/xen_snd_front_evtchnl.c
index bc03f71bf16e..09e4c1d05636 100644
--- a/sound/xen/xen_snd_front_evtchnl.c
+++ b/sound/xen/xen_snd_front_evtchnl.c
@@ -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();
        }
 }
-
diff --git a/sound/xen/xen_snd_front_evtchnl.h 
b/sound/xen/xen_snd_front_evtchnl.h
index 3675fba70564..8400261ac466 100644
--- a/sound/xen/xen_snd_front_evtchnl.h
+++ b/sound/xen/xen_snd_front_evtchnl.h
@@ -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;

-- 
2.54.0




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.