]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
leds: rgb: leds-ktd202x: Initialize mutex earlier
authorHans de Goede <hdegoede@redhat.com>
Fri, 31 May 2024 11:41:21 +0000 (13:41 +0200)
committerLee Jones <lee@kernel.org>
Fri, 31 May 2024 11:57:34 +0000 (12:57 +0100)
The mutex must be initialized before the LED class device is registered
otherwise there is a race where it may get used before it is initialized:

 DEBUG_LOCKS_WARN_ON(lock->magic != lock)
 WARNING: CPU: 2 PID: 2045 at kernel/locking/mutex.c:587 __mutex_lock
 ...
 RIP: 0010:__mutex_lock+0x7db/0xc10
 ...
 set_brightness_delayed_set_brightness.part.0+0x17/0x60
 set_brightness_delayed+0xf1/0x100
 process_one_work+0x222/0x5a0

Move the mutex_init() call earlier to avoid this race condition and
switch to devm_mutex_init() to avoid the need to add error-exit
cleanup to probe() if probe() fails later on.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Andy Shevchenko <andy@kernel.org>
Link: https://lore.kernel.org/r/20240531114124.45346-4-hdegoede@redhat.com
Signed-off-by: Lee Jones <lee@kernel.org>
drivers/leds/rgb/leds-ktd202x.c

index 60ca6ec343362741f55bb442bdd7cbc58400413e..d5c442163c464e095a93b204337792f506e718aa 100644 (file)
@@ -556,6 +556,10 @@ static int ktd202x_probe(struct i2c_client *client)
                return ret;
        }
 
+       ret = devm_mutex_init(dev, &chip->mutex);
+       if (ret)
+               return ret;
+
        chip->num_leds = (unsigned long)i2c_get_match_data(client);
 
        chip->regulators[0].supply = "vin";
@@ -584,8 +588,6 @@ static int ktd202x_probe(struct i2c_client *client)
                return ret;
        }
 
-       mutex_init(&chip->mutex);
-
        return 0;
 }
 
@@ -594,8 +596,6 @@ static void ktd202x_remove(struct i2c_client *client)
        struct ktd202x *chip = i2c_get_clientdata(client);
 
        ktd202x_chip_disable(chip);
-
-       mutex_destroy(&chip->mutex);
 }
 
 static void ktd202x_shutdown(struct i2c_client *client)