Message ID | 299298648bc5689b2f163c7876936179338301ba.1721380449.git.wqu@suse.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | btrfs: try to allocate larger folios for metadata | expand |
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@suse.com> > --- > 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 {
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; - 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 {
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@suse.com> --- include/linux/memcontrol.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)