[alsa-devel] [PATCH] ALSA: compress: Make sure we trigger STOP before closing the stream.
Currently we assume that userspace will shut down the compressed stream correctly. However, if userspcae dies (e.g. cplay & ctrl-C) we dont stop the stream before freeing it.
This now checks that the stream is stopped before freeing.
Signed-off-by: Liam Girdwood liam.r.girdwood@linux.intel.com --- sound/core/compress_offload.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c index 99db892..a9ae4f3 100644 --- a/sound/core/compress_offload.c +++ b/sound/core/compress_offload.c @@ -139,6 +139,18 @@ static int snd_compr_open(struct inode *inode, struct file *f) static int snd_compr_free(struct inode *inode, struct file *f) { struct snd_compr_file *data = f->private_data; + struct snd_compr_runtime *runtime = data->stream.runtime; + + switch (runtime->state) { + case SNDRV_PCM_STATE_RUNNING: + case SNDRV_PCM_STATE_DRAINING: + case SNDRV_PCM_STATE_PAUSED: + data->stream.ops->trigger(&data->stream, SNDRV_PCM_TRIGGER_STOP); + break; + default: + break; + } + data->stream.ops->free(&data->stream); kfree(data->stream.runtime->buffer); kfree(data->stream.runtime);
snd_unregister_device() should return the device type and not stream direction.
Signed-off-by: Liam Girdwood liam.r.girdwood@linux.intel.com --- sound/core/compress_offload.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c index a9ae4f3..fba7e7a 100644 --- a/sound/core/compress_offload.c +++ b/sound/core/compress_offload.c @@ -849,7 +849,8 @@ static int snd_compress_dev_disconnect(struct snd_device *device) struct snd_compr *compr;
compr = device->device_data; - snd_unregister_device(compr->direction, compr->card, compr->device); + snd_unregister_device(SNDRV_DEVICE_TYPE_COMPRESS, compr->card, + compr->device); return 0; }
On Fri, Sep 13, 2013 at 05:43:17PM +0100, Liam Girdwood wrote:
snd_unregister_device() should return the device type and not stream direction.
Thanks for fixing this, I saw this but didnt get time to fix it.
Acked-By: Vinod Koul vinod.koul@intel.com Tested-By: Vinod Koul vinod.koul@intel.com
Is there a Tested-Acked-??
~Vinod
Signed-off-by: Liam Girdwood liam.r.girdwood@linux.intel.com
sound/core/compress_offload.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c index a9ae4f3..fba7e7a 100644 --- a/sound/core/compress_offload.c +++ b/sound/core/compress_offload.c @@ -849,7 +849,8 @@ static int snd_compress_dev_disconnect(struct snd_device *device) struct snd_compr *compr;
compr = device->device_data;
- snd_unregister_device(compr->direction, compr->card, compr->device);
- snd_unregister_device(SNDRV_DEVICE_TYPE_COMPRESS, compr->card,
return 0;compr->device);
}
-- 1.8.1.2
--
On Mon, Sep 16, 2013 at 09:45:01AM +0530, Vinod Koul wrote:
On Fri, Sep 13, 2013 at 05:43:17PM +0100, Liam Girdwood wrote:
snd_unregister_device() should return the device type and not stream direction.
Thanks for fixing this, I saw this but didnt get time to fix it.
Acked-By: Vinod Koul vinod.koul@intel.com Tested-By: Vinod Koul vinod.koul@intel.com
Also pls CC stable, this fixed would help in older kernels too
~Vinod
Is there a Tested-Acked-??
~Vinod
Signed-off-by: Liam Girdwood liam.r.girdwood@linux.intel.com
sound/core/compress_offload.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c index a9ae4f3..fba7e7a 100644 --- a/sound/core/compress_offload.c +++ b/sound/core/compress_offload.c @@ -849,7 +849,8 @@ static int snd_compress_dev_disconnect(struct snd_device *device) struct snd_compr *compr;
compr = device->device_data;
- snd_unregister_device(compr->direction, compr->card, compr->device);
- snd_unregister_device(SNDRV_DEVICE_TYPE_COMPRESS, compr->card,
return 0;compr->device);
}
-- 1.8.1.2
--
--
At Mon, 16 Sep 2013 09:52:11 +0530, Vinod Koul wrote:
On Mon, Sep 16, 2013 at 09:45:01AM +0530, Vinod Koul wrote:
On Fri, Sep 13, 2013 at 05:43:17PM +0100, Liam Girdwood wrote:
snd_unregister_device() should return the device type and not stream direction.
Thanks for fixing this, I saw this but didnt get time to fix it.
Acked-By: Vinod Koul vinod.koul@intel.com Tested-By: Vinod Koul vinod.koul@intel.com
Also pls CC stable, this fixed would help in older kernels too
I applied this now with these tags, but a pull request to Linus will be postponed until the next week since I've been traveling now.
thanks,
Takashi
~Vinod
Is there a Tested-Acked-??
~Vinod
Signed-off-by: Liam Girdwood liam.r.girdwood@linux.intel.com
sound/core/compress_offload.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c index a9ae4f3..fba7e7a 100644 --- a/sound/core/compress_offload.c +++ b/sound/core/compress_offload.c @@ -849,7 +849,8 @@ static int snd_compress_dev_disconnect(struct snd_device *device) struct snd_compr *compr;
compr = device->device_data;
- snd_unregister_device(compr->direction, compr->card, compr->device);
- snd_unregister_device(SNDRV_DEVICE_TYPE_COMPRESS, compr->card,
return 0;compr->device);
}
-- 1.8.1.2
--
--
On Fri, Sep 13, 2013 at 05:43:16PM +0100, Liam Girdwood wrote:
Currently we assume that userspace will shut down the compressed stream correctly. However, if userspcae dies (e.g. cplay & ctrl-C) we dont stop the stream before freeing it.
This now checks that the stream is stopped before freeing.
Signed-off-by: Liam Girdwood liam.r.girdwood@linux.intel.com
sound/core/compress_offload.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c index 99db892..a9ae4f3 100644 --- a/sound/core/compress_offload.c +++ b/sound/core/compress_offload.c @@ -139,6 +139,18 @@ static int snd_compr_open(struct inode *inode, struct file *f) static int snd_compr_free(struct inode *inode, struct file *f) { struct snd_compr_file *data = f->private_data;
- struct snd_compr_runtime *runtime = data->stream.runtime;
- switch (runtime->state) {
- case SNDRV_PCM_STATE_RUNNING:
- case SNDRV_PCM_STATE_DRAINING:
- case SNDRV_PCM_STATE_PAUSED:
data->stream.ops->trigger(&data->stream, SNDRV_PCM_TRIGGER_STOP);
when usermode dies the free will get invoked as we have below. The free is a valid trigger from any state. So shouldnt the DSP then STOP the DMAs and free the streams. Given that most of the usage is a DSP then IMO it might make send to tell DSP that stop and cleanup rather than saying stop and cleanup?
~Vinod
break;
- default:
break;
- }
- data->stream.ops->free(&data->stream); kfree(data->stream.runtime->buffer); kfree(data->stream.runtime);
-- 1.8.1.2
--
On Mon, 2013-09-16 at 09:27 +0530, Vinod Koul wrote:
On Fri, Sep 13, 2013 at 05:43:16PM +0100, Liam Girdwood wrote:
Currently we assume that userspace will shut down the compressed stream correctly. However, if userspcae dies (e.g. cplay & ctrl-C) we dont stop the stream before freeing it.
This now checks that the stream is stopped before freeing.
Signed-off-by: Liam Girdwood liam.r.girdwood@linux.intel.com
sound/core/compress_offload.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c index 99db892..a9ae4f3 100644 --- a/sound/core/compress_offload.c +++ b/sound/core/compress_offload.c @@ -139,6 +139,18 @@ static int snd_compr_open(struct inode *inode, struct file *f) static int snd_compr_free(struct inode *inode, struct file *f) { struct snd_compr_file *data = f->private_data;
- struct snd_compr_runtime *runtime = data->stream.runtime;
- switch (runtime->state) {
- case SNDRV_PCM_STATE_RUNNING:
- case SNDRV_PCM_STATE_DRAINING:
- case SNDRV_PCM_STATE_PAUSED:
data->stream.ops->trigger(&data->stream, SNDRV_PCM_TRIGGER_STOP);
when usermode dies the free will get invoked as we have below. The free is a valid trigger from any state. So shouldnt the DSP then STOP the DMAs and free the streams.
This means that the compressed stream ops don't follow the PCM ops wrt trigger() sequencing (i.e. we have to add extra logic in free to deal with this difference).
I think it would be better to follow the PCM operations use case here as it simplifies the driver code and stops people making the false assumption that trigger() works the same way throughout ALSA ?
Given that most of the usage is a DSP then IMO it might make send to tell DSP that stop and cleanup rather than saying stop and cleanup?
Sorry, don't follow you here ;)
Liam
~Vinod
break;
- default:
break;
- }
- data->stream.ops->free(&data->stream); kfree(data->stream.runtime->buffer); kfree(data->stream.runtime);
-- 1.8.1.2
--------------------------------------------------------------------- Intel Corporation (UK) Limited Registered No. 1134945 (England) Registered Office: Pipers Way, Swindon SN3 1RJ VAT No: 860 2173 47
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). Any review or distribution by others is strictly prohibited. If you are not the intended recipient, please contact the sender and delete all copies.
At Mon, 16 Sep 2013 12:01:23 +0100, Liam Girdwood wrote:
On Mon, 2013-09-16 at 09:27 +0530, Vinod Koul wrote:
On Fri, Sep 13, 2013 at 05:43:16PM +0100, Liam Girdwood wrote:
Currently we assume that userspace will shut down the compressed stream correctly. However, if userspcae dies (e.g. cplay & ctrl-C) we dont stop the stream before freeing it.
This now checks that the stream is stopped before freeing.
Signed-off-by: Liam Girdwood liam.r.girdwood@linux.intel.com
sound/core/compress_offload.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c index 99db892..a9ae4f3 100644 --- a/sound/core/compress_offload.c +++ b/sound/core/compress_offload.c @@ -139,6 +139,18 @@ static int snd_compr_open(struct inode *inode, struct file *f) static int snd_compr_free(struct inode *inode, struct file *f) { struct snd_compr_file *data = f->private_data;
- struct snd_compr_runtime *runtime = data->stream.runtime;
- switch (runtime->state) {
- case SNDRV_PCM_STATE_RUNNING:
- case SNDRV_PCM_STATE_DRAINING:
- case SNDRV_PCM_STATE_PAUSED:
data->stream.ops->trigger(&data->stream, SNDRV_PCM_TRIGGER_STOP);
when usermode dies the free will get invoked as we have below. The free is a valid trigger from any state. So shouldnt the DSP then STOP the DMAs and free the streams.
This means that the compressed stream ops don't follow the PCM ops wrt trigger() sequencing (i.e. we have to add extra logic in free to deal with this difference).
I think it would be better to follow the PCM operations use case here as it simplifies the driver code and stops people making the false assumption that trigger() works the same way throughout ALSA ?
Well, the trigger of compress API has a few more jobs than PCM, and it's exactly what should be fixed (e.g. the proper handling of drain). We need a bit more consensus over that.
So, I didn't apply this patch yet. If Vinod is happy with this (even as a temporary solution), let me know.
thanks,
Takashi
Given that most of the usage is a DSP then IMO it might make send to tell DSP that stop and cleanup rather than saying stop and cleanup?
Sorry, don't follow you here ;)
Liam
~Vinod
break;
- default:
break;
- }
- data->stream.ops->free(&data->stream); kfree(data->stream.runtime->buffer); kfree(data->stream.runtime);
-- 1.8.1.2
Intel Corporation (UK) Limited Registered No. 1134945 (England) Registered Office: Pipers Way, Swindon SN3 1RJ VAT No: 860 2173 47
This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). Any review or distribution by others is strictly prohibited. If you are not the intended recipient, please contact the sender and delete all copies.
On Thu, 2013-09-19 at 18:43 +0200, Takashi Iwai wrote:
At Mon, 16 Sep 2013 12:01:23 +0100, Liam Girdwood wrote:
On Mon, 2013-09-16 at 09:27 +0530, Vinod Koul wrote:
On Fri, Sep 13, 2013 at 05:43:16PM +0100, Liam Girdwood wrote:
Currently we assume that userspace will shut down the compressed stream correctly. However, if userspcae dies (e.g. cplay & ctrl-C) we dont stop the stream before freeing it.
This now checks that the stream is stopped before freeing.
Signed-off-by: Liam Girdwood liam.r.girdwood@linux.intel.com
sound/core/compress_offload.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c index 99db892..a9ae4f3 100644 --- a/sound/core/compress_offload.c +++ b/sound/core/compress_offload.c @@ -139,6 +139,18 @@ static int snd_compr_open(struct inode *inode, struct file *f) static int snd_compr_free(struct inode *inode, struct file *f) { struct snd_compr_file *data = f->private_data;
- struct snd_compr_runtime *runtime = data->stream.runtime;
- switch (runtime->state) {
- case SNDRV_PCM_STATE_RUNNING:
- case SNDRV_PCM_STATE_DRAINING:
- case SNDRV_PCM_STATE_PAUSED:
data->stream.ops->trigger(&data->stream, SNDRV_PCM_TRIGGER_STOP);
when usermode dies the free will get invoked as we have below. The free is a valid trigger from any state. So shouldnt the DSP then STOP the DMAs and free the streams.
This means that the compressed stream ops don't follow the PCM ops wrt trigger() sequencing (i.e. we have to add extra logic in free to deal with this difference).
I think it would be better to follow the PCM operations use case here as it simplifies the driver code and stops people making the false assumption that trigger() works the same way throughout ALSA ?
Well, the trigger of compress API has a few more jobs than PCM, and it's exactly what should be fixed (e.g. the proper handling of drain). We need a bit more consensus over that.
So, I didn't apply this patch yet. If Vinod is happy with this (even as a temporary solution), let me know.
Without this patch we have the two different sequences for shutdown depending on whether userspace dies or not. i.e.
1) Normal: trigger(start) -> play -> trigger(stop) -> close()
2) ctrl-C: trigger(start) -> play -> ctrl-C -> close()
So we miss out the trigger(STOP) and close the device with the stream still in a trigger running state.
Liam
On Mon, Sep 23, 2013 at 11:19:39AM +0100, Liam Girdwood wrote:
On Thu, 2013-09-19 at 18:43 +0200, Takashi Iwai wrote:
At Mon, 16 Sep 2013 12:01:23 +0100, Liam Girdwood wrote:
On Mon, 2013-09-16 at 09:27 +0530, Vinod Koul wrote:
On Fri, Sep 13, 2013 at 05:43:16PM +0100, Liam Girdwood wrote:
Currently we assume that userspace will shut down the compressed stream correctly. However, if userspcae dies (e.g. cplay & ctrl-C) we dont stop the stream before freeing it.
This now checks that the stream is stopped before freeing.
Signed-off-by: Liam Girdwood liam.r.girdwood@linux.intel.com
sound/core/compress_offload.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c index 99db892..a9ae4f3 100644 --- a/sound/core/compress_offload.c +++ b/sound/core/compress_offload.c @@ -139,6 +139,18 @@ static int snd_compr_open(struct inode *inode, struct file *f) static int snd_compr_free(struct inode *inode, struct file *f) { struct snd_compr_file *data = f->private_data;
- struct snd_compr_runtime *runtime = data->stream.runtime;
- switch (runtime->state) {
- case SNDRV_PCM_STATE_RUNNING:
- case SNDRV_PCM_STATE_DRAINING:
- case SNDRV_PCM_STATE_PAUSED:
data->stream.ops->trigger(&data->stream, SNDRV_PCM_TRIGGER_STOP);
when usermode dies the free will get invoked as we have below. The free is a valid trigger from any state. So shouldnt the DSP then STOP the DMAs and free the streams.
This means that the compressed stream ops don't follow the PCM ops wrt trigger() sequencing (i.e. we have to add extra logic in free to deal with this difference).
I think it would be better to follow the PCM operations use case here as it simplifies the driver code and stops people making the false assumption that trigger() works the same way throughout ALSA ?
Well, the trigger of compress API has a few more jobs than PCM, and it's exactly what should be fixed (e.g. the proper handling of drain). We need a bit more consensus over that.
Drain handling would be different, I am working on taht way, havent been able to get the time it needs...
So, I didn't apply this patch yet. If Vinod is happy with this (even as a temporary solution), let me know.
Sorry my bad, your and Liam mail went to some other folder due to my bad rules set. Sorry for not reverting earlier..
Without this patch we have the two different sequences for shutdown depending on whether userspace dies or not. i.e.
Normal: trigger(start) -> play -> trigger(stop) -> close()
ctrl-C: trigger(start) -> play -> ctrl-C -> close()
So we miss out the trigger(STOP) and close the device with the stream still in a trigger running state.
my point was since we have DSPs we can let DSP internally treat free in not stopped cases as goto stop and then free. We do this way in our DSPs and save us a cmd to be sent. Above way though fine will just add that cmd.
The patch is okay but only argument i had was that we can save one cmd since we have a DSP. Am okay if we have this too..
~Vinod
--
At Mon, 23 Sep 2013 15:11:00 +0530, Vinod Koul wrote:
On Mon, Sep 23, 2013 at 11:19:39AM +0100, Liam Girdwood wrote:
On Thu, 2013-09-19 at 18:43 +0200, Takashi Iwai wrote:
At Mon, 16 Sep 2013 12:01:23 +0100, Liam Girdwood wrote:
On Mon, 2013-09-16 at 09:27 +0530, Vinod Koul wrote:
On Fri, Sep 13, 2013 at 05:43:16PM +0100, Liam Girdwood wrote:
Currently we assume that userspace will shut down the compressed stream correctly. However, if userspcae dies (e.g. cplay & ctrl-C) we dont stop the stream before freeing it.
This now checks that the stream is stopped before freeing.
Signed-off-by: Liam Girdwood liam.r.girdwood@linux.intel.com
sound/core/compress_offload.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c index 99db892..a9ae4f3 100644 --- a/sound/core/compress_offload.c +++ b/sound/core/compress_offload.c @@ -139,6 +139,18 @@ static int snd_compr_open(struct inode *inode, struct file *f) static int snd_compr_free(struct inode *inode, struct file *f) { struct snd_compr_file *data = f->private_data;
- struct snd_compr_runtime *runtime = data->stream.runtime;
- switch (runtime->state) {
- case SNDRV_PCM_STATE_RUNNING:
- case SNDRV_PCM_STATE_DRAINING:
- case SNDRV_PCM_STATE_PAUSED:
data->stream.ops->trigger(&data->stream, SNDRV_PCM_TRIGGER_STOP);
when usermode dies the free will get invoked as we have below. The free is a valid trigger from any state. So shouldnt the DSP then STOP the DMAs and free the streams.
This means that the compressed stream ops don't follow the PCM ops wrt trigger() sequencing (i.e. we have to add extra logic in free to deal with this difference).
I think it would be better to follow the PCM operations use case here as it simplifies the driver code and stops people making the false assumption that trigger() works the same way throughout ALSA ?
Well, the trigger of compress API has a few more jobs than PCM, and it's exactly what should be fixed (e.g. the proper handling of drain). We need a bit more consensus over that.
Drain handling would be different, I am working on taht way, havent been able to get the time it needs...
So, I didn't apply this patch yet. If Vinod is happy with this (even as a temporary solution), let me know.
Sorry my bad, your and Liam mail went to some other folder due to my bad rules set. Sorry for not reverting earlier..
Without this patch we have the two different sequences for shutdown depending on whether userspace dies or not. i.e.
Normal: trigger(start) -> play -> trigger(stop) -> close()
ctrl-C: trigger(start) -> play -> ctrl-C -> close()
So we miss out the trigger(STOP) and close the device with the stream still in a trigger running state.
my point was since we have DSPs we can let DSP internally treat free in not stopped cases as goto stop and then free. We do this way in our DSPs and save us a cmd to be sent. Above way though fine will just add that cmd.
The patch is okay but only argument i had was that we can save one cmd since we have a DSP. Am okay if we have this too..
OK, applied this patch now, too.
thanks,
Takashi
participants (4)
-
Liam Girdwood
-
Liam Girdwood
-
Takashi Iwai
-
Vinod Koul