* [PATCH] staging: greybus: light: initialize channel lock before registration
@ 2026-08-18 14:20 Runyu Xiao
2026-08-18 18:23 ` Greg Kroah-Hartman
0 siblings, 1 reply; 7+ messages in thread
From: Runyu Xiao @ 2026-08-18 14:20 UTC (permalink / raw)
To: Rui Miguel Silva
Cc: Johan Hovold, Alex Elder, Greg Kroah-Hartman, Kris Huang,
greybus-dev, linux-staging, linux-kernel, stable, Runyu Xiao,
Jianhao Xu
gb_lights_light_register() registers each channel before initializing
light->channels[i].lock. Channel registration exposes the LED class
device and its brightness callback, which later takes this mutex. A
concurrent brightness update can therefore hit an uninitialized lock.
Initialize the channel mutex before registering the channel so the
callback always sees a valid lock.
Fixes: cc43368a3cde ("greybus: lights: Control runtime pm suspend/resume on AP side")
Cc: stable@vger.kernel.org
Signed-off-by: Runyu Xiao <runyu.xiao@seu.edu.cn>
---
drivers/staging/greybus/light.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/staging/greybus/light.c b/drivers/staging/greybus/light.c
index 38c233a706c4..056ef6b0276e 100644
--- a/drivers/staging/greybus/light.c
+++ b/drivers/staging/greybus/light.c
@@ -1043,11 +1043,11 @@ static int gb_lights_light_register(struct gb_light *light)
* found.
*/
for (i = 0; i < light->channels_count; i++) {
+ mutex_init(&light->channels[i].lock);
+
ret = gb_lights_channel_register(&light->channels[i]);
if (ret < 0)
return ret;
-
- mutex_init(&light->channels[i].lock);
}
light->ready = true;
--
2.34.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH] staging: greybus: light: initialize channel lock before registration 2026-08-18 14:20 [PATCH] staging: greybus: light: initialize channel lock before registration Runyu Xiao @ 2026-08-18 18:23 ` Greg Kroah-Hartman [not found] ` <ANAASQBEK9Ye2X-O4oze*arv.3.1787142765226.Hmail.220255722@seu.edu.cn> 0 siblings, 1 reply; 7+ messages in thread From: Greg Kroah-Hartman @ 2026-08-18 18:23 UTC (permalink / raw) To: Runyu Xiao Cc: Rui Miguel Silva, Johan Hovold, Alex Elder, Kris Huang, greybus-dev, linux-staging, linux-kernel, stable, Jianhao Xu On Tue, Aug 18, 2026 at 10:20:20PM +0800, Runyu Xiao wrote: > gb_lights_light_register() registers each channel before initializing > light->channels[i].lock. Channel registration exposes the LED class > device and its brightness callback, which later takes this mutex. A > concurrent brightness update can therefore hit an uninitialized lock. > > Initialize the channel mutex before registering the channel so the > callback always sees a valid lock. > > Fixes: cc43368a3cde ("greybus: lights: Control runtime pm suspend/resume on AP side") > Cc: stable@vger.kernel.org > Signed-off-by: Runyu Xiao <runyu.xiao@seu.edu.cn> > --- > drivers/staging/greybus/light.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/staging/greybus/light.c b/drivers/staging/greybus/light.c > index 38c233a706c4..056ef6b0276e 100644 > --- a/drivers/staging/greybus/light.c > +++ b/drivers/staging/greybus/light.c > @@ -1043,11 +1043,11 @@ static int gb_lights_light_register(struct gb_light *light) > * found. > */ > for (i = 0; i < light->channels_count; i++) { > + mutex_init(&light->channels[i].lock); > + > ret = gb_lights_channel_register(&light->channels[i]); > if (ret < 0) > return ret; > - > - mutex_init(&light->channels[i].lock); > } > > light->ready = true; How was this found and tested? thanks, greg k-h ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <ANAASQBEK9Ye2X-O4oze*arv.3.1787142765226.Hmail.220255722@seu.edu.cn>]
* Re: [PATCH] staging: greybus: light: initialize channel lock before registration [not found] ` <ANAASQBEK9Ye2X-O4oze*arv.3.1787142765226.Hmail.220255722@seu.edu.cn> @ 2026-08-19 12:40 ` Greg Kroah-Hartman 2026-08-19 12:41 ` Greg Kroah-Hartman 1 sibling, 0 replies; 7+ messages in thread From: Greg Kroah-Hartman @ 2026-08-19 12:40 UTC (permalink / raw) To: Runyu Xiao Cc: Rui Miguel Silva, Johan Hovold, Alex Elder, Kris Huang, greybus-dev, linux-staging, linux-kernel, stable, Jianhao Xu On Wed, Aug 19, 2026 at 08:32:45PM +0800, Runyu Xiao wrote: > On Tue, Aug 18, 2026 at 20:23:10 +0200, Greg Kroah-Hartman wrote: > > How was this found and tested? > > > Found by code inspection: gb_lights_channel_register() publishes the > LED class device and its brightness callback before > mutex_init(&light->channels[i].lock) runs, so a concurrent brightness > update can take an uninitialized mutex. <snip> Don't send html email with tracking images in it to a public mailing list, they are rejected and generally considered bad-form. greg k-h ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] staging: greybus: light: initialize channel lock before registration [not found] ` <ANAASQBEK9Ye2X-O4oze*arv.3.1787142765226.Hmail.220255722@seu.edu.cn> 2026-08-19 12:40 ` Greg Kroah-Hartman @ 2026-08-19 12:41 ` Greg Kroah-Hartman 2026-08-19 13:21 ` Runyu Xiao 1 sibling, 1 reply; 7+ messages in thread From: Greg Kroah-Hartman @ 2026-08-19 12:41 UTC (permalink / raw) To: Runyu Xiao Cc: Rui Miguel Silva, Johan Hovold, Alex Elder, Kris Huang, greybus-dev, linux-staging, linux-kernel, stable, Jianhao Xu On Wed, Aug 19, 2026 at 08:32:45PM +0800, Runyu Xiao wrote: > On Tue, Aug 18, 2026 at 20:23:10 +0200, Greg Kroah-Hartman wrote: > > How was this found and tested? > > > Found by code inspection: gb_lights_channel_register() publishes the > LED class device and its brightness callback before > mutex_init(&light->channels[i].lock) runs, so a concurrent brightness > update can take an uninitialized mutex. What tool did this inspection? A LLM? > Tested by reproducing that code shape in a minimal out-of-tree module > under QEMU (kernel 6.1.66 with CONFIG_DEBUG_MUTEXES=y and > CONFIG_DEBUG_LOCK_ALLOC=y), since the real driver needs greybus/LED > hardware I don't have. The module kzalloc's a channel, registers > (publishes) it, and runs the brightness callback, which takes the > embedded mutex: > > > - before the fix, mutex_init() runs after register, so the callback > locks the still-zeroed mutex and trips > > > DEBUG_LOCKS_WARN_ON(lock->magic != lock) > WARNING: CPU: 1 PID: 188 at kernel/locking/mutex.c:582 __mutex_lock+0x712/0xd20 > > > - after the fix, mutex_init() runs before register and the same > trigger path produces no warning. But that isn't testing anything at all. And why 6.1.66? That's not what new patches need to be made against, as it's years old. > The real driver hits this as a race (a concurrent brightness update), > whereas the reproducer runs the callback synchronously during registration > to make it deterministic; both leave the callback observing an > uninitialized lock. What "reproducer"? Again, was this done by a LLM? Where is the "reproducer"? thanks, greg k-h ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] staging: greybus: light: initialize channel lock before registration 2026-08-19 12:41 ` Greg Kroah-Hartman @ 2026-08-19 13:21 ` Runyu Xiao 2026-08-19 13:29 ` Greg Kroah-Hartman 0 siblings, 1 reply; 7+ messages in thread From: Runyu Xiao @ 2026-08-19 13:21 UTC (permalink / raw) To: Greg Kroah-Hartman Cc: Rui Miguel Silva, Johan Hovold, Alex Elder, Kris Huang, greybus-dev, linux-staging, linux-kernel You're right, and "tested" was the wrong word in my reply. The finding here is from code inspection, not from a runtime test. The path I checked is: gb_lights_channel_register() -> led_classdev_register() publishes cdev->brightness_set_blocking (= gb_brightness_set() -> __gb_lights_brightness_set() -> __gb_lights_led_brightness_set() -> mutex_lock(&channel->lock)) but mutex_init(&channel->lock) only runs after gb_lights_channel_register() returns, and that is the only place where channel->lock is initialized. So the lock is published before it is initialized. The QEMU module I mentioned does not exercise this driver. It only shows that taking an uninitialized mutex triggers the expected DEBUG_LOCKS_WARN_ON(lock->magic != lock), so I should not have described it as driver testing or as a reproducer for this driver. And yes, 6.1.66 was only the kernel version in that local QEMU setup. The patch itself was made and compile-checked against current mainline, and I'll keep validation against mainline for future submissions. The initial report came from PatchProof, a static-analysis pipeline I am building for lock-API misuse. It flagged this publish-before-init ordering, and I then manually verified the call path above. I did use an LLM as an assistant during the workflow, but the finding itself was from the checker and the patch I sent was based on my manual review of the code. Thanks, Runyu Xiao ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] staging: greybus: light: initialize channel lock before registration 2026-08-19 13:21 ` Runyu Xiao @ 2026-08-19 13:29 ` Greg Kroah-Hartman 2026-08-19 13:39 ` Runyu Xiao 0 siblings, 1 reply; 7+ messages in thread From: Greg Kroah-Hartman @ 2026-08-19 13:29 UTC (permalink / raw) To: Runyu Xiao Cc: Rui Miguel Silva, Johan Hovold, Alex Elder, Kris Huang, greybus-dev, linux-staging, linux-kernel On Wed, Aug 19, 2026 at 09:21:08PM +0800, Runyu Xiao wrote: > You're right, and "tested" was the wrong word in my reply. Sorry, I have no context :( Remember, some of us get thousands of emails a day. > The finding here is from code inspection, not from a runtime test. The > path I checked is: > > gb_lights_channel_register() > -> led_classdev_register() > publishes cdev->brightness_set_blocking > (= gb_brightness_set() > -> __gb_lights_brightness_set() > -> __gb_lights_led_brightness_set() > -> mutex_lock(&channel->lock)) > > but mutex_init(&channel->lock) only runs after > gb_lights_channel_register() returns, and that is the only place where > channel->lock is initialized. So the lock is published before it is > initialized. > > The QEMU module I mentioned does not exercise this driver. It only shows > that taking an uninitialized mutex triggers the expected > DEBUG_LOCKS_WARN_ON(lock->magic != lock), so I should not have described > it as driver testing or as a reproducer for this driver. > > And yes, 6.1.66 was only the kernel version in that local QEMU setup. The > patch itself was made and compile-checked against current mainline, and > I'll keep validation against mainline for future submissions. Just build testing against a many-year-old kernel is a sure way to ensure that nothing will actually work at all :( > The initial report came from PatchProof, a static-analysis pipeline I am > building for lock-API misuse. It flagged this publish-before-init ordering, > and I then manually verified the call path above. I did use an LLM as an > assistant during the workflow, but the finding itself was from the checker > and the patch I sent was based on my manual review of the code. Please read the archives for why we don't take LLM patches for drivers/staging/ unless you can test the change on real hardware. thanks, greg k-h ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] staging: greybus: light: initialize channel lock before registration 2026-08-19 13:29 ` Greg Kroah-Hartman @ 2026-08-19 13:39 ` Runyu Xiao 0 siblings, 0 replies; 7+ messages in thread From: Runyu Xiao @ 2026-08-19 13:39 UTC (permalink / raw) To: Greg Kroah-Hartman Cc: Rui Miguel Silva, Johan Hovold, Alex Elder, Kris Huang, greybus-dev, linux-staging, linux-kernel On Wed, Aug 19, 2026 at 09:29:11PM +0800, Greg Kroah-Hartman wrote: > Please read the archives for why we don't take LLM patches for > drivers/staging/ unless you can test the change on real hardware. Understood — I'll drop this patch, and only submit changes I can build and test against current mainline (and on real hardware where possible) going forward. Thanks for the guidance. Thanks, Runyu Xiao ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-08-19 13:39 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-18 14:20 [PATCH] staging: greybus: light: initialize channel lock before registration Runyu Xiao
2026-08-18 18:23 ` Greg Kroah-Hartman
[not found] ` <ANAASQBEK9Ye2X-O4oze*arv.3.1787142765226.Hmail.220255722@seu.edu.cn>
2026-08-19 12:40 ` Greg Kroah-Hartman
2026-08-19 12:41 ` Greg Kroah-Hartman
2026-08-19 13:21 ` Runyu Xiao
2026-08-19 13:29 ` Greg Kroah-Hartman
2026-08-19 13:39 ` Runyu Xiao
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox