]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
slub: Introduce freeze_slab()
authorChengming Zhou <zhouchengming@bytedance.com>
Thu, 2 Nov 2023 03:23:26 +0000 (03:23 +0000)
committerVlastimil Babka <vbabka@suse.cz>
Mon, 4 Dec 2023 16:55:29 +0000 (17:55 +0100)
We will have unfrozen slabs out of the node partial list later, so we
need a freeze_slab() function to freeze the partial slab and get its
freelist.

Signed-off-by: Chengming Zhou <zhouchengming@bytedance.com>
Reviewed-by: Vlastimil Babka <vbabka@suse.cz>
Tested-by: Hyeonggon Yoo <42.hyeyoo@gmail.com>
Reviewed-by: Hyeonggon Yoo <42.hyeyoo@gmail.com>
Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
mm/slub.c

index 18f18fbbd97e1466e1d4456c7c732759164e9e63..253626ef9f37609d568ceddc980e303da0aaba14 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -3098,6 +3098,33 @@ static inline void *get_freelist(struct kmem_cache *s, struct slab *slab)
        return freelist;
 }
 
+/*
+ * Freeze the partial slab and return the pointer to the freelist.
+ */
+static inline void *freeze_slab(struct kmem_cache *s, struct slab *slab)
+{
+       struct slab new;
+       unsigned long counters;
+       void *freelist;
+
+       do {
+               freelist = slab->freelist;
+               counters = slab->counters;
+
+               new.counters = counters;
+               VM_BUG_ON(new.frozen);
+
+               new.inuse = slab->objects;
+               new.frozen = 1;
+
+       } while (!slab_update_freelist(s, slab,
+               freelist, counters,
+               NULL, new.counters,
+               "freeze_slab"));
+
+       return freelist;
+}
+
 /*
  * Slow path. The lockless freelist is empty or we need to perform
  * debugging duties.