On Mon, 20 May 2019, 6:54 am Tobin C. Harding, wrote: > On Mon, May 20, 2019 at 05:37:41AM +0530, Amit Kumar wrote: > > HI, > > > > mm/slub.c: line 3973 > > int __kmem_cache_shrink(struct kmem_cache *s) > > { > > int node; > > int i; > > struct kmem_cache_node *n; > > struct page *page; > > struct page *t; > > struct list_head discard; > > struct list_head promote[SHRINK_PROMOTE_MAX]; > > unsigned long flags; > > int ret = 0; > > > > flush_all(s); > > for_each_kmem_cache_node(s, node, n) { > > > > How uninitialized variable node is being used in macro > for_each_kmem_cache_node? > > > > node is a local variable with no extern and not initialized. > > > > mm/slab.h: line 490 > > #define for_each_kmem_cache_node(__s, __node, __n) \ > > for (__node = 0; __node < nr_node_ids; __node++) \ > > This _is_ the initialization of node. First thank you for your reply. I just did not use my brain that node is initialized using __node inside for loop. I know well macros are literally replaced and do not exist anymore after preprocessing. Macros are kinda funky, there > isn't much more to say about that other than perhaps read up some more > about how macros work in C and read a bunch more macros in the kernel > e.g. include/linux/list.h > > Good luck, > Tobin. >