mm/slub: mark racy accesses on slab->slabs
authorlinke li <lilinke99@qq.com>
Thu, 21 Mar 2024 03:48:15 +0000 (11:48 +0800)
committerVlastimil Babka <vbabka@suse.cz>
Mon, 25 Mar 2024 08:45:28 +0000 (09:45 +0100)
The reads of slab->slabs are racy because it may be changed by
put_cpu_partial concurrently. In slabs_cpu_partial_show() and
show_slab_objects(), slab->slabs is only used for showing information.

Data-racy reads from shared variables that are used only for diagnostic
purposes should typically use data_race(), since it is normally not a
problem if the values are off by a little.

This patch is aimed at reducing the number of benign races reported by
KCSAN in order to focus future debugging effort on harmful races.

Signed-off-by: linke li <lilinke99@qq.com>
Reviewed-by: Chengming Zhou <chengming.zhou@linux.dev>
Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
mm/slub.c

index cc7e68fbdbbac3674840dfe3f536d6de9740214d..d35d918776250812a154c7e4a80b1ed3dfce1ca3 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -6036,7 +6036,7 @@ static ssize_t show_slab_objects(struct kmem_cache *s,
                                else if (flags & SO_OBJECTS)
                                        WARN_ON_ONCE(1);
                                else
-                                       x = slab->slabs;
+                                       x = data_race(slab->slabs);
                                total += x;
                                nodes[node] += x;
                        }
@@ -6241,7 +6241,7 @@ static ssize_t slabs_cpu_partial_show(struct kmem_cache *s, char *buf)
                slab = slub_percpu_partial(per_cpu_ptr(s->cpu_slab, cpu));
 
                if (slab)
-                       slabs += slab->slabs;
+                       slabs += data_race(slab->slabs);
        }
 #endif
 
@@ -6255,7 +6255,7 @@ static ssize_t slabs_cpu_partial_show(struct kmem_cache *s, char *buf)
 
                slab = slub_percpu_partial(per_cpu_ptr(s->cpu_slab, cpu));
                if (slab) {
-                       slabs = READ_ONCE(slab->slabs);
+                       slabs = data_race(slab->slabs);
                        objects = (slabs * oo_objects(s->oo)) / 2;
                        len += sysfs_emit_at(buf, len, " C%d=%d(%d)",
                                             cpu, objects, slabs);