* [PATCH] revocable: Remove redundant synchronize_srcu() call @ 2026-01-21 4:02 Tzung-Bi Shih 2026-01-21 10:38 ` Bartosz Golaszewski 0 siblings, 1 reply; 7+ messages in thread From: Tzung-Bi Shih @ 2026-01-21 4:02 UTC (permalink / raw) To: Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich Cc: linux-kernel, tzungbi, Bartosz Golaszewski When allocating a revocable provider via revocable_provider_alloc(), there is no revocable consumers (i.e., RCU readers) yet. Remove the redundant synchronize_srcu() call to save cycles. Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org> --- To address the performance impact reported in https://lore.kernel.org/linux-gpio/CAMRc=McrFa42mNWmZtD1HKKKZ+USUKpQAAME50wbfxPM7L72gA@mail.gmail.com/. drivers/base/revocable.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/base/revocable.c b/drivers/base/revocable.c index f6cece275aac..b068e18a847d 100644 --- a/drivers/base/revocable.c +++ b/drivers/base/revocable.c @@ -99,7 +99,6 @@ struct revocable_provider *revocable_provider_alloc(void *res) init_srcu_struct(&rp->srcu); rcu_assign_pointer(rp->res, res); - synchronize_srcu(&rp->srcu); kref_init(&rp->kref); return rp; -- 2.52.0.457.g6b5491de43-goog ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] revocable: Remove redundant synchronize_srcu() call 2026-01-21 4:02 [PATCH] revocable: Remove redundant synchronize_srcu() call Tzung-Bi Shih @ 2026-01-21 10:38 ` Bartosz Golaszewski 2026-01-21 12:34 ` Tzung-Bi Shih 0 siblings, 1 reply; 7+ messages in thread From: Bartosz Golaszewski @ 2026-01-21 10:38 UTC (permalink / raw) To: Tzung-Bi Shih Cc: Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich, linux-kernel On Wed, Jan 21, 2026 at 5:03 AM Tzung-Bi Shih <tzungbi@kernel.org> wrote: > > When allocating a revocable provider via revocable_provider_alloc(), > there is no revocable consumers (i.e., RCU readers) yet. Remove the > redundant synchronize_srcu() call to save cycles. > > Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org> > --- > To address the performance impact reported in > https://lore.kernel.org/linux-gpio/CAMRc=McrFa42mNWmZtD1HKKKZ+USUKpQAAME50wbfxPM7L72gA@mail.gmail.com/. > > drivers/base/revocable.c | 1 - > 1 file changed, 1 deletion(-) > > diff --git a/drivers/base/revocable.c b/drivers/base/revocable.c > index f6cece275aac..b068e18a847d 100644 > --- a/drivers/base/revocable.c > +++ b/drivers/base/revocable.c > @@ -99,7 +99,6 @@ struct revocable_provider *revocable_provider_alloc(void *res) > > init_srcu_struct(&rp->srcu); > rcu_assign_pointer(rp->res, res); > - synchronize_srcu(&rp->srcu); > kref_init(&rp->kref); > > return rp; > -- > 2.52.0.457.g6b5491de43-goog > Do you have an up-to-date integration branch with all the series and fixes you posted that I could use for testing with GPIO? Bart ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] revocable: Remove redundant synchronize_srcu() call 2026-01-21 10:38 ` Bartosz Golaszewski @ 2026-01-21 12:34 ` Tzung-Bi Shih 2026-01-21 15:18 ` Bartosz Golaszewski 0 siblings, 1 reply; 7+ messages in thread From: Tzung-Bi Shih @ 2026-01-21 12:34 UTC (permalink / raw) To: Bartosz Golaszewski Cc: Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich, linux-kernel On Wed, Jan 21, 2026 at 11:38:18AM +0100, Bartosz Golaszewski wrote: > On Wed, Jan 21, 2026 at 5:03 AM Tzung-Bi Shih <tzungbi@kernel.org> wrote: > > > > When allocating a revocable provider via revocable_provider_alloc(), > > there is no revocable consumers (i.e., RCU readers) yet. Remove the > > redundant synchronize_srcu() call to save cycles. > > > > Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org> > > --- > > To address the performance impact reported in > > https://lore.kernel.org/linux-gpio/CAMRc=McrFa42mNWmZtD1HKKKZ+USUKpQAAME50wbfxPM7L72gA@mail.gmail.com/. > > > > drivers/base/revocable.c | 1 - > > 1 file changed, 1 deletion(-) > > > > diff --git a/drivers/base/revocable.c b/drivers/base/revocable.c > > index f6cece275aac..b068e18a847d 100644 > > --- a/drivers/base/revocable.c > > +++ b/drivers/base/revocable.c > > @@ -99,7 +99,6 @@ struct revocable_provider *revocable_provider_alloc(void *res) > > > > init_srcu_struct(&rp->srcu); > > rcu_assign_pointer(rp->res, res); > > - synchronize_srcu(&rp->srcu); > > kref_init(&rp->kref); > > > > return rp; > > -- > > 2.52.0.457.g6b5491de43-goog > > > > Do you have an up-to-date integration branch with all the series and > fixes you posted that I could use for testing with GPIO? Please use https://git.kernel.org/pub/scm/linux/kernel/git/tzungbi/chrome-platform.git/log/?h=gpio_rev for the purpose which is based on driver-core-next and gpio/for-current branches. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] revocable: Remove redundant synchronize_srcu() call 2026-01-21 12:34 ` Tzung-Bi Shih @ 2026-01-21 15:18 ` Bartosz Golaszewski 2026-01-21 16:04 ` Tzung-Bi Shih 2026-01-21 16:52 ` Tzung-Bi Shih 0 siblings, 2 replies; 7+ messages in thread From: Bartosz Golaszewski @ 2026-01-21 15:18 UTC (permalink / raw) To: Tzung-Bi Shih Cc: Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich, linux-kernel, Bartosz Golaszewski On Wed, 21 Jan 2026 13:34:15 +0100, Tzung-Bi Shih <tzungbi@kernel.org> said: > On Wed, Jan 21, 2026 at 11:38:18AM +0100, Bartosz Golaszewski wrote: >> On Wed, Jan 21, 2026 at 5:03 AM Tzung-Bi Shih <tzungbi@kernel.org> wrote: >> > >> > When allocating a revocable provider via revocable_provider_alloc(), >> > there is no revocable consumers (i.e., RCU readers) yet. Remove the >> > redundant synchronize_srcu() call to save cycles. >> > >> > Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org> >> > --- >> > To address the performance impact reported in >> > https://lore.kernel.org/linux-gpio/CAMRc=McrFa42mNWmZtD1HKKKZ+USUKpQAAME50wbfxPM7L72gA@mail.gmail.com/. >> > >> > drivers/base/revocable.c | 1 - >> > 1 file changed, 1 deletion(-) >> > >> > diff --git a/drivers/base/revocable.c b/drivers/base/revocable.c >> > index f6cece275aac..b068e18a847d 100644 >> > --- a/drivers/base/revocable.c >> > +++ b/drivers/base/revocable.c >> > @@ -99,7 +99,6 @@ struct revocable_provider *revocable_provider_alloc(void *res) >> > >> > init_srcu_struct(&rp->srcu); >> > rcu_assign_pointer(rp->res, res); >> > - synchronize_srcu(&rp->srcu); >> > kref_init(&rp->kref); >> > >> > return rp; >> > -- >> > 2.52.0.457.g6b5491de43-goog >> > >> >> Do you have an up-to-date integration branch with all the series and >> fixes you posted that I could use for testing with GPIO? > > Please use > https://git.kernel.org/pub/scm/linux/kernel/git/tzungbi/chrome-platform.git/log/?h=gpio_rev > for the purpose which is based on driver-core-next and gpio/for-current > branches. > With this branch, I'm seeing the following KASAN splat when running libgpiod tests: ================================================================== BUG: KASAN: use-after-free in notifier_call_chain+0x222/0x270 Read of size 8 at addr ffff888103ce6490 by task gpiod-test/479 CPU: 2 UID: 0 PID: 479 Comm: gpiod-test Not tainted 6.19.0-rc6-yocto-standard+ #2 PREEMPT(full) Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.17.0-0-gb52ca86e094d-prebuilt.qemu.org 04/01/2014 Call Trace: <TASK> dump_stack_lvl+0x63/0x90 print_report+0x153/0x4c7 ? __virt_addr_valid+0x225/0x4c0 ? kasan_addr_to_slab+0x11/0x80 kasan_report+0x103/0x140 ? notifier_call_chain+0x222/0x270 ? notifier_call_chain+0x222/0x270 __asan_report_load8_noabort+0x18/0x20 notifier_call_chain+0x222/0x270 blocking_notifier_call_chain+0x70/0xb0 gpiolib_cdev_unregister+0x5a/0x70 gpiochip_remove+0x48e/0x5a0 ? __kasan_slab_free+0x84/0xa0 devm_gpio_chip_release+0x12/0x20 devm_action_release+0x4f/0x80 ? __kasan_check_read+0x15/0x20 release_nodes+0xb6/0x320 ? trace_hardirqs_on+0x8c/0x160 devres_release_all+0x111/0x190 ? __pfx_devres_release_all+0x10/0x10 ? sysfs_remove_file_ns+0x56/0xa0 device_unbind_cleanup+0x1b/0x1f0 device_release_driver_internal+0x3e3/0x530 ? klist_devices_put+0x38/0x50 device_release_driver+0x16/0x20 bus_remove_device+0x1f3/0x300 device_del+0x3d3/0xdd0 ? __pfx_device_del+0x10/0x10 platform_device_del+0x3c/0x210 platform_device_unregister+0x16/0x40 dev_sync_probe_unregister+0x30/0xa0 [dev_sync_probe] gpio_sim_device_deactivate+0x75/0xf0 [gpio_sim] gpio_sim_device_config_live_store+0x4cf/0x11a0 [gpio_sim] ? lock_release+0xdd/0x2b0 ? configfs_write_iter+0x1e4/0x460 [configfs] ? __pfx_gpio_sim_device_config_live_store+0x10/0x10 [gpio_sim] ? __kasan_check_write+0x18/0x20 ? down_read+0x1a8/0x4a0 ? __pfx_down_read+0x10/0x10 configfs_write_iter+0x2b8/0x460 [configfs] vfs_write+0x53e/0x1120 ? fd_install+0x17b/0x360 ? putname+0xc1/0x140 ? __pfx_vfs_write+0x10/0x10 ? do_sys_openat2+0x127/0x1a0 ? __fput+0x534/0xa70 ksys_write+0x105/0x230 ? __pfx_ksys_write+0x10/0x10 ? __pfx_fput_close_sync+0x10/0x10 ? __pfx___x64_sys_openat+0x10/0x10 __x64_sys_write+0x76/0xd0 ? trace_hardirqs_on+0x8c/0x160 x64_sys_call+0x7d/0x1da0 do_syscall_64+0x74/0x3c0 entry_SYSCALL_64_after_hwframe+0x76/0x7e RIP: 0033:0x7fb4bbbb8dda Code: 08 03 00 00 59 5e 48 83 f8 fc 75 1e 83 e2 39 83 fa 08 75 16 e8 27 ff ff ff 0f 1f 80 00 00 00 00 49 89 ca 48 8b 44 24 20 0f 05 <48> 83 c4 18 c3 90 f3 0f 1e fa 48 83 ec 10 ff 74 24 18 e8 5f ff ff RSP: 002b:00007ffcbfc5be40 EFLAGS: 00000202 ORIG_RAX: 0000000000000001 RAX: ffffffffffffffda RBX: 00007fb4bc0ce07f RCX: 00007fb4bbbb8dda RDX: 0000000000000002 RSI: 00007fb4bc0ce07f RDI: 0000000000000008 RBP: 0000000000000008 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000202 R12: 0000000000000002 R13: 0000563121bd6630 R14: 0000000000000001 R15: 0000000000000000 </TASK> The buggy address belongs to the physical page: page: refcount:0 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x103ce6 flags: 0x8000000000000000(zone=2) raw: 8000000000000000 0000000000000000 ffffea00040f3990 0000000000000000 raw: 0000000000000000 0000000000000000 00000000ffffffff 0000000000000000 page dumped because: kasan: bad access detected Memory state around the buggy address: ffff888103ce6380: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ffff888103ce6400: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff >ffff888103ce6480: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ^ ffff888103ce6500: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ffff888103ce6580: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ================================================================== Disabling lock debugging due to kernel taint ------------[ cut here ]------------ refcount_t: addition on 0; use-after-free. WARNING: lib/refcount.c:25 at refcount_warn_saturate+0xd4/0xf0, CPU#6: gpio-manager/320 Modules linked in: gpio_sim dev_sync_probe cfg80211 parport_pc parport nfsd sch_fq_codel fuse configfs CPU: 6 UID: 996 PID: 320 Comm: gpio-manager Tainted: G B 6.19.0-rc6-yocto-standard+ #2 PREEMPT(full) Tainted: [B]=BAD_PAGE Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.17.0-0-gb52ca86e094d-prebuilt.qemu.org 04/01/2014 RIP: 0010:refcount_warn_saturate+0xd4/0xf0 Code: 67 48 0f b9 3a 5b 41 5c 5d c3 cc cc cc cc 48 8d 3d 11 ef 7a 03 67 48 0f b9 3a 5b 41 5c 5d c3 cc cc cc cc 48 8d 3d 0c ef 7a 03 <67> 48 0f b9 3a 5b 41 5c 5d e9 ce 84 f5 01 48 89 df e8 06 b8 1c ff RSP: 0018:ffff88810a877858 EFLAGS: 00010246 RAX: 0000000000000000 RBX: ffff888103d13c50 RCX: 0000000000000000 RDX: 0000000000000001 RSI: ffffffffae5f485a RDI: ffffffffb1da3750 RBP: ffff88810a877868 R08: 0000000000000292 R09: ffffed10207a278a R10: 0000000000000003 R11: 0000000000000011 R12: 0000000000000002 R13: ffff888107b4e220 R14: ffffffffb0915660 R15: ffff88810148c000 FS: 00007ffa8c165c80(0000) GS:ffff8881a8a83000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000556be771dae0 CR3: 0000000117240005 CR4: 00000000003706f0 Call Trace: <TASK> revocable_alloc+0xc8/0xf0 gpio_chrdev_open+0x93/0x510 ? __kasan_check_read+0x15/0x20 ? do_raw_spin_unlock+0x5d/0x250 chrdev_open+0x1f3/0x620 ? __pfx_chrdev_open+0x10/0x10 ? do_raw_spin_unlock+0x5d/0x250 do_dentry_open+0x469/0x11a0 ? devcgroup_check_permission+0x171/0x360 ? __pfx_chrdev_open+0x10/0x10 vfs_open+0x7a/0x440 ? may_open+0xec/0x340 ? complete_walk+0xdd/0x2a0 path_openat+0x196f/0x3000 ? arch_stack_walk+0xb7/0x100 ? __pfx_path_openat+0x10/0x10 ? stack_trace_save+0x96/0xd0 ? __pfx_stack_trace_save+0x10/0x10 ? stack_depot_save_flags+0x2c/0xa20 do_filp_open+0x1c5/0x460 ? __kasan_check_write+0x18/0x20 ? do_raw_spin_lock+0x125/0x270 ? __pfx_do_filp_open+0x10/0x10 ? strncpy_from_user+0x3f/0x210 do_sys_openat2+0x102/0x1a0 ? __pfx_do_sys_openat2+0x10/0x10 ? __seccomp_filter+0x2a6/0xc40 ? __pfx___seccomp_filter+0x10/0x10 __x64_sys_openat+0x10c/0x240 ? __pfx_do_readlinkat+0x10/0x10 ? __pfx___x64_sys_openat+0x10/0x10 ? __secure_computing+0x157/0x250 ? __kasan_check_read+0x15/0x20 x64_sys_call+0x1283/0x1da0 do_syscall_64+0x74/0x3c0 entry_SYSCALL_64_after_hwframe+0x76/0x7e RIP: 0033:0x7ffa8c4c6142 Code: 08 0f 85 d1 4b ff ff 49 89 fb 48 89 f0 48 89 d7 48 89 ce 4c 89 c2 4d 89 ca 4c 8b 44 24 08 4c 8b 4c 24 10 4c 89 5c 24 08 0f 05 <c3> 66 2e 0f 1f 84 00 00 00 00 00 66 2e 0f 1f 84 00 00 00 00 00 66 RSP: 002b:00007ffc1c0e8fd8 EFLAGS: 00000246 ORIG_RAX: 0000000000000101 RAX: ffffffffffffffda RBX: 0000560fd4f96140 RCX: 00007ffa8c4c6142 RDX: 0000000000080002 RSI: 0000560fd4f96140 RDI: ffffffffffffff9c RBP: 0000560fd4f96c30 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000001 R13: 0000000000000000 R14: 0000560fd4f83940 R15: 00007ffc1c0e9280 </TASK> irq event stamp: 169812 hardirqs last enabled at (169811): [<ffffffffb054880b>] _raw_spin_unlock_irqrestore+0x4b/0x60 hardirqs last disabled at (169812): [<ffffffffb0525ed5>] __schedule+0x1395/0x4140 softirqs last enabled at (169688): [<ffffffffaf854784>] __alloc_skb+0x2c4/0x3a0 softirqs last disabled at (169686): [<ffffffffaf854784>] __alloc_skb+0x2c4/0x3a0 ---[ end trace 0000000000000000 ]--- Oops: general protection fault, probably for non-canonical address 0xe019ad6c7515063f: 0000 [#1] SMP KASAN PTI KASAN: maybe wild-memory-access in range [0x00cd8b63a8a831f8-0x00cd8b63a8a831ff] CPU: 6 UID: 996 PID: 320 Comm: gpio-manager Tainted: G B W 6.19.0-rc6-yocto-standard+ #2 PREEMPT(full) Tainted: [B]=BAD_PAGE, [W]=WARN Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.17.0-0-gb52ca86e094d-prebuilt.qemu.org 04/01/2014 RIP: 0010:__srcu_check_read_flavor+0x74/0x220 Code: 48 89 fe 48 c1 ee 03 80 3c 06 00 0f 85 9b 01 00 00 48 b8 00 00 00 00 00 fc ff df 49 03 50 08 4c 8d 4a 20 4c 89 ce 48 c1 ee 03 <0f> b6 34 06 4c 89 c8 83 e0 07 83 c0 03 40 38 f0 7c 09 40 84 f6 0f RSP: 0018:ffff88810a877ce8 EFLAGS: 00010207 RAX: dffffc0000000000 RBX: ffff888103d13c00 RCX: 0000000000000001 RDX: 00cd8b63a8a831df RSI: 0019b16c7515063f RDI: ffff88810a877ca0 RBP: ffff88810a877d10 R08: ffff888103d13c00 R09: 00cd8b63a8a831ff R10: ffff888110e6c700 R11: ffff888107b4e220 R12: ffff888102756320 R13: ffff888103d13c18 R14: 000000008044b401 R15: ffff88810148c000 FS: 00007ffa8c165c80(0000) GS:ffff8881a8a83000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000556be771dae0 CR3: 0000000117240005 CR4: 00000000003706f0 Call Trace: <TASK> revocable_try_access+0x47/0x150 gpio_ioctl+0xdd/0xc20 ? __pfx_do_vfs_ioctl+0x10/0x10 ? lock_release+0x1d6/0x2b0 ? __pfx_gpio_ioctl+0x10/0x10 ? __kasan_check_read+0x15/0x20 ? lock_acquire+0x223/0x2b0 ? lock_release+0x1d6/0x2b0 ? __fget_files+0x1b8/0x320 __x64_sys_ioctl+0x143/0x1d0 ? __secure_computing+0x157/0x250 x64_sys_call+0xf3c/0x1da0 do_syscall_64+0x74/0x3c0 entry_SYSCALL_64_after_hwframe+0x76/0x7e RIP: 0033:0x7ffa8c5381ac Code: 1e fa 48 8d 44 24 08 48 89 54 24 e0 48 89 44 24 c0 48 8d 44 24 d0 48 89 44 24 c8 b8 10 00 00 00 c7 44 24 b8 10 00 00 00 0f 05 <89> c2 3d 00 f0 ff ff 77 0b 89 d0 c3 0f 1f 84 00 00 00 00 00 48 8b RSP: 002b:00007ffc1c0e9578 EFLAGS: 00000246 ORIG_RAX: 0000000000000010 RAX: ffffffffffffffda RBX: 0000560fd4f96c30 RCX: 00007ffa8c5381ac RDX: 00007ffc1c0e9590 RSI: 000000008044b401 RDI: 000000000000000a RBP: 00007ffc1c0e95f0 R08: 00007ffc1c0e9438 R09: 0000000000000000 R10: 00000000ffffffff R11: 0000000000000246 R12: 0000560fd4f96c30 R13: 0000560fd4f787e0 R14: 00007ffc1c0e96a8 R15: 00007ffc1c0e9640 </TASK> Modules linked in: gpio_sim dev_sync_probe cfg80211 parport_pc parport nfsd sch_fq_codel fuse configfs ---[ end trace 0000000000000000 ]--- RIP: 0010:__srcu_check_read_flavor+0x74/0x220 Code: 48 89 fe 48 c1 ee 03 80 3c 06 00 0f 85 9b 01 00 00 48 b8 00 00 00 00 00 fc ff df 49 03 50 08 4c 8d 4a 20 4c 89 ce 48 c1 ee 03 <0f> b6 34 06 4c 89 c8 83 e0 07 83 c0 03 40 38 f0 7c 09 40 84 f6 0f RSP: 0018:ffff88810a877ce8 EFLAGS: 00010207 RAX: dffffc0000000000 RBX: ffff888103d13c00 RCX: 0000000000000001 RDX: 00cd8b63a8a831df RSI: 0019b16c7515063f RDI: ffff88810a877ca0 RBP: ffff88810a877d10 R08: ffff888103d13c00 R09: 00cd8b63a8a831ff R10: ffff888110e6c700 R11: ffff888107b4e220 R12: ffff888102756320 R13: ffff888103d13c18 R14: 000000008044b401 R15: ffff88810148c000 FS: 00007ffa8c165c80(0000) GS:ffff8881a8a83000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000556be771dae0 CR3: 0000000117240005 CR4: 00000000003706f0 Thanks, Bartosz ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] revocable: Remove redundant synchronize_srcu() call 2026-01-21 15:18 ` Bartosz Golaszewski @ 2026-01-21 16:04 ` Tzung-Bi Shih 2026-01-21 16:58 ` Bartosz Golaszewski 2026-01-21 16:52 ` Tzung-Bi Shih 1 sibling, 1 reply; 7+ messages in thread From: Tzung-Bi Shih @ 2026-01-21 16:04 UTC (permalink / raw) To: Bartosz Golaszewski Cc: Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich, linux-kernel On Wed, Jan 21, 2026 at 03:18:12PM +0000, Bartosz Golaszewski wrote: > On Wed, 21 Jan 2026 13:34:15 +0100, Tzung-Bi Shih <tzungbi@kernel.org> said: > > On Wed, Jan 21, 2026 at 11:38:18AM +0100, Bartosz Golaszewski wrote: > >> On Wed, Jan 21, 2026 at 5:03 AM Tzung-Bi Shih <tzungbi@kernel.org> wrote: > >> > > >> > When allocating a revocable provider via revocable_provider_alloc(), > >> > there is no revocable consumers (i.e., RCU readers) yet. Remove the > >> > redundant synchronize_srcu() call to save cycles. > >> > > >> > Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org> > >> > --- > >> > To address the performance impact reported in > >> > https://lore.kernel.org/linux-gpio/CAMRc=McrFa42mNWmZtD1HKKKZ+USUKpQAAME50wbfxPM7L72gA@mail.gmail.com/. > >> > > >> > drivers/base/revocable.c | 1 - > >> > 1 file changed, 1 deletion(-) > >> > > >> > diff --git a/drivers/base/revocable.c b/drivers/base/revocable.c > >> > index f6cece275aac..b068e18a847d 100644 > >> > --- a/drivers/base/revocable.c > >> > +++ b/drivers/base/revocable.c > >> > @@ -99,7 +99,6 @@ struct revocable_provider *revocable_provider_alloc(void *res) > >> > > >> > init_srcu_struct(&rp->srcu); > >> > rcu_assign_pointer(rp->res, res); > >> > - synchronize_srcu(&rp->srcu); > >> > kref_init(&rp->kref); > >> > > >> > return rp; > >> > -- > >> > 2.52.0.457.g6b5491de43-goog > >> > > >> > >> Do you have an up-to-date integration branch with all the series and > >> fixes you posted that I could use for testing with GPIO? > > > > Please use > > https://git.kernel.org/pub/scm/linux/kernel/git/tzungbi/chrome-platform.git/log/?h=gpio_rev > > for the purpose which is based on driver-core-next and gpio/for-current > > branches. > > > > With this branch, I'm seeing the following KASAN splat when running libgpiod > tests: > > ================================================================== > BUG: KASAN: use-after-free in notifier_call_chain+0x222/0x270 > Read of size 8 at addr ffff888103ce6490 by task gpiod-test/479 > > CPU: 2 UID: 0 PID: 479 Comm: gpiod-test Not tainted > 6.19.0-rc6-yocto-standard+ #2 PREEMPT(full) > Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS > rel-1.17.0-0-gb52ca86e094d-prebuilt.qemu.org 04/01/2014 > Call Trace: > <TASK> > dump_stack_lvl+0x63/0x90 > print_report+0x153/0x4c7 > ? __virt_addr_valid+0x225/0x4c0 > ? kasan_addr_to_slab+0x11/0x80 > kasan_report+0x103/0x140 > ? notifier_call_chain+0x222/0x270 > ? notifier_call_chain+0x222/0x270 > __asan_report_load8_noabort+0x18/0x20 > notifier_call_chain+0x222/0x270 > blocking_notifier_call_chain+0x70/0xb0 > gpiolib_cdev_unregister+0x5a/0x70 > gpiochip_remove+0x48e/0x5a0 Weird, I didn't see the same error. What I roughly tried: (host) $ git checkout origin/gpio_rev (host) $ cat myconfig CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y CONFIG_KASAN=y (host) $ vng -k --config tools/testing/selftests/gpio/config \ --config myconfig (host) $ vng -b (host) $ vng --user root (vng) $ zgrep CONFIG_KASAN= /proc/config.gz CONFIG_KASAN=y (vng) $ ./libgpiod-2.2.2/tests/gpiod-test TAP version 14 ... ok 1 /gpiod/chip/open_chip_good ok 2 /gpiod/chip/open_chip_nonexistent ok 3 /gpiod/chip/open_chip_not_a_character_device ... ok 104 /gpiod/request-config/default_config ok 105 /gpiod/request-config/set_consumer ok 106 /gpiod/request-config/set_event_buffer_size (vng) $ dmesg Did I miss any configurations? ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] revocable: Remove redundant synchronize_srcu() call 2026-01-21 16:04 ` Tzung-Bi Shih @ 2026-01-21 16:58 ` Bartosz Golaszewski 0 siblings, 0 replies; 7+ messages in thread From: Bartosz Golaszewski @ 2026-01-21 16:58 UTC (permalink / raw) To: Tzung-Bi Shih Cc: Bartosz Golaszewski, Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich, linux-kernel On Wed, 21 Jan 2026 17:04:00 +0100, Tzung-Bi Shih <tzungbi@kernel.org> said: > > Weird, I didn't see the same error. What I roughly tried: > > (host) $ git checkout origin/gpio_rev > (host) $ cat myconfig > CONFIG_IKCONFIG=y > CONFIG_IKCONFIG_PROC=y > CONFIG_KASAN=y > (host) $ vng -k --config tools/testing/selftests/gpio/config \ > --config myconfig > (host) $ vng -b > (host) $ vng --user root > > (vng) $ zgrep CONFIG_KASAN= /proc/config.gz > CONFIG_KASAN=y > (vng) $ ./libgpiod-2.2.2/tests/gpiod-test > TAP version 14 > ... > ok 1 /gpiod/chip/open_chip_good > ok 2 /gpiod/chip/open_chip_nonexistent > ok 3 /gpiod/chip/open_chip_not_a_character_device > ... > ok 104 /gpiod/request-config/default_config > ok 105 /gpiod/request-config/set_consumer > ok 106 /gpiod/request-config/set_event_buffer_size > (vng) $ dmesg > > > Did I miss any configurations? > I'm using an x86-64 qemu VM with the following config against your branch: CONFIG_SYSVIPC=y CONFIG_POSIX_MQUEUE=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT=y CONFIG_PREEMPT=y CONFIG_BSD_PROCESS_ACCT=y CONFIG_BSD_PROCESS_ACCT_V3=y CONFIG_TASKSTATS=y CONFIG_TASK_DELAY_ACCT=y CONFIG_TASK_XACCT=y CONFIG_TASK_IO_ACCOUNTING=y CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y CONFIG_CGROUPS=y CONFIG_MEMCG=y CONFIG_BLK_CGROUP=y CONFIG_CGROUP_SCHED=y CONFIG_CGROUP_PIDS=y CONFIG_CGROUP_FREEZER=y CONFIG_CPUSETS=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_PERF=y CONFIG_CGROUP_BPF=y CONFIG_CGROUP_DEBUG=y CONFIG_NAMESPACES=y CONFIG_USER_NS=y CONFIG_BLK_DEV_INITRD=y CONFIG_EXPERT=y CONFIG_SMP=y CONFIG_X86_AMD_PLATFORM_DEVICE=y CONFIG_HYPERVISOR_GUEST=y CONFIG_PARAVIRT=y CONFIG_X86_MSR=y CONFIG_X86_CPUID=y CONFIG_X86_CHECK_BIOS_CORRUPTION=y CONFIG_EFI=y CONFIG_EFI_STUB=y CONFIG_HZ_1000=y CONFIG_PM_DEBUG=y CONFIG_PM_ADVANCED_DEBUG=y # CONFIG_ACPI_DEBUG is not set CONFIG_CPU_FREQ_STAT=y CONFIG_CPU_FREQ_GOV_ONDEMAND=y CONFIG_X86_ACPI_CPUFREQ=y CONFIG_INTEL_IDLE=y CONFIG_IA32_EMULATION=y CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_PARTITION_ADVANCED=y CONFIG_BINFMT_MISC=m CONFIG_NET=y CONFIG_PACKET=y CONFIG_UNIX=y CONFIG_XFRM_USER=m CONFIG_XFRM_SUB_POLICY=y CONFIG_NET_KEY=m CONFIG_NET_KEY_MIGRATE=y CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y CONFIG_IP_PNP_RARP=y CONFIG_NET_IPIP=m CONFIG_NET_IPGRE_DEMUX=m CONFIG_NET_IPGRE=m CONFIG_NET_IPGRE_BROADCAST=y CONFIG_IP_MROUTE=y CONFIG_IP_PIMSM_V1=y CONFIG_IP_PIMSM_V2=y CONFIG_INET_AH=m CONFIG_INET_ESP=m CONFIG_INET_IPCOMP=m CONFIG_IPV6_ROUTER_PREF=y CONFIG_INET6_AH=y CONFIG_INET6_ESP=y CONFIG_INET6_IPCOMP=m CONFIG_IPV6_TUNNEL=m CONFIG_NETFILTER=y CONFIG_BRIDGE_NETFILTER=y CONFIG_NF_CONNTRACK=m CONFIG_NF_CONNTRACK_TIMEOUT=y CONFIG_NF_CONNTRACK_AMANDA=m CONFIG_NF_CONNTRACK_FTP=m CONFIG_NF_CONNTRACK_H323=m CONFIG_NF_CONNTRACK_IRC=m CONFIG_NF_CONNTRACK_NETBIOS_NS=m CONFIG_NF_CONNTRACK_PPTP=m CONFIG_NF_CONNTRACK_SANE=m CONFIG_NF_CONNTRACK_SIP=m CONFIG_NF_CONNTRACK_TFTP=m CONFIG_NF_CT_NETLINK=m CONFIG_NF_TABLES=y CONFIG_NF_TABLES_INET=y CONFIG_NF_TABLES_NETDEV=y CONFIG_NFT_NUMGEN=m CONFIG_NFT_CT=m CONFIG_NFT_FLOW_OFFLOAD=m CONFIG_NFT_CONNLIMIT=m CONFIG_NFT_LOG=m CONFIG_NFT_LIMIT=m CONFIG_NFT_MASQ=m CONFIG_NFT_REDIR=m CONFIG_NFT_NAT=m CONFIG_NFT_TUNNEL=m CONFIG_NFT_QUEUE=m CONFIG_NFT_QUOTA=m CONFIG_NFT_REJECT=m CONFIG_NFT_COMPAT=m CONFIG_NFT_HASH=m CONFIG_NFT_FIB_INET=y CONFIG_NFT_XFRM=m CONFIG_NFT_SOCKET=m CONFIG_NFT_OSF=m CONFIG_NFT_SYNPROXY=m CONFIG_NF_FLOW_TABLE_INET=m CONFIG_NF_FLOW_TABLE=m CONFIG_NETFILTER_XTABLES_COMPAT=y CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m CONFIG_NETFILTER_XT_TARGET_CONNMARK=m CONFIG_NETFILTER_XT_TARGET_CT=m CONFIG_NETFILTER_XT_TARGET_DSCP=m CONFIG_NETFILTER_XT_TARGET_HL=m CONFIG_NETFILTER_XT_TARGET_LOG=m CONFIG_NETFILTER_XT_TARGET_MARK=m CONFIG_NETFILTER_XT_NAT=m CONFIG_NETFILTER_XT_TARGET_NETMAP=m CONFIG_NETFILTER_XT_TARGET_NFLOG=m CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m CONFIG_NETFILTER_XT_TARGET_REDIRECT=m CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m CONFIG_NETFILTER_XT_TARGET_TCPMSS=m CONFIG_NETFILTER_XT_MATCH_COMMENT=m CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m CONFIG_NETFILTER_XT_MATCH_CONNMARK=m CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m CONFIG_NETFILTER_XT_MATCH_DCCP=m CONFIG_NETFILTER_XT_MATCH_DSCP=m CONFIG_NETFILTER_XT_MATCH_ESP=m CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m CONFIG_NETFILTER_XT_MATCH_HELPER=m CONFIG_NETFILTER_XT_MATCH_LENGTH=m CONFIG_NETFILTER_XT_MATCH_LIMIT=m CONFIG_NETFILTER_XT_MATCH_MAC=m CONFIG_NETFILTER_XT_MATCH_MARK=m CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m CONFIG_NETFILTER_XT_MATCH_POLICY=m CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m CONFIG_NETFILTER_XT_MATCH_QUOTA=m CONFIG_NETFILTER_XT_MATCH_REALM=m CONFIG_NETFILTER_XT_MATCH_STATE=m CONFIG_NETFILTER_XT_MATCH_STATISTIC=m CONFIG_NETFILTER_XT_MATCH_STRING=m CONFIG_NETFILTER_XT_MATCH_TCPMSS=m CONFIG_NETFILTER_XT_MATCH_U32=m CONFIG_NFT_FIB_IPV4=y CONFIG_NF_TABLES_ARP=y CONFIG_IP_NF_IPTABLES=m CONFIG_IP_NF_MATCH_AH=m CONFIG_IP_NF_MATCH_ECN=m CONFIG_IP_NF_MATCH_RPFILTER=m CONFIG_IP_NF_MATCH_TTL=m CONFIG_IP_NF_TARGET_REJECT=m CONFIG_IP_NF_TARGET_SYNPROXY=m CONFIG_IP_NF_TARGET_ECN=m CONFIG_IP_NF_ARP_MANGLE=m CONFIG_NFT_FIB_IPV6=y CONFIG_IP6_NF_IPTABLES=m CONFIG_IP6_NF_MATCH_EUI64=m CONFIG_IP6_NF_MATCH_FRAG=m CONFIG_IP6_NF_MATCH_OPTS=m CONFIG_IP6_NF_MATCH_HL=m CONFIG_IP6_NF_MATCH_IPV6HEADER=m CONFIG_IP6_NF_MATCH_RT=m CONFIG_NF_TABLES_BRIDGE=m CONFIG_BRIDGE_NF_EBTABLES=m CONFIG_BRIDGE_EBT_802_3=m CONFIG_BRIDGE_EBT_AMONG=m CONFIG_BRIDGE_EBT_ARP=m CONFIG_BRIDGE_EBT_IP=m CONFIG_BRIDGE_EBT_IP6=m CONFIG_BRIDGE_EBT_LIMIT=m CONFIG_BRIDGE_EBT_MARK=m CONFIG_BRIDGE_EBT_PKTTYPE=m CONFIG_BRIDGE_EBT_STP=m CONFIG_BRIDGE_EBT_VLAN=m CONFIG_BRIDGE_EBT_ARPREPLY=m CONFIG_BRIDGE_EBT_DNAT=m CONFIG_BRIDGE_EBT_MARK_T=m CONFIG_BRIDGE_EBT_REDIRECT=m CONFIG_BRIDGE_EBT_SNAT=m CONFIG_BRIDGE_EBT_LOG=m CONFIG_BRIDGE_EBT_NFLOG=m CONFIG_IP_SCTP=m CONFIG_TIPC=m CONFIG_L2TP=y CONFIG_BRIDGE=y CONFIG_VLAN_8021Q=m CONFIG_6LOWPAN=m CONFIG_NET_SCHED=y CONFIG_NET_SCH_HTB=m CONFIG_NET_SCH_HFSC=m CONFIG_NET_SCH_PRIO=m CONFIG_NET_SCH_MULTIQ=m CONFIG_NET_SCH_RED=m CONFIG_NET_SCH_SFQ=m CONFIG_NET_SCH_TEQL=m CONFIG_NET_SCH_TBF=m CONFIG_NET_SCH_GRED=m CONFIG_NET_SCH_NETEM=m CONFIG_NET_SCH_CODEL=m CONFIG_NET_SCH_FQ_CODEL=m CONFIG_NET_SCH_INGRESS=m CONFIG_NET_CLS_BASIC=y CONFIG_NET_CLS_U32=y CONFIG_NET_CLS_CGROUP=y CONFIG_NET_CLS_FLOWER=m CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_U32=y CONFIG_NET_EMATCH_META=y CONFIG_NET_CLS_ACT=y CONFIG_NET_ACT_MIRRED=m CONFIG_NET_ACT_SKBEDIT=m CONFIG_VSOCKETS=y CONFIG_VIRTIO_VSOCKETS=y CONFIG_CGROUP_NET_PRIO=y CONFIG_NET_PKTGEN=m CONFIG_BT=y CONFIG_BT_RFCOMM=m CONFIG_BT_RFCOMM_TTY=y CONFIG_BT_BNEP=m CONFIG_BT_BNEP_MC_FILTER=y CONFIG_BT_BNEP_PROTO_FILTER=y CONFIG_BT_HIDP=m CONFIG_BT_6LOWPAN=m CONFIG_BT_LEDS=y CONFIG_CFG80211=m CONFIG_CFG80211_WEXT=y CONFIG_MAC80211=m CONFIG_RFKILL=y CONFIG_RFKILL_INPUT=y CONFIG_PCI=y CONFIG_PCIEPORTBUS=y CONFIG_PCI_MSI=y CONFIG_PCI_IOV=y CONFIG_HOTPLUG_PCI=y CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y CONFIG_CONNECTOR=y CONFIG_PARPORT=m CONFIG_PARPORT_PC=m CONFIG_BLK_DEV_FD=m CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_NBD=m CONFIG_BLK_DEV_RAM=y CONFIG_VIRTIO_BLK=y CONFIG_BLK_DEV_NVME=y CONFIG_EEPROM_AT24=m CONFIG_BLK_DEV_SD=y CONFIG_BLK_DEV_SR=y CONFIG_SCSI_DEBUG=m CONFIG_SCSI_VIRTIO=y CONFIG_ATA=y CONFIG_SATA_AHCI=y CONFIG_ATA_PIIX=y CONFIG_PATA_SCH=y CONFIG_MD=y CONFIG_BLK_DEV_MD=y CONFIG_MD_RAID0=y CONFIG_MD_RAID1=y CONFIG_MD_RAID10=y CONFIG_MD_RAID456=y CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y CONFIG_DM_SNAPSHOT=y CONFIG_DM_MIRROR=y CONFIG_DM_ZERO=y CONFIG_NETDEVICES=y CONFIG_BONDING=m CONFIG_DUMMY=m CONFIG_NET_TEAM=m CONFIG_NET_TEAM_MODE_BROADCAST=m CONFIG_NET_TEAM_MODE_ROUNDROBIN=m CONFIG_NET_TEAM_MODE_RANDOM=m CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m CONFIG_NET_TEAM_MODE_LOADBALANCE=m CONFIG_NETCONSOLE=y CONFIG_TUN=m CONFIG_VETH=y CONFIG_VIRTIO_NET=y CONFIG_TYPHOON=m CONFIG_PCNET32=m CONFIG_ATL2=m CONFIG_ATL1=m CONFIG_ATL1E=m CONFIG_ATL1C=m CONFIG_ALX=m CONFIG_TIGON3=m CONFIG_BNX2X=m CONFIG_BNXT=m CONFIG_DL2K=m CONFIG_E100=y CONFIG_E1000=y CONFIG_E1000E=y CONFIG_IGB=y CONFIG_IGBVF=m CONFIG_IGC=m CONFIG_JME=m CONFIG_SKGE=m CONFIG_SKY2=m CONFIG_8139CP=m CONFIG_8139TOO=m CONFIG_R8169=m CONFIG_MDIO_BUS=y CONFIG_PPP=m CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m CONFIG_PPP_FILTER=y CONFIG_PPP_MULTILINK=y CONFIG_PPPOE=m CONFIG_PPPOL2TP=m CONFIG_PPP_ASYNC=m CONFIG_PPP_SYNC_TTY=m CONFIG_SLIP=m CONFIG_SLIP_COMPRESSED=y CONFIG_SLIP_SMART=y CONFIG_SLIP_MODE_SLIP6=y CONFIG_USB_NET_DRIVERS=m CONFIG_USB_KAWETH=m CONFIG_USB_PEGASUS=m CONFIG_USB_RTL8150=m CONFIG_USB_RTL8152=m CONFIG_USB_LAN78XX=m CONFIG_USB_USBNET=m CONFIG_USB_NET_CDC_EEM=m CONFIG_USB_NET_DM9601=m CONFIG_USB_NET_SMSC75XX=m CONFIG_USB_NET_SMSC95XX=m CONFIG_USB_NET_MCS7830=m CONFIG_USB_NET_RNDIS_HOST=m CONFIG_USB_ALI_M5632=y CONFIG_USB_AN2720=y CONFIG_USB_KC2190=y CONFIG_ATH5K=m CONFIG_ATH9K=m CONFIG_BRCMSMAC=m CONFIG_BRCMFMAC=m CONFIG_BRCMFMAC_USB=y CONFIG_BRCMFMAC_PCIE=y CONFIG_MT7601U=m CONFIG_RT2X00=m CONFIG_RT2800PCI=m CONFIG_ISDN=y CONFIG_INPUT_MOUSEDEV=y CONFIG_INPUT_EVDEV=y CONFIG_INPUT_TABLET=y CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_USB_COMPOSITE=m CONFIG_INPUT_MISC=y CONFIG_INPUT_UINPUT=y # CONFIG_LEGACY_PTYS is not set CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y CONFIG_PRINTER=m CONFIG_VIRTIO_CONSOLE=y CONFIG_HW_RANDOM=y CONFIG_HW_RANDOM_VIRTIO=y CONFIG_HPET=y CONFIG_I2C_I801=y CONFIG_GPIOLIB=y CONFIG_GPIO_AGGREGATOR=m CONFIG_GPIO_LATCH=m CONFIG_GPIO_MOCKUP=m CONFIG_GPIO_VIRTIO=m CONFIG_GPIO_SIM=m CONFIG_GPIO_VIRTUSER=m CONFIG_WATCHDOG=y CONFIG_SOFT_WATCHDOG=m CONFIG_BCMA_DRIVER_GMAC_CMN=y CONFIG_MEDIA_SUPPORT=m CONFIG_MEDIA_SUPPORT_FILTER=y CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_MEDIA_USB_SUPPORT=y CONFIG_USB_GSPCA=m CONFIG_USB_GSPCA_BENQ=m CONFIG_USB_GSPCA_CONEX=m CONFIG_USB_GSPCA_CPIA1=m CONFIG_USB_GSPCA_ETOMS=m CONFIG_USB_GSPCA_FINEPIX=m CONFIG_USB_GSPCA_JEILINJ=m CONFIG_USB_GSPCA_JL2005BCD=m CONFIG_USB_GSPCA_KINECT=m CONFIG_USB_GSPCA_KONICA=m CONFIG_USB_GSPCA_MARS=m CONFIG_USB_GSPCA_MR97310A=m CONFIG_USB_GSPCA_NW80X=m CONFIG_USB_GSPCA_OV519=m CONFIG_USB_GSPCA_OV534=m CONFIG_USB_GSPCA_OV534_9=m CONFIG_USB_GSPCA_PAC207=m CONFIG_USB_GSPCA_PAC7302=m CONFIG_USB_GSPCA_PAC7311=m CONFIG_USB_GSPCA_SE401=m CONFIG_USB_GSPCA_SN9C2028=m CONFIG_USB_GSPCA_SN9C20X=m CONFIG_USB_GSPCA_SONIXB=m CONFIG_USB_GSPCA_SONIXJ=m CONFIG_USB_GSPCA_SPCA1528=m CONFIG_USB_GSPCA_SPCA500=m CONFIG_USB_GSPCA_SPCA501=m CONFIG_USB_GSPCA_SPCA505=m CONFIG_USB_GSPCA_SPCA506=m CONFIG_USB_GSPCA_SPCA508=m CONFIG_USB_GSPCA_SPCA561=m CONFIG_USB_GSPCA_SQ905=m CONFIG_USB_GSPCA_SQ905C=m CONFIG_USB_GSPCA_SQ930X=m CONFIG_USB_GSPCA_STK014=m CONFIG_USB_GSPCA_STV0680=m CONFIG_USB_GSPCA_SUNPLUS=m CONFIG_USB_GSPCA_T613=m CONFIG_USB_GSPCA_TOPRO=m CONFIG_USB_GSPCA_TV8532=m CONFIG_USB_GSPCA_VC032X=m CONFIG_USB_GSPCA_VICAM=m CONFIG_USB_GSPCA_XIRLINK_CIT=m CONFIG_USB_GSPCA_ZC3XX=m CONFIG_USB_GL860=m CONFIG_USB_M5602=m CONFIG_USB_STV06XX=m CONFIG_USB_PWC=m CONFIG_USB_S2255=m CONFIG_USB_VIDEO_CLASS=m CONFIG_AGP=y CONFIG_AGP_INTEL=y CONFIG_DRM=y CONFIG_DRM_I915=m CONFIG_DRM_VMWGFX=y CONFIG_DRM_VIRTIO_GPU=y CONFIG_DRM_BOCHS=y CONFIG_DRM_CIRRUS_QEMU=m CONFIG_FB=y CONFIG_FB_UVESA=m CONFIG_FB_EFI=y CONFIG_FB_SIMPLE=y CONFIG_SOUND=m CONFIG_SND=m CONFIG_SND_HRTIMER=m CONFIG_SND_SEQUENCER=m CONFIG_SND_ALOOP=m CONFIG_SND_AC97_POWER_SAVE=y CONFIG_SND_ATIIXP=m CONFIG_SND_ATIIXP_MODEM=m CONFIG_SND_CA0106=m CONFIG_SND_CMIPCI=m CONFIG_SND_OXYGEN=m CONFIG_SND_CTXFI=m CONFIG_SND_EMU10K1=m CONFIG_SND_EMU10K1X=m CONFIG_SND_ENS1370=m CONFIG_SND_HDSP=m CONFIG_SND_HDSPM=m CONFIG_SND_ICE1712=m CONFIG_SND_ICE1724=m CONFIG_SND_INTEL8X0=m CONFIG_SND_RME96=m CONFIG_SND_RME9652=m CONFIG_SND_VIRTUOSO=m CONFIG_SND_HDA_INTEL=m CONFIG_SND_HDA_CODEC_ANALOG=m CONFIG_SND_HDA_CODEC_SIGMATEL=m CONFIG_SND_HDA_CODEC_VIA=m CONFIG_SND_HDA_CODEC_CONEXANT=m CONFIG_SND_HDA_CODEC_CA0110=m CONFIG_SND_HDA_CODEC_CA0132=m CONFIG_SND_HDA_CODEC_CMEDIA=m CONFIG_SND_HDA_CODEC_SI3054=m CONFIG_SND_HDA_CODEC_REALTEK=m CONFIG_SND_HDA_CODEC_CIRRUS=m CONFIG_SND_HDA_CODEC_HDMI=m CONFIG_SND_USB_AUDIO=m CONFIG_SND_USB_USX2Y=m CONFIG_SND_USB_US122L=m CONFIG_SND_USB_HIFACE=m CONFIG_HID_A4TECH=y CONFIG_HID_APPLE=y CONFIG_HID_BELKIN=y CONFIG_HID_CHERRY=y CONFIG_HID_CHICONY=y CONFIG_HID_CYPRESS=y CONFIG_HID_EZKEY=y CONFIG_HID_ITE=y CONFIG_HID_KENSINGTON=y CONFIG_HID_REDRAGON=y CONFIG_HID_MICROSOFT=y CONFIG_HID_MONTEREY=y CONFIG_HID_WACOM=y CONFIG_USB_HIDDEV=y CONFIG_USB=y CONFIG_USB_XHCI_HCD=y CONFIG_USB_EHCI_HCD=y CONFIG_USB_EHCI_ROOT_HUB_TT=y CONFIG_USB_OHCI_HCD=y CONFIG_USB_UHCI_HCD=y CONFIG_USB_STORAGE=y CONFIG_USB_SERIAL=y CONFIG_USB_SERIAL_CONSOLE=y CONFIG_USB_SERIAL_GENERIC=y CONFIG_USB_SERIAL_FTDI_SIO=y CONFIG_USB_SERIAL_PL2303=y CONFIG_USB_EZUSB_FX2=y CONFIG_MMC=y CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_PCI=y CONFIG_MMC_SDHCI_ACPI=y CONFIG_MMC_SDHCI_PLTFM=y CONFIG_RTC_CLASS=y CONFIG_VIRTIO_PCI=y CONFIG_VIRTIO_BALLOON=y CONFIG_VIRTIO_INPUT=m CONFIG_VIRTIO_MMIO=y CONFIG_INTEL_IOMMU=y # CONFIG_INTEL_IOMMU_DEFAULT_ON is not set CONFIG_IRQ_REMAP=y CONFIG_EXT4_FS=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y CONFIG_BTRFS_FS=y CONFIG_BTRFS_FS_POSIX_ACL=y CONFIG_FS_ENCRYPTION=y CONFIG_AUTOFS_FS=y CONFIG_FUSE_FS=m CONFIG_CUSE=m CONFIG_ISO9660_FS=y CONFIG_ZISOFS=y CONFIG_MSDOS_FS=y CONFIG_VFAT_FS=y CONFIG_PROC_KCORE=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_EFIVAR_FS=y CONFIG_ROMFS_FS=m CONFIG_NFS_FS=y CONFIG_NFS_V4=y CONFIG_ROOT_NFS=y # CONFIG_NFS_DISABLE_UDP_SUPPORT is not set CONFIG_NFSD=m CONFIG_NFSD_V4=y CONFIG_CIFS=y CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y CONFIG_NLS_CODEPAGE_437=y CONFIG_NLS_CODEPAGE_737=m CONFIG_NLS_CODEPAGE_775=m CONFIG_NLS_CODEPAGE_850=m CONFIG_NLS_CODEPAGE_852=m CONFIG_NLS_CODEPAGE_855=m CONFIG_NLS_CODEPAGE_857=m CONFIG_NLS_CODEPAGE_860=m CONFIG_NLS_CODEPAGE_861=m CONFIG_NLS_CODEPAGE_862=m CONFIG_NLS_CODEPAGE_863=m CONFIG_NLS_CODEPAGE_864=m CONFIG_NLS_CODEPAGE_865=m CONFIG_NLS_CODEPAGE_866=m CONFIG_NLS_CODEPAGE_869=m CONFIG_NLS_CODEPAGE_936=m CONFIG_NLS_CODEPAGE_950=m CONFIG_NLS_CODEPAGE_932=m CONFIG_NLS_CODEPAGE_949=m CONFIG_NLS_CODEPAGE_874=m CONFIG_NLS_ISO8859_8=m CONFIG_NLS_CODEPAGE_1250=m CONFIG_NLS_CODEPAGE_1251=m CONFIG_NLS_ASCII=m CONFIG_NLS_ISO8859_1=y CONFIG_NLS_ISO8859_2=m CONFIG_NLS_ISO8859_3=m CONFIG_NLS_ISO8859_4=m CONFIG_NLS_ISO8859_5=m CONFIG_NLS_ISO8859_6=m CONFIG_NLS_ISO8859_7=m CONFIG_NLS_ISO8859_9=m CONFIG_NLS_ISO8859_13=m CONFIG_NLS_ISO8859_14=m CONFIG_NLS_ISO8859_15=m CONFIG_NLS_KOI8_R=m CONFIG_NLS_KOI8_U=m CONFIG_NLS_UTF8=m CONFIG_ENCRYPTED_KEYS=y CONFIG_SECURITY=y CONFIG_SECURITY_LANDLOCK=y CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_BENCHMARK=m CONFIG_CRYPTO_BLOWFISH=m CONFIG_CRYPTO_CAMELLIA=m CONFIG_CRYPTO_CAST5=m CONFIG_CRYPTO_CAST6=m CONFIG_CRYPTO_DES=y CONFIG_CRYPTO_SERPENT=m CONFIG_CRYPTO_TWOFISH=m CONFIG_CRYPTO_MD4=y CONFIG_CRYPTO_MD5=y CONFIG_CRYPTO_MICHAEL_MIC=m CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_WP512=m CONFIG_CRYPTO_XCBC=m CONFIG_CRYPTO_DEFLATE=y CONFIG_CRYPTO_USER_API_HASH=m CONFIG_CRYPTO_USER_API_SKCIPHER=m CONFIG_CRYPTO_USER_API_RNG=m CONFIG_CRYPTO_USER_API_AEAD=m # CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE is not set CONFIG_CRYPTO_DEV_VIRTIO=y CONFIG_PRINTK_TIME=y CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y CONFIG_KGDB=y CONFIG_KGDB_LOW_LEVEL_TRAP=y CONFIG_KGDB_KDB=y CONFIG_KDB_KEYBOARD=y CONFIG_DEBUG_KMEMLEAK=y CONFIG_DEBUG_MEMORY_INIT=y CONFIG_KASAN=y CONFIG_KFENCE=y CONFIG_PROVE_LOCKING=y CONFIG_FUNCTION_TRACER=y CONFIG_FTRACE_SYSCALLS=y CONFIG_BLK_DEV_IO_TRACE=y CONFIG_SAMPLES=y CONFIG_SAMPLE_TRACE_EVENTS=m CONFIG_SAMPLE_TRACE_PRINTK=m CONFIG_SAMPLE_KOBJECT=m CONFIG_SAMPLE_KPROBES=m CONFIG_SAMPLE_HW_BREAKPOINT=m CONFIG_SAMPLE_KFIFO=m CONFIG_SAMPLE_CONFIGFS=m CONFIG_UNWINDER_FRAME_POINTER=y Bartosz ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] revocable: Remove redundant synchronize_srcu() call 2026-01-21 15:18 ` Bartosz Golaszewski 2026-01-21 16:04 ` Tzung-Bi Shih @ 2026-01-21 16:52 ` Tzung-Bi Shih 1 sibling, 0 replies; 7+ messages in thread From: Tzung-Bi Shih @ 2026-01-21 16:52 UTC (permalink / raw) To: Bartosz Golaszewski Cc: Greg Kroah-Hartman, Rafael J. Wysocki, Danilo Krummrich, linux-kernel On Wed, Jan 21, 2026 at 03:18:12PM +0000, Bartosz Golaszewski wrote: > On Wed, 21 Jan 2026 13:34:15 +0100, Tzung-Bi Shih <tzungbi@kernel.org> said: > > On Wed, Jan 21, 2026 at 11:38:18AM +0100, Bartosz Golaszewski wrote: > >> On Wed, Jan 21, 2026 at 5:03 AM Tzung-Bi Shih <tzungbi@kernel.org> wrote: > >> > > >> > When allocating a revocable provider via revocable_provider_alloc(), > >> > there is no revocable consumers (i.e., RCU readers) yet. Remove the > >> > redundant synchronize_srcu() call to save cycles. > >> > > >> > Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org> > >> > --- > >> > To address the performance impact reported in > >> > https://lore.kernel.org/linux-gpio/CAMRc=McrFa42mNWmZtD1HKKKZ+USUKpQAAME50wbfxPM7L72gA@mail.gmail.com/. > >> > > >> > drivers/base/revocable.c | 1 - > >> > 1 file changed, 1 deletion(-) > >> > > >> > diff --git a/drivers/base/revocable.c b/drivers/base/revocable.c > >> > index f6cece275aac..b068e18a847d 100644 > >> > --- a/drivers/base/revocable.c > >> > +++ b/drivers/base/revocable.c > >> > @@ -99,7 +99,6 @@ struct revocable_provider *revocable_provider_alloc(void *res) > >> > > >> > init_srcu_struct(&rp->srcu); > >> > rcu_assign_pointer(rp->res, res); > >> > - synchronize_srcu(&rp->srcu); > >> > kref_init(&rp->kref); > >> > > >> > return rp; > >> > -- > >> > 2.52.0.457.g6b5491de43-goog > >> > > >> > >> Do you have an up-to-date integration branch with all the series and > >> fixes you posted that I could use for testing with GPIO? > > > > Please use > > https://git.kernel.org/pub/scm/linux/kernel/git/tzungbi/chrome-platform.git/log/?h=gpio_rev > > for the purpose which is based on driver-core-next and gpio/for-current > > branches. > > > > With this branch, I'm seeing the following KASAN splat when running libgpiod > tests: > > ================================================================== > BUG: KASAN: use-after-free in notifier_call_chain+0x222/0x270 > Read of size 8 at addr ffff888103ce6490 by task gpiod-test/479 > > CPU: 2 UID: 0 PID: 479 Comm: gpiod-test Not tainted > 6.19.0-rc6-yocto-standard+ #2 PREEMPT(full) > Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS > rel-1.17.0-0-gb52ca86e094d-prebuilt.qemu.org 04/01/2014 > Call Trace: > <TASK> > dump_stack_lvl+0x63/0x90 > print_report+0x153/0x4c7 > ? __virt_addr_valid+0x225/0x4c0 > ? kasan_addr_to_slab+0x11/0x80 > kasan_report+0x103/0x140 > ? notifier_call_chain+0x222/0x270 > ? notifier_call_chain+0x222/0x270 > __asan_report_load8_noabort+0x18/0x20 > notifier_call_chain+0x222/0x270 > blocking_notifier_call_chain+0x70/0xb0 > gpiolib_cdev_unregister+0x5a/0x70 > gpiochip_remove+0x48e/0x5a0 > ? __kasan_slab_free+0x84/0xa0 > devm_gpio_chip_release+0x12/0x20 Even though I can't reproduce the error for now, by inspecting the calling stack, I think what was happening: | Thread A - removing the chip | Thread B - closing the FD | | | | | gpiochip_remove() | | | revocable_provider_revoke() | | | | The .close() finds the | | | gpio_chip is gone, skip to | | | unregister notifier...(1). | | | | | | The .close() frees the context. | | | E.g., kfree(cdev); | | gcdev_unregister() | | | gpiolib_cdev_unregister() | | | It notifies the subscribers | | | about the GPIO chip being | | | unregistered. And it tries | | | to access `cdev` which has | | | been freed...(2). | | (1) REVOCABLE_TRY_ACCESS_SCOPED(cdev->chip_rev, gc) { if (!gc) break; gdev = gc->gpiodev; blocking_notifier_chain_unregister(&gdev->device_notifier, &cdev->device_unregistered_nb); scoped_guard(write_lock_irqsave, &gdev->line_state_lock) raw_notifier_chain_unregister(&gdev->line_state_notifier, &cdev->lineinfo_changed_nb); } (2) void gpiolib_cdev_unregister(struct gpio_device *gdev) { destroy_workqueue(gdev->line_state_wq); cdev_device_del(&gdev->chrdev, &gdev->dev); blocking_notifier_call_chain(&gdev->device_notifier, 0, NULL); } This is a separate issue. I'd find a way to reproduce it and will see how to fix it. ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-01-21 16:58 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2026-01-21 4:02 [PATCH] revocable: Remove redundant synchronize_srcu() call Tzung-Bi Shih 2026-01-21 10:38 ` Bartosz Golaszewski 2026-01-21 12:34 ` Tzung-Bi Shih 2026-01-21 15:18 ` Bartosz Golaszewski 2026-01-21 16:04 ` Tzung-Bi Shih 2026-01-21 16:58 ` Bartosz Golaszewski 2026-01-21 16:52 ` Tzung-Bi Shih
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®