linux/sound/core
Christophe Leroy f301c878d0 ALSA: pcm: Rewrite recalculate_boundary() to avoid costly loop
[ Upstream commit 92f59aeb13 ]

At the time being recalculate_boundary() is implemented with a
loop which shows up as costly in a perf profile, as depicted by
the annotate below:

    0.00 :   c057e934:       3d 40 7f ff     lis     r10,32767
    0.03 :   c057e938:       61 4a ff ff     ori     r10,r10,65535
    0.21 :   c057e93c:       7d 49 50 50     subf    r10,r9,r10
    5.39 :   c057e940:       7d 3c 4b 78     mr      r28,r9
    2.11 :   c057e944:       55 29 08 3c     slwi    r9,r9,1
    3.04 :   c057e948:       7c 09 50 40     cmplw   r9,r10
    2.47 :   c057e94c:       40 81 ff f4     ble     c057e940 <snd_pcm_ioctl+0xee0>

Total: 13.2% on that simple loop.

But what the loop does is to multiply the boundary by 2 until it is
over the wanted border. This can be avoided by using fls() to get the
boundary value order and shift it by the appropriate number of bits at
once.

This change provides the following profile:

    0.04 :   c057f6e8:       3d 20 7f ff     lis     r9,32767
    0.02 :   c057f6ec:       61 29 ff ff     ori     r9,r9,65535
    0.34 :   c057f6f0:       7d 5a 48 50     subf    r10,r26,r9
    0.23 :   c057f6f4:       7c 1a 50 40     cmplw   r26,r10
    0.02 :   c057f6f8:       41 81 00 20     bgt     c057f718 <snd_pcm_ioctl+0xf08>
    0.26 :   c057f6fc:       7f 47 00 34     cntlzw  r7,r26
    0.09 :   c057f700:       7d 48 00 34     cntlzw  r8,r10
    0.22 :   c057f704:       7d 08 38 50     subf    r8,r8,r7
    0.04 :   c057f708:       7f 5a 40 30     slw     r26,r26,r8
    0.35 :   c057f70c:       7c 0a d0 40     cmplw   r10,r26
    0.13 :   c057f710:       40 80 05 f8     bge     c057fd08 <snd_pcm_ioctl+0x14f8>
    0.00 :   c057f714:       57 5a f8 7e     srwi    r26,r26,1

Total: 1.7% with that loopless alternative.

Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Link: https://patch.msgid.link/4836e2cde653eebaf2709ebe30eec736bb8c67fd.1749202237.git.christophe.leroy@csgroup.eu
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2025-08-20 18:30:27 +02:00
..
oss ALSA: pcm: Fix race of buffer access at PCM OSS layer 2025-05-29 11:03:20 +02:00
seq ALSA: seq: Improve data consistency at polling 2025-05-29 11:02:27 +02:00
.kunitconfig ALSA: core: add kunitconfig 2024-03-17 09:36:45 +01:00
compress_offload.c ALSA: Fix typos in comments across various files 2024-09-30 09:52:31 +02:00
control.c ASoC: Fixes for v6.12 2024-10-02 21:29:16 +02:00
control_compat.c Merge branch 'topic/control-lookup-rwlock' into for-next 2024-08-09 14:25:24 +02:00
control_led.c ALSA: control: Avoid WARN() for symlink errors 2024-12-19 18:13:15 +01:00
ctljack.c ALSA: Convert strlcpy to strscpy when return value is unused 2021-01-08 09:30:05 +01:00
device.c ALSA: core: Fix missing return value comments for kernel docs 2022-07-13 13:42:38 +02:00
hrtimer.c ALSA: hrtimer: Use guard() for locking 2024-02-28 15:01:20 +01:00
hwdep.c ALSA: hwdep: Move put_user() call out of scoped_guard() in snd_hwdep_control_ioctl() 2024-03-01 18:10:57 +01:00
hwdep_compat.c ALSA: compat_ioctl: avoid compat_alloc_user_space 2020-09-21 10:37:07 +02:00
info.c ALSA: info: Use guard() for locking 2024-02-28 15:01:21 +01:00
info_oss.c ALSA: info: Use guard() for locking 2024-02-28 15:01:21 +01:00
init.c ALSA: core: add isascii() check to card ID generator 2024-10-03 09:16:58 +02:00
isadma.c sound updates for 6.0-rc1 2022-08-06 10:19:51 -07:00
jack.c ALSA: core: Remove debugfs at disconnection 2024-05-27 09:28:21 +02:00
Kconfig ALSA: timer: Introduce virtual userspace-driven timers 2024-08-18 09:55:54 +02:00
Makefile ALSA: core: Use *-y instead of *-objs in Makefile 2024-05-08 18:17:32 +02:00
memalloc.c ALSA: memalloc: prefer dma_mapping_error() over explicit address checking 2025-01-02 10:34:13 +01:00
memory.c ALSA: core: Add memory copy helpers between iov_iter and iomem 2023-08-18 12:18:16 +02:00
misc.c ALSA: core: Drop snd_print stuff and co 2024-08-08 07:49:47 +02:00
pcm.c ALSA: pcm: Add xrun counter for snd_pcm_substream 2024-08-10 10:40:58 +02:00
pcm_compat.c ALSA: pcm: Use guard() for PCM stream locks 2024-02-28 15:01:22 +01:00
pcm_dmaengine.c ALSA: pcm_dmaengine: Don't synchronize DMA channel when DMA is paused 2024-07-17 10:39:47 +02:00
pcm_drm_eld.c drm/edid: include drm_eld.h only where required 2023-11-09 16:47:31 +02:00
pcm_iec958.c ALSA: iec958: Split status creation and fill 2021-06-08 17:05:41 +02:00
pcm_lib.c ALSA: pcm: Add xrun counter for snd_pcm_substream 2024-08-10 10:40:58 +02:00
pcm_local.h ALSA: pcm: Revert "ALSA: pcm: rewrite snd_pcm_playback_silence()" 2023-05-05 18:23:48 +02:00
pcm_memory.c ALSA: pcm: Fix yet more compile warning at replacement with kstrtoul() 2024-09-02 10:17:42 +02:00
pcm_misc.c ALSA: pcm: Fix breakage of PCM rates used for topology 2024-09-11 16:17:44 +02:00
pcm_native.c ALSA: pcm: Rewrite recalculate_boundary() to avoid costly loop 2025-08-20 18:30:27 +02:00
pcm_param_trace.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
pcm_timer.c ALSA: pcm_timer: use snd_pcm_direction_name() 2024-08-01 12:50:13 +02:00
pcm_trace.h tracing/treewide: Remove second parameter of __assign_str() 2024-05-22 20:14:47 -04:00
rawmidi.c ALSA: rawmidi: Fix kvfree() call in spinlock 2024-12-05 14:02:58 +01:00
rawmidi_compat.c ALSA: rawmidi: Replace with __packed attribute 2023-10-26 09:42:55 +02:00
seq_device.c ALSA: core: fix up bus match const issues. 2025-06-19 15:31:33 +02:00
sound.c ALSA: Fix typos in comments across various files 2024-09-30 09:52:31 +02:00
sound_kunit.c ALSA: core: Fix possible NULL dereference caused by kunit_kzalloc() 2024-12-05 14:02:40 +01:00
sound_oss.c ALSA: core: Use guard() for locking 2024-02-28 15:01:21 +01:00
timer.c ALSA: timer: Don't take register_mutex with copy_from/to_user() 2025-04-10 14:39:13 +02:00
timer_compat.c ALSA: timer: Use guard() for locking 2024-02-28 15:01:20 +01:00
ump.c Revert "ALSA: ump: Don't enumeration invalid groups for legacy rawmidi" 2025-01-09 13:33:48 +01:00
ump_convert.c ALSA: ump: Explicitly reset RPN with Null RPN 2024-07-31 15:08:39 +02:00
vmaster.c ALSA: vmaster: Return error for invalid input values 2024-06-18 12:00:18 +02:00