Hi, You can see the definition of struct slab, the counters uses same space with inuse, objects and frozen because they are in a union. So when counters gets a value, the other 3 members also get a value. struct slab { ......snip...... union { unsigned long counters; struct { unsigned inuse:16; unsigned objects:15; unsigned frozen:1; }; }; ......snip...... } Regards, Xiongwei On Sun, Nov 12, 2023 at 5:55 AM geng sun <sun.gengeration.sun@xxxxxxxxx> wrote: > > Hi linux-mm > > I find one odd variable “new” in slub, it was used before init. > Maybe the value in new was undefined. > And I can not understand how it work. > Could you explain this code for me? > Thanks. > > Best regards. > static void __slab_free(struct kmem_cache *s, struct page *page, > void *head, void *tail, int cnt, > unsigned long addr) > > { > void *prior; > int was_frozen; > struct page new; > unsigned long counters; > struct kmem_cache_node *n = NULL; > unsigned long flags; > stat(s, FREE_SLOWPATH); > if (kmem_cache_debug(s) && > !free_debug_processing(s, page, head, tail, cnt, addr)) > return; > > do { > if (unlikely(n)) { > spin_unlock_irqrestore(&n->list_lock, flags); > n = NULL; > } > prior = page->freelist; > counters = page->counters; > set_freepointer(s, tail, prior); > new.counters = counters; > was_frozen = new.frozen; > new.inuse -= cnt; > if ((!new.inuse || !prior) && !was_frozen) {