Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ALSA: compress_offload: Use guard() for locking

We can simplify the code gracefully with new guard() macro and co for
automatic cleanup of locks.

The explicit mutex_lock/unlock are still seen only in
snd_compress_wait_for_drain() which does temporary unlock/relocking.

Only the code refactoring, and no functional changes.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Link: https://lore.kernel.org/r/20240227085306.9764-3-tiwai@suse.de

+33 -65
+33 -65
sound/core/compress_offload.c
··· 127 127 init_waitqueue_head(&runtime->sleep); 128 128 data->stream.runtime = runtime; 129 129 f->private_data = (void *)data; 130 - mutex_lock(&compr->lock); 131 - ret = compr->ops->open(&data->stream); 132 - mutex_unlock(&compr->lock); 130 + scoped_guard(mutex, &compr->lock) 131 + ret = compr->ops->open(&data->stream); 133 132 if (ret) { 134 133 kfree(runtime); 135 134 kfree(data); ··· 287 288 return -EFAULT; 288 289 289 290 stream = &data->stream; 290 - mutex_lock(&stream->device->lock); 291 + guard(mutex)(&stream->device->lock); 291 292 /* write is allowed when stream is running or has been steup */ 292 293 switch (stream->runtime->state) { 293 294 case SNDRV_PCM_STATE_SETUP: ··· 295 296 case SNDRV_PCM_STATE_RUNNING: 296 297 break; 297 298 default: 298 - mutex_unlock(&stream->device->lock); 299 299 return -EBADFD; 300 300 } 301 301 ··· 320 322 pr_debug("stream prepared, Houston we are good to go\n"); 321 323 } 322 324 323 - mutex_unlock(&stream->device->lock); 324 325 return retval; 325 326 } 326 327 ··· 336 339 return -EFAULT; 337 340 338 341 stream = &data->stream; 339 - mutex_lock(&stream->device->lock); 342 + guard(mutex)(&stream->device->lock); 340 343 341 344 /* read is allowed when stream is running, paused, draining and setup 342 345 * (yes setup is state which we transition to after stop, so if user ··· 347 350 case SNDRV_PCM_STATE_PREPARED: 348 351 case SNDRV_PCM_STATE_SUSPENDED: 349 352 case SNDRV_PCM_STATE_DISCONNECTED: 350 - retval = -EBADFD; 351 - goto out; 353 + return -EBADFD; 352 354 case SNDRV_PCM_STATE_XRUN: 353 - retval = -EPIPE; 354 - goto out; 355 + return -EPIPE; 355 356 } 356 357 357 358 avail = snd_compr_get_avail(stream); ··· 358 363 if (avail > count) 359 364 avail = count; 360 365 361 - if (stream->ops->copy) { 366 + if (stream->ops->copy) 362 367 retval = stream->ops->copy(stream, buf, avail); 363 - } else { 364 - retval = -ENXIO; 365 - goto out; 366 - } 368 + else 369 + return -ENXIO; 367 370 if (retval > 0) 368 371 stream->runtime->total_bytes_transferred += retval; 369 372 370 - out: 371 - mutex_unlock(&stream->device->lock); 372 373 return retval; 373 374 } 374 375 ··· 393 402 394 403 stream = &data->stream; 395 404 396 - mutex_lock(&stream->device->lock); 405 + guard(mutex)(&stream->device->lock); 397 406 398 407 switch (stream->runtime->state) { 399 408 case SNDRV_PCM_STATE_OPEN: 400 409 case SNDRV_PCM_STATE_XRUN: 401 - retval = snd_compr_get_poll(stream) | EPOLLERR; 402 - goto out; 410 + return snd_compr_get_poll(stream) | EPOLLERR; 403 411 default: 404 412 break; 405 413 } ··· 423 433 retval = snd_compr_get_poll(stream); 424 434 break; 425 435 default: 426 - retval = snd_compr_get_poll(stream) | EPOLLERR; 427 - break; 436 + return snd_compr_get_poll(stream) | EPOLLERR; 428 437 } 429 - out: 430 - mutex_unlock(&stream->device->lock); 438 + 431 439 return retval; 432 440 } 433 441 ··· 783 795 784 796 stream = container_of(work, struct snd_compr_stream, error_work.work); 785 797 786 - mutex_lock(&stream->device->lock); 798 + guard(mutex)(&stream->device->lock); 787 799 788 800 stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_STOP); 789 801 wake_up(&stream->runtime->sleep); 790 - 791 - mutex_unlock(&stream->device->lock); 792 802 } 793 803 794 804 /** ··· 943 957 { 944 958 struct snd_compr_file *data = f->private_data; 945 959 struct snd_compr_stream *stream; 946 - int retval = -ENOTTY; 947 960 948 961 if (snd_BUG_ON(!data)) 949 962 return -EFAULT; 950 963 951 964 stream = &data->stream; 952 965 953 - mutex_lock(&stream->device->lock); 966 + guard(mutex)(&stream->device->lock); 954 967 switch (_IOC_NR(cmd)) { 955 968 case _IOC_NR(SNDRV_COMPRESS_IOCTL_VERSION): 956 - retval = put_user(SNDRV_COMPRESS_VERSION, 969 + return put_user(SNDRV_COMPRESS_VERSION, 957 970 (int __user *)arg) ? -EFAULT : 0; 958 - break; 959 971 case _IOC_NR(SNDRV_COMPRESS_GET_CAPS): 960 - retval = snd_compr_get_caps(stream, arg); 961 - break; 972 + return snd_compr_get_caps(stream, arg); 962 973 #ifndef COMPR_CODEC_CAPS_OVERFLOW 963 974 case _IOC_NR(SNDRV_COMPRESS_GET_CODEC_CAPS): 964 - retval = snd_compr_get_codec_caps(stream, arg); 965 - break; 975 + return snd_compr_get_codec_caps(stream, arg); 966 976 #endif 967 977 case _IOC_NR(SNDRV_COMPRESS_SET_PARAMS): 968 - retval = snd_compr_set_params(stream, arg); 969 - break; 978 + return snd_compr_set_params(stream, arg); 970 979 case _IOC_NR(SNDRV_COMPRESS_GET_PARAMS): 971 - retval = snd_compr_get_params(stream, arg); 972 - break; 980 + return snd_compr_get_params(stream, arg); 973 981 case _IOC_NR(SNDRV_COMPRESS_SET_METADATA): 974 - retval = snd_compr_set_metadata(stream, arg); 975 - break; 982 + return snd_compr_set_metadata(stream, arg); 976 983 case _IOC_NR(SNDRV_COMPRESS_GET_METADATA): 977 - retval = snd_compr_get_metadata(stream, arg); 978 - break; 984 + return snd_compr_get_metadata(stream, arg); 979 985 case _IOC_NR(SNDRV_COMPRESS_TSTAMP): 980 - retval = snd_compr_tstamp(stream, arg); 981 - break; 986 + return snd_compr_tstamp(stream, arg); 982 987 case _IOC_NR(SNDRV_COMPRESS_AVAIL): 983 - retval = snd_compr_ioctl_avail(stream, arg); 984 - break; 988 + return snd_compr_ioctl_avail(stream, arg); 985 989 case _IOC_NR(SNDRV_COMPRESS_PAUSE): 986 - retval = snd_compr_pause(stream); 987 - break; 990 + return snd_compr_pause(stream); 988 991 case _IOC_NR(SNDRV_COMPRESS_RESUME): 989 - retval = snd_compr_resume(stream); 990 - break; 992 + return snd_compr_resume(stream); 991 993 case _IOC_NR(SNDRV_COMPRESS_START): 992 - retval = snd_compr_start(stream); 993 - break; 994 + return snd_compr_start(stream); 994 995 case _IOC_NR(SNDRV_COMPRESS_STOP): 995 - retval = snd_compr_stop(stream); 996 - break; 996 + return snd_compr_stop(stream); 997 997 case _IOC_NR(SNDRV_COMPRESS_DRAIN): 998 - retval = snd_compr_drain(stream); 999 - break; 998 + return snd_compr_drain(stream); 1000 999 case _IOC_NR(SNDRV_COMPRESS_PARTIAL_DRAIN): 1001 - retval = snd_compr_partial_drain(stream); 1002 - break; 1000 + return snd_compr_partial_drain(stream); 1003 1001 case _IOC_NR(SNDRV_COMPRESS_NEXT_TRACK): 1004 - retval = snd_compr_next_track(stream); 1005 - break; 1006 - 1002 + return snd_compr_next_track(stream); 1007 1003 } 1008 - mutex_unlock(&stream->device->lock); 1009 - return retval; 1004 + 1005 + return -ENOTTY; 1010 1006 } 1011 1007 1012 1008 /* support of 32bit userspace on 64bit platforms */