On Tue, Nov 19, 2019 at 1:28 PM Takashi Iwai tiwai@suse.de wrote:
On Tue, 19 Nov 2019 17:36:46 +0100, Ranjani Sridharan wrote:
On Tue, 2019-11-19 at 09:24 +0100, Takashi Iwai wrote:
On Tue, 19 Nov 2019 08:40:25 +0100, Ranjani Sridharan wrote:
Hi Takashi,
I just realized that In the SOF driver, we only set the component driver ops. The pcm ops are set when creating the new pcm. So, should I also add the sync_stop op in the component driver and set the pcm sync_stop op to point to the component sync_stop op? Just wanted to confirm if I am on the right track.
Yes, I didn't touch this yet, but that's the way to go I suppose. One caveat is that this ops is optional and needs NULL as default, hence you'd need to set only when defined, like copy_user, page or mmap ops, at least.
Hi Takashi,
This is what I tried in the SOF driver: https://github.com/thesofproject/linux/pull/1513/commits
And it seems to cause the system to hang when I stop the stream and I have no meaningful logs to pinpoint to the problem. Could you please have a look at the 4 commits that I have added to your series and let me know what I could be missing?
I couldn't find anything obvious. Could you try without changing snd_sof_pcm_period_elapsed(), i.e. only adding the stuff and calling sync_stop, in order to see whether the additional stuff broke anything?
It is indeed the removal of snd_sof_pcm_period_elapsed() that makes the device hang when the stream is stoppped. But that's a bit surprising given that all I tried was using the snd_pcm_period_elapsed() directly instead of scheduling the delayed work to call it.
If I read the code correctly, this can't work irrelevantly from the sync_stop stuff. The call of period_elapsed is from hda_dsp_stream_check() which is performed in bus->reg_lock spinlock in hda_dsp_stream_threaded_handler(). Meanwhile, the XRUN trigger goes to hda_dsp_pcm_trigger() that follows hda_dsp_stream_trigger(), and this function expects the sleepable context due to snd_sof_dsp_read_poll_timeout() call.
So something like below works?
Takashi
--- a/sound/soc/sof/intel/hda-stream.c +++ b/sound/soc/sof/intel/hda-stream.c @@ -592,8 +592,11 @@ static bool hda_dsp_stream_check(struct hdac_bus *bus, u32 status) continue;
/* Inform ALSA only in case not do that with IPC */
if (sof_hda->no_ipc_position)
snd_sof_pcm_period_elapsed(s->substream);
if (sof_hda->no_ipc_position) {
spin_unlock_irq(&bus->reg_lock);
snd_pcm_period_elapsed(s->substream);
spin_lock_irq(&bus->reg_lock);
Thanks, Takashi. Yes, I realized it this morning as well that it is due to the reg_lock. It does work with this change now. I will run some stress tests with this change and get back with the results.
Thanks, Ranjani