[alsa-devel] [PATCH v3 2/4] ALSA: compress: Add function to indicate the stream has gone bad

Takashi Iwai tiwai at suse.de
Mon Apr 11 16:41:23 CEST 2016


On Mon, 11 Apr 2016 16:27:33 +0200,
Charles Keepax wrote:
> 
> Currently, the avail IOCTL doesn't pass any error status, which
> means typically on error it simply shows no data available. This
> can lead to situations where user-space is waiting indefinitely
> for data that will never come as the DSP has suffered an
> unrecoverable error.
> 
> Add snd_compr_stop_error which end drivers can call to indicate
> the stream has suffered an unrecoverable error and stop it. The
> avail and poll IOCTLs are then updated to report if the stream is
> in an error state to user-space. Allowing the error to propagate
> out. Processing of the actual snd_compr_stop needs to be deferred
> to a worker thread as the end driver may detect the errors during
> an existing operation callback.
> 
> Signed-off-by: Charles Keepax <ckeepax at opensource.wolfsonmicro.com>
> ---
>  include/sound/compress_driver.h |  4 +++
>  sound/core/compress_offload.c   | 60 ++++++++++++++++++++++++++++++++++++++++-
>  2 files changed, 63 insertions(+), 1 deletion(-)
> 
> diff --git a/include/sound/compress_driver.h b/include/sound/compress_driver.h
> index c0abcdc..a057038 100644
> --- a/include/sound/compress_driver.h
> +++ b/include/sound/compress_driver.h
> @@ -78,6 +78,7 @@ struct snd_compr_stream {
>  	struct snd_compr_ops *ops;
>  	struct snd_compr_runtime *runtime;
>  	struct snd_compr *device;
> +	struct delayed_work error_work;
>  	enum snd_compr_direction direction;
>  	bool metadata_set;
>  	bool next_track;
> @@ -187,4 +188,7 @@ static inline void snd_compr_drain_notify(struct snd_compr_stream *stream)
>  	wake_up(&stream->runtime->sleep);
>  }
>  
> +int snd_compr_stop_error(struct snd_compr_stream *stream,
> +			 snd_pcm_state_t state);
> +
>  #endif
> diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c
> index 507071d..86d1d85 100644
> --- a/sound/core/compress_offload.c
> +++ b/sound/core/compress_offload.c
> @@ -67,6 +67,8 @@ struct snd_compr_file {
>  	struct snd_compr_stream stream;
>  };
>  
> +static void error_delayed_work(struct work_struct *work);
> +
>  /*
>   * a note on stream states used:
>   * we use following states in the compressed core
> @@ -123,6 +125,9 @@ static int snd_compr_open(struct inode *inode, struct file *f)
>  		snd_card_unref(compr->card);
>  		return -ENOMEM;
>  	}
> +
> +	INIT_DELAYED_WORK(&data->stream.error_work, error_delayed_work);
> +
>  	data->stream.ops = compr->ops;
>  	data->stream.direction = dirn;
>  	data->stream.private_data = compr->private_data;
> @@ -153,6 +158,8 @@ 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;
>  
> +	cancel_delayed_work_sync(&data->stream.error_work);
> +
>  	switch (runtime->state) {
>  	case SNDRV_PCM_STATE_RUNNING:
>  	case SNDRV_PCM_STATE_DRAINING:
> @@ -237,6 +244,14 @@ snd_compr_ioctl_avail(struct snd_compr_stream *stream, unsigned long arg)
>  	avail = snd_compr_calc_avail(stream, &ioctl_avail);
>  	ioctl_avail.avail = avail;
>  
> +	switch (stream->runtime->state) {
> +	case SNDRV_PCM_STATE_OPEN:
> +	case SNDRV_PCM_STATE_XRUN:
> +		return -EBADFD;

One question is whether we want a dedicated error code for XRUN or
such a DSP error.  On PCM, for example, we return -EPIPE traditionally
for XRUN state.  This is a clear indicator for user what to do at
next.

Other than that, the patch series looks good to me.


thanks,

Takashi


More information about the Alsa-devel mailing list