Unable to understand a piece of code

Amit Kumar free.amit.kumar at gmail.com
Sun May 19 23:33:55 EDT 2019


On Mon, 20 May 2019, 6:54 am Tobin C. Harding, <me at tobin.cc> 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.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20190520/7e80bdf9/attachment.html>


More information about the Kernelnewbies mailing list