| From 2914c33c3aba36a09f17f7d6d1b0305db31c2e7f Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 11 Jun 2024 02:18:12 -0700 |
| Subject: debugobjects: Annotate racy debug variables |
| |
| From: Breno Leitao <leitao@debian.org> |
| |
| [ Upstream commit 5b5baba6222255d29626f63c41f101379ec5400b ] |
| |
| KCSAN has identified a potential data race in debugobjects, where the |
| global variable debug_objects_maxchain is accessed for both reading and |
| writing simultaneously in separate and parallel data paths. This results in |
| the following splat printed by KCSAN: |
| |
| BUG: KCSAN: data-race in debug_check_no_obj_freed / debug_object_activate |
| |
| write to 0xffffffff847ccfc8 of 4 bytes by task 734 on cpu 41: |
| debug_object_activate (lib/debugobjects.c:199 lib/debugobjects.c:564 lib/debugobjects.c:710) |
| call_rcu (kernel/rcu/rcu.h:227 kernel/rcu/tree.c:2719 kernel/rcu/tree.c:2838) |
| security_inode_free (security/security.c:1626) |
| __destroy_inode (./include/linux/fsnotify.h:222 fs/inode.c:287) |
| ... |
| read to 0xffffffff847ccfc8 of 4 bytes by task 384 on cpu 31: |
| debug_check_no_obj_freed (lib/debugobjects.c:1000 lib/debugobjects.c:1019) |
| kfree (mm/slub.c:2081 mm/slub.c:4280 mm/slub.c:4390) |
| percpu_ref_exit (lib/percpu-refcount.c:147) |
| css_free_rwork_fn (kernel/cgroup/cgroup.c:5357) |
| ... |
| value changed: 0x00000070 -> 0x00000071 |
| |
| The data race is actually harmless as this is just used for debugfs |
| statistics, as all other debug variables. |
| |
| Annotate all debug variables as racy explicitly, since these variables |
| are known to be racy and harmless. |
| |
| Signed-off-by: Breno Leitao <leitao@debian.org> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Link: https://lore.kernel.org/r/20240611091813.1189860-1-leitao@debian.org |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| lib/debugobjects.c | 21 +++++++++++---------- |
| 1 file changed, 11 insertions(+), 10 deletions(-) |
| |
| diff --git a/lib/debugobjects.c b/lib/debugobjects.c |
| index fb12a9bacd2fa..7cea91e193a8f 100644 |
| --- a/lib/debugobjects.c |
| +++ b/lib/debugobjects.c |
| @@ -78,16 +78,17 @@ static bool obj_freeing; |
| /* The number of objs on the global free list */ |
| static int obj_nr_tofree; |
| |
| -static int debug_objects_maxchain __read_mostly; |
| -static int __maybe_unused debug_objects_maxchecked __read_mostly; |
| -static int debug_objects_fixups __read_mostly; |
| -static int debug_objects_warnings __read_mostly; |
| -static int debug_objects_enabled __read_mostly |
| - = CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT; |
| -static int debug_objects_pool_size __read_mostly |
| - = ODEBUG_POOL_SIZE; |
| -static int debug_objects_pool_min_level __read_mostly |
| - = ODEBUG_POOL_MIN_LEVEL; |
| +static int __data_racy debug_objects_maxchain __read_mostly; |
| +static int __data_racy __maybe_unused debug_objects_maxchecked __read_mostly; |
| +static int __data_racy debug_objects_fixups __read_mostly; |
| +static int __data_racy debug_objects_warnings __read_mostly; |
| +static int __data_racy debug_objects_enabled __read_mostly |
| + = CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT; |
| +static int __data_racy debug_objects_pool_size __read_mostly |
| + = ODEBUG_POOL_SIZE; |
| +static int __data_racy debug_objects_pool_min_level __read_mostly |
| + = ODEBUG_POOL_MIN_LEVEL; |
| + |
| static const struct debug_obj_descr *descr_test __read_mostly; |
| static struct kmem_cache *obj_cache __ro_after_init; |
| |
| -- |
| 2.43.0 |
| |