[PATCH] revocable: Remove redundant synchronize_srcu() call

Tzung-Bi Shih posted 1 patch 2 weeks, 3 days ago
drivers/base/revocable.c | 1 -
1 file changed, 1 deletion(-)
[PATCH] revocable: Remove redundant synchronize_srcu() call
Posted by Tzung-Bi Shih 2 weeks, 3 days ago
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
Re: [PATCH] revocable: Remove redundant synchronize_srcu() call
Posted by Bartosz Golaszewski 2 weeks, 3 days ago
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
Re: [PATCH] revocable: Remove redundant synchronize_srcu() call
Posted by Tzung-Bi Shih 2 weeks, 3 days ago
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.
Re: [PATCH] revocable: Remove redundant synchronize_srcu() call
Posted by Bartosz Golaszewski 2 weeks, 2 days ago
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
Re: [PATCH] revocable: Remove redundant synchronize_srcu() call
Posted by Tzung-Bi Shih 2 weeks, 2 days ago
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.
Re: [PATCH] revocable: Remove redundant synchronize_srcu() call
Posted by Tzung-Bi Shih 2 weeks, 2 days ago
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?
Re: [PATCH] revocable: Remove redundant synchronize_srcu() call
Posted by Bartosz Golaszewski 2 weeks, 2 days ago
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