]> www.infradead.org Git - users/hch/misc.git/commitdiff
slab: Reuse first bit for OBJEXTS_ALLOC_FAIL
authorAlexei Starovoitov <ast@kernel.org>
Tue, 9 Sep 2025 01:00:06 +0000 (18:00 -0700)
committerVlastimil Babka <vbabka@suse.cz>
Mon, 29 Sep 2025 07:42:36 +0000 (09:42 +0200)
Since the combination of valid upper bits in slab->obj_exts with
OBJEXTS_ALLOC_FAIL bit can never happen,
use OBJEXTS_ALLOC_FAIL == (1ull << 0) as a magic sentinel
instead of (1ull << 2) to free up bit 2.

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Shakeel Butt <shakeel.butt@linux.dev>
Reviewed-by: Harry Yoo <harry.yoo@oracle.com>
Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
include/linux/memcontrol.h
mm/slub.c

index 785173aa0739cc5579da30e61b108d8bc9903f0d..d254c0b96d0d50e623551aa8cc3f0f3535ffcafd 100644 (file)
@@ -341,17 +341,23 @@ enum page_memcg_data_flags {
        __NR_MEMCG_DATA_FLAGS  = (1UL << 2),
 };
 
+#define __OBJEXTS_ALLOC_FAIL   MEMCG_DATA_OBJEXTS
 #define __FIRST_OBJEXT_FLAG    __NR_MEMCG_DATA_FLAGS
 
 #else /* CONFIG_MEMCG */
 
+#define __OBJEXTS_ALLOC_FAIL   (1UL << 0)
 #define __FIRST_OBJEXT_FLAG    (1UL << 0)
 
 #endif /* CONFIG_MEMCG */
 
 enum objext_flags {
-       /* slabobj_ext vector failed to allocate */
-       OBJEXTS_ALLOC_FAIL = __FIRST_OBJEXT_FLAG,
+       /*
+        * Use bit 0 with zero other bits to signal that slabobj_ext vector
+        * failed to allocate. The same bit 0 with valid upper bits means
+        * MEMCG_DATA_OBJEXTS.
+        */
+       OBJEXTS_ALLOC_FAIL = __OBJEXTS_ALLOC_FAIL,
        /* the next bit after the last actual flag */
        __NR_OBJEXTS_FLAGS  = (__FIRST_OBJEXT_FLAG << 1),
 };
index ee575ed9250f1483bd42b7d202940a6b843e3b65..189cd5aa4ac462ecec582957e5058c43dfc51dd1 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -2046,7 +2046,7 @@ static inline void handle_failed_objexts_alloc(unsigned long obj_exts,
         * objects with no tag reference. Mark all references in this
         * vector as empty to avoid warnings later on.
         */
-       if (obj_exts & OBJEXTS_ALLOC_FAIL) {
+       if (obj_exts == OBJEXTS_ALLOC_FAIL) {
                unsigned int i;
 
                for (i = 0; i < objects; i++)