lkml.org 
[lkml]   [2009]   [Apr]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH 2/5] bio-cgroup: The new page_cgroup framework
    From
    This patch makes the page_cgroup framework be able to be used even if
    the compile option of the cgroup memory controller is off.
    So bio-cgroup can use this framework without the memory controller.

    Based on 2.6.30-rc1
    Signed-off-by: Hirokazu Takahashi <taka@valinux.co.jp>
    Signed-off-by: Ryo Tsuruta <ryov@valinux.co.jp>

    ---
    include/linux/memcontrol.h | 6 ++++++
    include/linux/mmzone.h | 4 ++--
    include/linux/page_cgroup.h | 8 +++++---
    init/Kconfig | 4 ++++
    mm/Makefile | 3 ++-
    mm/memcontrol.c | 6 ++++++
    mm/page_cgroup.c | 3 +--
    7 files changed, 26 insertions(+), 8 deletions(-)

    Index: linux-2.6.30-rc1/include/linux/memcontrol.h
    ===================================================================
    --- linux-2.6.30-rc1.orig/include/linux/memcontrol.h
    +++ linux-2.6.30-rc1/include/linux/memcontrol.h
    @@ -37,6 +37,8 @@ struct mm_struct;
    * (Of course, if memcg does memory allocation in future, GFP_KERNEL is sane.)
    */

    +extern void __init_mem_page_cgroup(struct page_cgroup *pc);
    +
    extern int mem_cgroup_newpage_charge(struct page *page, struct mm_struct *mm,
    gfp_t gfp_mask);
    /* for swap handling */
    @@ -120,6 +122,10 @@ extern bool mem_cgroup_oom_called(struct
    #else /* CONFIG_CGROUP_MEM_RES_CTLR */
    struct mem_cgroup;

    +static inline void __init_mem_page_cgroup(struct page_cgroup *pc)
    +{
    +}
    +
    static inline int mem_cgroup_newpage_charge(struct page *page,
    struct mm_struct *mm, gfp_t gfp_mask)
    {
    Index: linux-2.6.30-rc1/include/linux/mmzone.h
    ===================================================================
    --- linux-2.6.30-rc1.orig/include/linux/mmzone.h
    +++ linux-2.6.30-rc1/include/linux/mmzone.h
    @@ -607,7 +607,7 @@ typedef struct pglist_data {
    int nr_zones;
    #ifdef CONFIG_FLAT_NODE_MEM_MAP /* means !SPARSEMEM */
    struct page *node_mem_map;
    -#ifdef CONFIG_CGROUP_MEM_RES_CTLR
    +#ifdef CONFIG_CGROUP_PAGE
    struct page_cgroup *node_page_cgroup;
    #endif
    #endif
    @@ -958,7 +958,7 @@ struct mem_section {

    /* See declaration of similar field in struct zone */
    unsigned long *pageblock_flags;
    -#ifdef CONFIG_CGROUP_MEM_RES_CTLR
    +#ifdef CONFIG_CGROUP_PAGE
    /*
    * If !SPARSEMEM, pgdat doesn't have page_cgroup pointer. We use
    * section. (see memcontrol.h/page_cgroup.h about this.)
    Index: linux-2.6.30-rc1/include/linux/page_cgroup.h
    ===================================================================
    --- linux-2.6.30-rc1.orig/include/linux/page_cgroup.h
    +++ linux-2.6.30-rc1/include/linux/page_cgroup.h
    @@ -1,7 +1,7 @@
    #ifndef __LINUX_PAGE_CGROUP_H
    #define __LINUX_PAGE_CGROUP_H

    -#ifdef CONFIG_CGROUP_MEM_RES_CTLR
    +#ifdef CONFIG_CGROUP_PAGE
    #include <linux/bit_spinlock.h>
    /*
    * Page Cgroup can be considered as an extended mem_map.
    @@ -12,9 +12,11 @@
    */
    struct page_cgroup {
    unsigned long flags;
    - struct mem_cgroup *mem_cgroup;
    struct page *page;
    +#ifdef CONFIG_CGROUP_MEM_RES_CTLR
    + struct mem_cgroup *mem_cgroup;
    struct list_head lru; /* per cgroup LRU list */
    +#endif
    };

    void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat);
    @@ -71,7 +73,7 @@ static inline void unlock_page_cgroup(st
    bit_spin_unlock(PCG_LOCK, &pc->flags);
    }

    -#else /* CONFIG_CGROUP_MEM_RES_CTLR */
    +#else /* CONFIG_CGROUP_PAGE */
    struct page_cgroup;

    static inline void __meminit pgdat_page_cgroup_init(struct pglist_data *pgdat)
    Index: linux-2.6.30-rc1/init/Kconfig
    ===================================================================
    --- linux-2.6.30-rc1.orig/init/Kconfig
    +++ linux-2.6.30-rc1/init/Kconfig
    @@ -608,6 +608,10 @@ config CGROUP_MEM_RES_CTLR_SWAP

    endif # CGROUPS

    +config CGROUP_PAGE
    + def_bool y
    + depends on CGROUP_MEM_RES_CTLR
    +
    config MM_OWNER
    bool

    Index: linux-2.6.30-rc1/mm/Makefile
    ===================================================================
    --- linux-2.6.30-rc1.orig/mm/Makefile
    +++ linux-2.6.30-rc1/mm/Makefile
    @@ -37,4 +37,5 @@ else
    obj-$(CONFIG_SMP) += allocpercpu.o
    endif
    obj-$(CONFIG_QUICKLIST) += quicklist.o
    -obj-$(CONFIG_CGROUP_MEM_RES_CTLR) += memcontrol.o page_cgroup.o
    +obj-$(CONFIG_CGROUP_MEM_RES_CTLR) += memcontrol.o
    +obj-$(CONFIG_CGROUP_PAGE) += page_cgroup.o
    Index: linux-2.6.30-rc1/mm/memcontrol.c
    ===================================================================
    --- linux-2.6.30-rc1.orig/mm/memcontrol.c
    +++ linux-2.6.30-rc1/mm/memcontrol.c
    @@ -128,6 +128,12 @@ struct mem_cgroup_lru_info {
    struct mem_cgroup_per_node *nodeinfo[MAX_NUMNODES];
    };

    +void __meminit __init_mem_page_cgroup(struct page_cgroup *pc)
    +{
    + pc->mem_cgroup = NULL;
    + INIT_LIST_HEAD(&pc->lru);
    +}
    +
    /*
    * The memory controller data structure. The memory controller controls both
    * page cache and RSS per cgroup. We would eventually like to provide
    Index: linux-2.6.30-rc1/mm/page_cgroup.c
    ===================================================================
    --- linux-2.6.30-rc1.orig/mm/page_cgroup.c
    +++ linux-2.6.30-rc1/mm/page_cgroup.c
    @@ -14,9 +14,8 @@ static void __meminit
    __init_page_cgroup(struct page_cgroup *pc, unsigned long pfn)
    {
    pc->flags = 0;
    - pc->mem_cgroup = NULL;
    pc->page = pfn_to_page(pfn);
    - INIT_LIST_HEAD(&pc->lru);
    + __init_mem_page_cgroup(pc);
    }
    static unsigned long total_usage;


    \
     
     \ /
      Last update: 2009-04-16 14:33    [W:0.028 / U:89.124 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site