lkml.org 
[lkml]   [2012]   [Mar]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[RFC][[PATCH 4/6] memcg: remove mem_cgroup pointer from page_cgroup

    This patch removes pc->mem_cgroup and merge the pointer into flags as

    63 4 0
    | pointer to memcg..........|flags|

    After this, memory cgroup's overhead is 8(4)bytes per a page.

    Changelog:
    - added BUILD_BUG_ON()
    - update comments in Kconfig

    Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    ---
    include/linux/page_cgroup.h | 21 +++++++++------------
    init/Kconfig | 2 +-
    2 files changed, 10 insertions(+), 13 deletions(-)

    diff --git a/include/linux/page_cgroup.h b/include/linux/page_cgroup.h
    index 3f3b4ff..7e3a3c7 100644
    --- a/include/linux/page_cgroup.h
    +++ b/include/linux/page_cgroup.h
    @@ -3,6 +3,10 @@

    #include <linux/smp.h>

    +/*
    + * These flags are encoded into low bits of unsigned long,
    + * ORed with a pointer to mem_cgroup.
    + */
    enum {
    /* flags for mem_cgroup */
    PCG_LOCK, /* Lock for pc->mem_cgroup and following bits. */
    @@ -12,6 +16,8 @@ enum {
    __NR_PCG_FLAGS,
    };

    +#define PCG_FLAGS_MASK ((1 << __NR_PCG_FLAGS) - 1)
    +
    #ifndef __GENERATING_BOUNDS_H
    #include <generated/bounds.h>

    @@ -27,7 +33,6 @@ enum {
    */
    struct page_cgroup {
    unsigned long flags;
    - struct mem_cgroup *mem_cgroup;
    };

    void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat);
    @@ -93,7 +98,7 @@ extern struct mem_cgroup* root_mem_cgroup;
    static inline struct mem_cgroup* pc_to_mem_cgroup(struct page_cgroup *pc)
    {
    if (likely(!PageCgroupReset(pc)))
    - return pc->mem_cgroup;
    + return (struct mem_cgroup*)(pc->flags & ~PCG_FLAGS_MASK);
    return root_mem_cgroup;
    }

    @@ -101,16 +106,8 @@ static inline void
    pc_set_mem_cgroup_and_flags(struct page_cgroup *pc, struct mem_cgroup *memcg,
    unsigned long flags)
    {
    - pc->mem_cgroup = memcg;
    - /*
    - * We access a page_cgroup asynchronously without lock_page_cgroup().
    - * Especially when a page_cgroup is taken from a page, pc's mem_cgroup
    - * is accessed after testing USED bit. To make pc's mem_cgroup visible
    - * before USED bit, we need memory barrier here.
    - * See mem_cgroup_add_lru_list(), etc.
    - */
    - smp_wmb();
    - pc->flags = flags;
    + BUILD_BUG_ON(__NR_PCG_FLAGS > 5); /* assume 32byte alignment. */
    + pc->flags = (unsigned long)memcg | flags;
    }

    #else /* CONFIG_CGROUP_MEM_RES_CTLR */
    diff --git a/init/Kconfig b/init/Kconfig
    index 6cfd71d..e0bfe92 100644
    --- a/init/Kconfig
    +++ b/init/Kconfig
    @@ -651,7 +651,7 @@ config CGROUP_MEM_RES_CTLR

    Note that setting this option increases fixed memory overhead
    associated with each page of memory in the system. By this,
    - 20(40)bytes/PAGE_SIZE on 32(64)bit system will be occupied by memory
    + 4(8)bytes/PAGE_SIZE on 32(64)bit system will be occupied by memory
    usage tracking struct at boot. Total amount of this is printed out
    at boot.

    --
    1.7.4.1



    \
     
     \ /
      Last update: 2012-03-28 13:03    [W:0.027 / U:182.324 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site