The modulo sits inside the subtraction, so the check evaluates
int_val - (min % step) rather than (int_val - min) % step. The
INTEGER64 branch below it is parenthesised correctly.

The written form passes only when the value equals min % step, and such
a value is always on a step boundary, so it never misses a real
violation. It only reports valid values as invalid.

snd-aloop declares step 1 on four controls, so every non-zero value on
them is reported. Before:

  # PCM Rate Shift 100000.0 value 100000 invalid for step 1 minimum 80000
  # Totals: pass:660 fail:101 xfail:0 xpass:0 skip:296 error:0

After, same card, nothing else changed:

  # Totals: pass:740 fail:21 xfail:0 xpass:0 skip:296 error:0

Eighteen files under sound/ declare a non-zero step.

Fixes: 5aaf9efffc57 ("kselftest: alsa: Add simplistic test for ALSA mixer 
controls kselftest")
Signed-off-by: HyeongJun An <[email protected]>
Assisted-by: Claude:claude-opus-5
---
 tools/testing/selftests/alsa/mixer-test.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/alsa/mixer-test.c 
b/tools/testing/selftests/alsa/mixer-test.c
index a329f901c5ed..0857d64c322a 100644
--- a/tools/testing/selftests/alsa/mixer-test.c
+++ b/tools/testing/selftests/alsa/mixer-test.c
@@ -319,8 +319,8 @@ static bool ctl_value_index_valid(struct ctl_data *ctl,
 
                /* Only check step size if there is one and we're in bounds */
                if (snd_ctl_elem_info_get_step(ctl->info) &&
-                   (int_val - snd_ctl_elem_info_get_min(ctl->info) %
-                    snd_ctl_elem_info_get_step(ctl->info))) {
+                   (int_val - snd_ctl_elem_info_get_min(ctl->info)) %
+                   snd_ctl_elem_info_get_step(ctl->info)) {
                        ksft_print_msg("%s.%d value %ld invalid for step %ld 
minimum %ld\n",
                                       ctl->name, index, int_val,
                                       snd_ctl_elem_info_get_step(ctl->info),
-- 
2.43.0


Reply via email to