On 7/19/24 11:16 AM, Qu Wenruo wrote: > There is an incoming btrfs patchset, which will use @root_mem_cgroup as > the active cgroup to attach metadata folios to its internal btree > inode, so that btrfs can skip the possibly costly charge for the > internal inode which is only accessible by btrfs itself. > > However @root_mem_cgroup is not always defined (not defined for > CONFIG_MEMCG=n case), thus all such callers need to do the extra > handling for different CONFIG_MEMCG settings. > > So here we add a special macro definition of root_mem_cgroup, making it > to always be NULL. > > The advantage of this, other than pulling the pointer definition out, > is that we will avoid wasting global data section space for such > pointer. > > Signed-off-by: Qu Wenruo <wqu@xxxxxxxx> > --- > include/linux/memcontrol.h | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h > index 030d34e9d117..a268585babdc 100644 > --- a/include/linux/memcontrol.h > +++ b/include/linux/memcontrol.h > @@ -329,8 +329,6 @@ struct mem_cgroup { > */ > #define MEMCG_CHARGE_BATCH 64U > > -extern struct mem_cgroup *root_mem_cgroup; > - This breaks the CONFIG_MEMCG=y case? > enum page_memcg_data_flags { > /* page->memcg_data is a pointer to an slabobj_ext vector */ > MEMCG_DATA_OBJEXTS = (1UL << 0), > @@ -346,6 +344,12 @@ enum page_memcg_data_flags { > > #define __FIRST_OBJEXT_FLAG (1UL << 0) > > +/* > + * For CONFIG_MEMCG=n case, still define a root_mem_cgroup, but that will > + * always be NULL and not taking any global data section space. > + */ > +#define root_mem_cgroup (NULL) > + > #endif /* CONFIG_MEMCG */ > > enum objext_flags {