[alsa-devel] [PATCH 1/9] ALSA: Compress - dont use lock for all ioctls

Takashi Iwai tiwai at suse.de
Tue Aug 27 12:22:31 CEST 2013


At Tue, 27 Aug 2013 12:10:31 +0530,
Vinod Koul wrote:
> 
> Some simple ioctls like timsetamp query, capabities query can be done anytime
> and should not be under the stream lock. Move these to
> snd_compress_simple_iotcls() which is invoked without lock held
> 
> While at it, improve readblity a bit by sprinkling some empty lines
> 
> Signed-off-by: Vinod Koul <vinod.koul at intel.com>
> Cc: <stable at vger.kernel.org>

Why it's needed for stable?  Fixing any real bugs?


> ---
>  sound/core/compress_offload.c |   79 ++++++++++++++++++++++++++++++-----------
>  1 files changed, 58 insertions(+), 21 deletions(-)
> 
> diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c
> index 99db892..868aefd 100644
> --- a/sound/core/compress_offload.c
> +++ b/sound/core/compress_offload.c
> @@ -729,70 +729,107 @@ static int snd_compr_partial_drain(struct snd_compr_stream *stream)
>  	return retval;
>  }
>  
> -static long snd_compr_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
> +static int snd_compress_simple_ioctls(struct file *file,
> +				struct snd_compr_stream *stream,
> +				unsigned int cmd, unsigned long arg)
>  {
> -	struct snd_compr_file *data = f->private_data;
> -	struct snd_compr_stream *stream;
>  	int retval = -ENOTTY;
>  
> -	if (snd_BUG_ON(!data))
> -		return -EFAULT;
> -	stream = &data->stream;
> -	if (snd_BUG_ON(!stream))
> -		return -EFAULT;
> -	mutex_lock(&stream->device->lock);
>  	switch (_IOC_NR(cmd)) {
>  	case _IOC_NR(SNDRV_COMPRESS_IOCTL_VERSION):
>  		put_user(SNDRV_COMPRESS_VERSION,
>  				(int __user *)arg) ? -EFAULT : 0;
>  		break;
> +
>  	case _IOC_NR(SNDRV_COMPRESS_GET_CAPS):
>  		retval = snd_compr_get_caps(stream, arg);
>  		break;
> +
>  	case _IOC_NR(SNDRV_COMPRESS_GET_CODEC_CAPS):
>  		retval = snd_compr_get_codec_caps(stream, arg);
>  		break;
> +
> +	case _IOC_NR(SNDRV_COMPRESS_TSTAMP):
> +		retval = snd_compr_tstamp(stream, arg);
> +		break;
> +
> +	case _IOC_NR(SNDRV_COMPRESS_AVAIL):
> +		retval = snd_compr_ioctl_avail(stream, arg);
> +		break;
> +
> +		/* drain and partial drain need special handling
> +	 * we need to drop the locks here as the streams would get blocked on the
> +	 * dsp to get drained. The locking would be handled in respective
> +	 * function here
> +	 */
> +	case _IOC_NR(SNDRV_COMPRESS_DRAIN):
> +		retval = snd_compr_drain(stream);
> +		break;
> +
> +	case _IOC_NR(SNDRV_COMPRESS_PARTIAL_DRAIN):
> +		retval = snd_compr_partial_drain(stream);
> +		break;
> +	}
> +
> +	return retval;
> +}
> +
> +static long snd_compr_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
> +{
> +	struct snd_compr_file *data = f->private_data;
> +	struct snd_compr_stream *stream;
> +	int retval = -ENOTTY;
> +
> +	if (snd_BUG_ON(!data))
> +		return -EFAULT;
> +	stream = &data->stream;
> +	if (snd_BUG_ON(!stream))
> +		return -EFAULT;
> +
> +	mutex_lock(&stream->device->lock);
> +	switch (_IOC_NR(cmd)) {
>  	case _IOC_NR(SNDRV_COMPRESS_SET_PARAMS):
>  		retval = snd_compr_set_params(stream, arg);
>  		break;
> +
>  	case _IOC_NR(SNDRV_COMPRESS_GET_PARAMS):
>  		retval = snd_compr_get_params(stream, arg);
>  		break;
> +
>  	case _IOC_NR(SNDRV_COMPRESS_SET_METADATA):
>  		retval = snd_compr_set_metadata(stream, arg);
>  		break;
> +
>  	case _IOC_NR(SNDRV_COMPRESS_GET_METADATA):
>  		retval = snd_compr_get_metadata(stream, arg);
>  		break;
> -	case _IOC_NR(SNDRV_COMPRESS_TSTAMP):
> -		retval = snd_compr_tstamp(stream, arg);
> -		break;
> -	case _IOC_NR(SNDRV_COMPRESS_AVAIL):
> -		retval = snd_compr_ioctl_avail(stream, arg);
> -		break;
> +
>  	case _IOC_NR(SNDRV_COMPRESS_PAUSE):
>  		retval = snd_compr_pause(stream);
>  		break;
> +
>  	case _IOC_NR(SNDRV_COMPRESS_RESUME):
>  		retval = snd_compr_resume(stream);
>  		break;
> +
>  	case _IOC_NR(SNDRV_COMPRESS_START):
>  		retval = snd_compr_start(stream);
>  		break;
> +
>  	case _IOC_NR(SNDRV_COMPRESS_STOP):
>  		retval = snd_compr_stop(stream);
>  		break;
> -	case _IOC_NR(SNDRV_COMPRESS_DRAIN):
> -		retval = snd_compr_drain(stream);
> -		break;
> -	case _IOC_NR(SNDRV_COMPRESS_PARTIAL_DRAIN):
> -		retval = snd_compr_partial_drain(stream);
> -		break;
> +
>  	case _IOC_NR(SNDRV_COMPRESS_NEXT_TRACK):
>  		retval = snd_compr_next_track(stream);
>  		break;
>  
> +	default:
> +		mutex_unlock(&stream->device->lock);
> +		return snd_compress_simple_ioctls(f, stream, cmd, arg);

In this code, it still locks/unlocks shortly unnecessarily.
It should be rather like:
	switch (_IOC_NR(cmd)) {
 	case _IOC_NR(SNDRV_COMPRESS_IOCTL_VERSION):
		...
 	case _IOC_NR(SNDRV_COMPRESS_GET_CAPS):
		....	
	default:
		retval = snd_compress_locked_ioctls(f, stream, cmd, arg);
	}


Takashi


More information about the Alsa-devel mailing list