public inbox for linux-btrfs@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] btrfs: sink RCU protection to _btrfs_printk()
@ 2026-02-05 11:45 David Sterba
  2026-02-09  9:39 ` Filipe Manana
  2026-02-13  2:08 ` kernel test robot
  0 siblings, 2 replies; 4+ messages in thread
From: David Sterba @ 2026-02-05 11:45 UTC (permalink / raw)
  To: linux-btrfs; +Cc: David Sterba

Since commit 0e26727a731adf ("btrfs: switch all message helpers to be
RCU safe") the RCU protection is applied to all printk helpers,
explicitly in the wrapping macros. This inlines the code around each
message call but this is in no way a hot path so the RCU protection can
be sunk further to _btrfs_printk().

This change saves about 10K of btrfs.ko size on x86_64 release config:

   text	   data	    bss	    dec	    hex	filename
1722927	 148328	  15560	1886815	 1cca5f	pre/btrfs.ko
1712221	 148760	  15560	1876541	 1ca23d	post/btrfs.ko

DELTA: -10706

Signed-off-by: David Sterba <dsterba@suse.com>
---
 fs/btrfs/messages.c | 4 ++++
 fs/btrfs/messages.h | 4 ----
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/fs/btrfs/messages.c b/fs/btrfs/messages.c
index 6190777924bff5..49774980bab6c9 100644
--- a/fs/btrfs/messages.c
+++ b/fs/btrfs/messages.c
@@ -219,6 +219,8 @@ void _btrfs_printk(const struct btrfs_fs_info *fs_info, unsigned int level, cons
 	const char *type = logtypes[level];
 	struct ratelimit_state *ratelimit = &printk_limits[level];
 
+	rcu_read_lock();
+
 #ifdef CONFIG_PRINTK_INDEX
 	printk_index_subsys_emit("%sBTRFS %s (device %s): ", NULL, fmt);
 #endif
@@ -241,6 +243,8 @@ void _btrfs_printk(const struct btrfs_fs_info *fs_info, unsigned int level, cons
 	}
 
 	va_end(args);
+
+	rcu_read_unlock();
 }
 #endif
 
diff --git a/fs/btrfs/messages.h b/fs/btrfs/messages.h
index 943e53980945ea..73a44f464664c5 100644
--- a/fs/btrfs/messages.h
+++ b/fs/btrfs/messages.h
@@ -85,9 +85,7 @@ void _btrfs_printk(const struct btrfs_fs_info *fs_info, unsigned int level, cons
 
 #define btrfs_printk_in_rcu(fs_info, level, fmt, args...)	\
 do {								\
-	rcu_read_lock();					\
 	_btrfs_printk(fs_info, level, fmt, ##args);		\
-	rcu_read_unlock();					\
 } while (0)
 
 #define btrfs_printk_rl_in_rcu(fs_info, level, fmt, args...)	\
@@ -96,10 +94,8 @@ do {								\
 		DEFAULT_RATELIMIT_INTERVAL,			\
 		DEFAULT_RATELIMIT_BURST);			\
 								\
-	rcu_read_lock();					\
 	if (__ratelimit(&_rs))					\
 		_btrfs_printk(fs_info, level, fmt, ##args);	\
-	rcu_read_unlock();					\
 } while (0)
 
 #endif
-- 
2.51.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] btrfs: sink RCU protection to _btrfs_printk()
  2026-02-05 11:45 [PATCH] btrfs: sink RCU protection to _btrfs_printk() David Sterba
@ 2026-02-09  9:39 ` Filipe Manana
  2026-02-09 13:22   ` David Sterba
  2026-02-13  2:08 ` kernel test robot
  1 sibling, 1 reply; 4+ messages in thread
From: Filipe Manana @ 2026-02-09  9:39 UTC (permalink / raw)
  To: David Sterba; +Cc: linux-btrfs

On Thu, Feb 5, 2026 at 11:45 AM David Sterba <dsterba@suse.com> wrote:
>
> Since commit 0e26727a731adf ("btrfs: switch all message helpers to be
> RCU safe") the RCU protection is applied to all printk helpers,
> explicitly in the wrapping macros. This inlines the code around each
> message call but this is in no way a hot path so the RCU protection can
> be sunk further to _btrfs_printk().
>
> This change saves about 10K of btrfs.ko size on x86_64 release config:
>
>    text    data     bss     dec     hex filename
> 1722927  148328   15560 1886815  1cca5f pre/btrfs.ko
> 1712221  148760   15560 1876541  1ca23d post/btrfs.ko
>
> DELTA: -10706
>
> Signed-off-by: David Sterba <dsterba@suse.com>
> ---
>  fs/btrfs/messages.c | 4 ++++
>  fs/btrfs/messages.h | 4 ----
>  2 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/fs/btrfs/messages.c b/fs/btrfs/messages.c
> index 6190777924bff5..49774980bab6c9 100644
> --- a/fs/btrfs/messages.c
> +++ b/fs/btrfs/messages.c
> @@ -219,6 +219,8 @@ void _btrfs_printk(const struct btrfs_fs_info *fs_info, unsigned int level, cons
>         const char *type = logtypes[level];
>         struct ratelimit_state *ratelimit = &printk_limits[level];
>
> +       rcu_read_lock();
> +
>  #ifdef CONFIG_PRINTK_INDEX
>         printk_index_subsys_emit("%sBTRFS %s (device %s): ", NULL, fmt);
>  #endif
> @@ -241,6 +243,8 @@ void _btrfs_printk(const struct btrfs_fs_info *fs_info, unsigned int level, cons
>         }
>
>         va_end(args);
> +
> +       rcu_read_unlock();
>  }
>  #endif
>
> diff --git a/fs/btrfs/messages.h b/fs/btrfs/messages.h
> index 943e53980945ea..73a44f464664c5 100644
> --- a/fs/btrfs/messages.h
> +++ b/fs/btrfs/messages.h
> @@ -85,9 +85,7 @@ void _btrfs_printk(const struct btrfs_fs_info *fs_info, unsigned int level, cons
>
>  #define btrfs_printk_in_rcu(fs_info, level, fmt, args...)      \
>  do {                                                           \
> -       rcu_read_lock();                                        \
>         _btrfs_printk(fs_info, level, fmt, ##args);             \
> -       rcu_read_unlock();                                      \
>  } while (0)

There's no longer any need for the do while, so it could now be simply:

 #define btrfs_printk_in_rcu(fs_info, level, fmt, args...)
_btrfs_printk(fs_info, level, fmt, ##args)

Otherwise, it looks good, thanks.

Reviewed-by: Filipe Manana <fdmanana@suse.com>


>
>  #define btrfs_printk_rl_in_rcu(fs_info, level, fmt, args...)   \
> @@ -96,10 +94,8 @@ do {                                                         \
>                 DEFAULT_RATELIMIT_INTERVAL,                     \
>                 DEFAULT_RATELIMIT_BURST);                       \
>                                                                 \
> -       rcu_read_lock();                                        \
>         if (__ratelimit(&_rs))                                  \
>                 _btrfs_printk(fs_info, level, fmt, ##args);     \
> -       rcu_read_unlock();                                      \
>  } while (0)
>
>  #endif
> --
> 2.51.1
>
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] btrfs: sink RCU protection to _btrfs_printk()
  2026-02-09  9:39 ` Filipe Manana
@ 2026-02-09 13:22   ` David Sterba
  0 siblings, 0 replies; 4+ messages in thread
From: David Sterba @ 2026-02-09 13:22 UTC (permalink / raw)
  To: Filipe Manana; +Cc: David Sterba, linux-btrfs

On Mon, Feb 09, 2026 at 09:39:07AM +0000, Filipe Manana wrote:
> > --- a/fs/btrfs/messages.h
> > +++ b/fs/btrfs/messages.h
> > @@ -85,9 +85,7 @@ void _btrfs_printk(const struct btrfs_fs_info *fs_info, unsigned int level, cons
> >
> >  #define btrfs_printk_in_rcu(fs_info, level, fmt, args...)      \
> >  do {                                                           \
> > -       rcu_read_lock();                                        \
> >         _btrfs_printk(fs_info, level, fmt, ##args);             \
> > -       rcu_read_unlock();                                      \
> >  } while (0)
> 
> There's no longer any need for the do while, so it could now be simply:
> 
>  #define btrfs_printk_in_rcu(fs_info, level, fmt, args...)
> _btrfs_printk(fs_info, level, fmt, ##args)

Right, fixed in for-next, thanks.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] btrfs: sink RCU protection to _btrfs_printk()
  2026-02-05 11:45 [PATCH] btrfs: sink RCU protection to _btrfs_printk() David Sterba
  2026-02-09  9:39 ` Filipe Manana
@ 2026-02-13  2:08 ` kernel test robot
  1 sibling, 0 replies; 4+ messages in thread
From: kernel test robot @ 2026-02-13  2:08 UTC (permalink / raw)
  To: David Sterba; +Cc: oe-lkp, lkp, linux-btrfs, David Sterba, oliver.sang



Hello,

kernel test robot noticed "WARNING:suspicious_RCU_usage" on:

commit: a7bc95298723a9c79cc429adfb7dc1f37ff55a8d ("[PATCH] btrfs: sink RCU protection to _btrfs_printk()")
url: https://github.com/intel-lab-lkp/linux/commits/David-Sterba/btrfs-sink-RCU-protection-to-_btrfs_printk/20260205-194735
base: https://git.kernel.org/cgit/linux/kernel/git/kdave/linux.git for-next
patch link: https://lore.kernel.org/all/20260205114546.210418-1-dsterba@suse.com/
patch subject: [PATCH] btrfs: sink RCU protection to _btrfs_printk()

in testcase: perf-sanity-tests
version: 
with following parameters:

	perf_compiler: clang
	group: group-02



config: x86_64-rhel-9.4-bpf
compiler: gcc-14
test machine: 64 threads 2 sockets Intel(R) Xeon(R) Gold 6346 CPU @ 3.10GHz (Ice Lake) with 256G memory

(please refer to attached dmesg/kmsg for entire log/backtrace)



If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <oliver.sang@intel.com>
| Closes: https://lore.kernel.org/oe-lkp/202602130950.db059ac8-lkp@intel.com



kern  :warn  : [  282.723760] [   T5053] WARNING: suspicious RCU usage
kern  :warn  : [  282.723764] [   T5053] 6.19.0-rc8-00144-ga7bc95298723 #1 Tainted: G S
kern  :warn  : [  282.723768] [   T5053] -----------------------------
kern  :warn  : [  282.723769] [   T5053] fs/btrfs/volumes.h:856 suspicious rcu_dereference_check() usage!
kern  :warn  : [  282.723773] [   T5053]
other info that might help us debug this:

kern  :warn  : [  282.723775] [   T5053]
rcu_scheduler_active = 2, debug_locks = 1
kern  :warn  : [  282.723778] [   T5053] 4 locks held by mount/5053:
kern  :warn  : [  282.723780] [   T5053]  #0: ff1100058fa07c70 (&fc->uapi_mutex){+.+.}-{4:4}, at: __do_sys_fsconfig (fs/fsopen.c:472)

kern  :warn  : [  282.733684] [   T5053]  #1: ff1100080763a0e0 (&type->s_umount_key#45
user  :notice: [  282.739077] [    T979]   File "/usr/bin/py3clean", line 209, in <module>
kern  :warn  : [  282.746062] [   T5053] /1

kern  :warn  : [  282.758521] [   T5053] ){+.+.}-{4:4}, at: alloc_super (fs/super.c:346)
user  :notice: [  282.768758] [    T979]     main()
kern  :warn  : [  282.776531] [   T5053]  #2: ff110005cb3fb8d8 (&fs_devs->device_list_mutex){+.+.}-{4:4}

kern  :warn  : [  282.790726] [   T5053] , at: btrfs_init_dev_stats (fs/btrfs/volumes.c:7975) btrfs
user  :notice: [  282.793082] [    T979]     ~~~~^^
kern  :warn  : [  282.799023] [   T5053]  #3:

kern  :warn  : [  282.807834] [   T5053] ff1100019d555d18 (btrfs-dev-00
user  :notice: [  282.810637] [    T979]   File "/usr/bin/py3clean", line 195, in main
kern  :warn  : [  282.815878] [   T5053] ){.+.+}-{4:4}, at: btrfs_tree_read_lock_nested (arch/x86/include/asm/jump_label.h:37 include/trace/events/btrfs.h:2293 fs/btrfs/locking.c:147) btrfs

kern  :warn  : [  282.826610] [   T5053]
stack backtrace:
kern  :warn  : [  282.826616] [   T5053] CPU: 9 UID: 0 PID: 5053 Comm: mount Tainted: G S                  6.19.0-rc8-00144-ga7bc95298723 #1 PREEMPT(full)
kern  :warn  : [  282.826622] [   T5053] Tainted: [S]=CPU_OUT_OF_SPEC
kern  :warn  : [  282.826624] [   T5053] Hardware name: Inspur NF5180M6/NF5180M6, BIOS 06.00.04 04/12/2022
kern  :warn  : [  282.826626] [   T5053] Call Trace:
kern  :warn  : [  282.826630] [   T5053]  <TASK>
kern  :warn  : [  282.826632] [   T5053]  dump_stack_lvl (lib/dump_stack.c:122)
kern  :warn  : [  282.826640] [   T5053]  lockdep_rcu_suspicious.cold (kernel/locking/lockdep.c:6877)
kern  :warn  : [  282.826648] [   T5053] btrfs_dev_name (fs/btrfs/volumes.h:856 (discriminator 9) fs/btrfs/volumes.h:851 (discriminator 9)) btrfs
kern  :warn  : [  282.826845] [   T5053] btrfs_device_init_dev_stats (fs/btrfs/volumes.c:8119 (discriminator 6) fs/btrfs/volumes.c:7957 (discriminator 6)) btrfs
kern  :warn  : [  282.827048] [   T5053]  ? __pfx_btrfs_device_init_dev_stats (fs/btrfs/volumes.c:7921) btrfs
kern  :warn  : [  282.827256] [   T5053]  ? kasan_save_track (mm/kasan/common.c:70 (discriminator 1) mm/kasan/common.c:79 (discriminator 1))
kern  :warn  : [  282.827262] [   T5053]  ? __kasan_slab_alloc (mm/kasan/common.c:340 mm/kasan/common.c:366)
kern  :warn  : [  282.827267] [   T5053]  ? __rcu_read_lock (kernel/rcu/tree_plugin.h:416 (discriminator 2))
kern  :warn  : [  282.827273] [   T5053]  ? kmem_cache_alloc_noprof (include/trace/events/kmem.h:12 (discriminator 2) mm/slub.c:5273 (discriminator 2))
kern  :warn  : [  282.827280] [   T5053]  ? btrfs_init_dev_stats (fs/btrfs/volumes.c:7970) btrfs
kern  :warn  : [  282.827494] [   T5053] btrfs_init_dev_stats (fs/btrfs/volumes.c:7977) btrfs
kern  :warn  : [  282.827707] [   T5053] open_ctree (fs/btrfs/disk-io.c:3546) btrfs
kern  :warn  : [  282.827910] [   T5053] btrfs_get_tree_super.cold (fs/btrfs/super.c:982 fs/btrfs/super.c:1944) btrfs
kern  :warn  : [  282.828112] [   T5053] btrfs_get_tree_subvol (fs/btrfs/super.c:2087) btrfs
kern  :warn  : [  282.828315] [   T5053]  vfs_get_tree (fs/super.c:1751)
kern  :warn  : [  282.828322] [   T5053]  vfs_cmd_create (fs/fsopen.c:231)
kern  :warn  : [  282.828328] [   T5053]  __do_sys_fsconfig (fs/fsopen.c:474)
kern  :warn  : [  282.828333] [   T5053]  ? __pfx___do_sys_fsconfig (fs/fsopen.c:356)
kern  :warn  : [  282.828337] [   T5053]  ? do_faccessat (fs/open.c:530)
kern  :warn  : [  282.828345] [   T5053]  ? __pfx_do_faccessat (fs/open.c:465)
kern  :warn  : [  282.828352] [   T5053]  ? do_syscall_64 (arch/x86/include/asm/irqflags.h:42 arch/x86/include/asm/irqflags.h:119 include/linux/entry-common.h:108 arch/x86/entry/syscall_64.c:90)
kern  :warn  : [  282.828360] [   T5053]  do_syscall_64 (arch/x86/entry/syscall_64.c:63 (discriminator 1) arch/x86/entry/syscall_64.c:94 (discriminator 1))
kern  :warn  : [  282.828364] [   T5053]  ? do_syscall_64 (include/linux/irq-entry-common.h:298 include/linux/entry-common.h:196 arch/x86/entry/syscall_64.c:100)
kern  :warn  : [  282.828371] [   T5053]  ? do_syscall_64 (arch/x86/entry/syscall_64.c:113)
kern  :warn  : [  282.828376] [   T5053]  ? do_syscall_64 (include/linux/irq-entry-common.h:298 include/linux/entry-common.h:196 arch/x86/entry/syscall_64.c:100)
kern  :warn  : [  282.828382] [   T5053]  ? do_syscall_64 (arch/x86/entry/syscall_64.c:113)
kern  :warn  : [  282.828386] [   T5053]  ? __pfx_from_kgid_munged (kernel/user_namespace.c:534)
kern  :warn  : [  282.828392] [   T5053]  ? do_syscall_64 (include/linux/irq-entry-common.h:298 include/linux/entry-common.h:196 arch/x86/entry/syscall_64.c:100)
kern  :warn  : [  282.828396] [   T5053]  ? do_syscall_64 (include/linux/irq-entry-common.h:298 include/linux/entry-common.h:196 arch/x86/entry/syscall_64.c:100)
kern  :warn  : [  282.828402] [   T5053]  ? do_syscall_64 (arch/x86/entry/syscall_64.c:113)
kern  :warn  : [  282.828406] [   T5053]  ? do_syscall_64 (arch/x86/entry/syscall_64.c:113)
kern  :warn  : [  282.828409] [   T5053]  ? do_syscall_64 (include/linux/irq-entry-common.h:298 include/linux/entry-common.h:196 arch/x86/entry/syscall_64.c:100)
kern  :warn  : [  282.828415] [   T5053]  ? do_syscall_64 (arch/x86/entry/syscall_64.c:113)
kern  :warn  : [  282.828418] [   T5053]  ? lockdep_hardirqs_on_prepare (kernel/locking/lockdep.c:4629 (discriminator 4))
kern  :warn  : [  282.828423] [   T5053]  ? clear_bhb_loop (arch/x86/entry/entry_64.S:1549)
kern  :warn  : [  282.828430] [   T5053]  entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:131)
kern  :warn  : [  282.828434] [   T5053] RIP: 0033:0x7f5027d8b4aa
kern  :warn  : [  282.828458] [   T5053] Code: 73 01 c3 48 8b 0d 4e 59 0d 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 49 89 ca b8 af 01 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 1e 59 0d 00 f7 d8 64 89 01 48
All code
========
   0:	73 01                	jae    0x3
   2:	c3                   	ret
   3:	48 8b 0d 4e 59 0d 00 	mov    0xd594e(%rip),%rcx        # 0xd5958
   a:	f7 d8                	neg    %eax
   c:	64 89 01             	mov    %eax,%fs:(%rcx)
   f:	48 83 c8 ff          	or     $0xffffffffffffffff,%rax
  13:	c3                   	ret
  14:	66 2e 0f 1f 84 00 00 	cs nopw 0x0(%rax,%rax,1)
  1b:	00 00 00 
  1e:	66 90                	xchg   %ax,%ax
  20:	49 89 ca             	mov    %rcx,%r10
  23:	b8 af 01 00 00       	mov    $0x1af,%eax
  28:	0f 05                	syscall
  2a:*	48 3d 01 f0 ff ff    	cmp    $0xfffffffffffff001,%rax		<-- trapping instruction
  30:	73 01                	jae    0x33
  32:	c3                   	ret
  33:	48 8b 0d 1e 59 0d 00 	mov    0xd591e(%rip),%rcx        # 0xd5958
  3a:	f7 d8                	neg    %eax
  3c:	64 89 01             	mov    %eax,%fs:(%rcx)
  3f:	48                   	rex.W

Code starting with the faulting instruction
===========================================
   0:	48 3d 01 f0 ff ff    	cmp    $0xfffffffffffff001,%rax
   6:	73 01                	jae    0x9
   8:	c3                   	ret
   9:	48 8b 0d 1e 59 0d 00 	mov    0xd591e(%rip),%rcx        # 0xd592e
  10:	f7 d8                	neg    %eax
  12:	64 89 01             	mov    %eax,%fs:(%rcx)
  15:	48                   	rex.W
kern  :warn  : [  282.828462] [   T5053] RSP: 002b:00007ffde3afb828 EFLAGS: 00000246 ORIG_RAX: 00000000000001af
kern  :warn  : [  282.828466] [   T5053] RAX: ffffffffffffffda RBX: 0000561df73281d0 RCX: 00007f5027d8b4aa
kern  :warn  : [  282.828469] [   T5053] RDX: 0000000000000000 RSI: 0000000000000006 RDI: 0000000000000003
kern  :warn  : [  282.828472] [   T5053] RBP: 0000561df7329ca0 R08: 0000000000000000 R09: 0000000000000000
kern  :warn  : [  282.828474] [   T5053] R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
kern  :warn  : [  282.828476] [   T5053] R13: 00007f5027f1d580 R14: 00007f5027f1f26c R15: 00007f5027f04a23
kern  :warn  : [  282.828490] [   T5053]  </TASK>
kern  :info  : [  282.828501] [   T5053] BTRFS info (device nvme0n1p4): bdev /dev/nvme0n1p4 errs: wr 0, rd 0, flush 0, corrupt 3073, gen 0
user  :notice: [  282.829495] [    T979]     pfiles = set(dpf.from_package(options.package))
kern  :info  : [  282.868038] [   T5053] BTRFS info (device nvme0n1p4): enabling ssd optimizations

kern  :info  : [  282.871066] [   T5053] BTRFS info (device nvme0n1p4): turning on async discard
kern  :info  : [  282.871071] [   T5053] BTRFS info (device nvme0n1p4): enabling disk space caching



The kernel config and materials to reproduce are available at:
https://download.01.org/0day-ci/archive/20260213/202602130950.db059ac8-lkp@intel.com



-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2026-02-13  2:08 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-05 11:45 [PATCH] btrfs: sink RCU protection to _btrfs_printk() David Sterba
2026-02-09  9:39 ` Filipe Manana
2026-02-09 13:22   ` David Sterba
2026-02-13  2:08 ` kernel test robot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox