diff for duplicates of <20100302222455.GE2369@linux> diff --git a/a/1.txt b/N1/1.txt index 1e13a94..c40cfe7 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -5,15 +5,15 @@ On Tue, Mar 02, 2010 at 10:08:17AM -0800, Greg Thelen wrote: > > Infrastructure to account dirty pages per cgroup and add dirty limit > > interfaces in the cgroupfs: > > -> > - Direct write-out: memory.dirty_ratio, memory.dirty_bytes +> > - Direct write-out: memory.dirty_ratio, memory.dirty_bytes > > -> > - Background write-out: memory.dirty_background_ratio, memory.dirty_background_bytes +> > - Background write-out: memory.dirty_background_ratio, memory.dirty_background_bytes > > > > Signed-off-by: Andrea Righi <arighi@develer.com> > > --- -> > include/linux/memcontrol.h | 77 ++++++++++- -> > mm/memcontrol.c | 336 ++++++++++++++++++++++++++++++++++++++++---- -> > 2 files changed, 384 insertions(+), 29 deletions(-) +> > include/linux/memcontrol.h | 77 ++++++++++- +> > mm/memcontrol.c | 336 ++++++++++++++++++++++++++++++++++++++++---- +> > 2 files changed, 384 insertions(+), 29 deletions(-) > > > > diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h > > index 1f9b119..cc88b2e 100644 @@ -21,58 +21,58 @@ On Tue, Mar 02, 2010 at 10:08:17AM -0800, Greg Thelen wrote: > > +++ b/include/linux/memcontrol.h > > @@ -19,12 +19,50 @@ > > -> > #ifndef _LINUX_MEMCONTROL_H -> > #define _LINUX_MEMCONTROL_H +> > #ifndef _LINUX_MEMCONTROL_H +> > #define _LINUX_MEMCONTROL_H > > + > > +#include <linux/writeback.h> -> > #include <linux/cgroup.h> +> > #include <linux/cgroup.h> > > + -> > struct mem_cgroup; -> > struct page_cgroup; -> > struct page; -> > struct mm_struct; +> > struct mem_cgroup; +> > struct page_cgroup; +> > struct page; +> > struct mm_struct; > > > > +/* Cgroup memory statistics items exported to the kernel */ > > +enum mem_cgroup_page_stat_item { -> > + MEMCG_NR_DIRTYABLE_PAGES, -> > + MEMCG_NR_RECLAIM_PAGES, -> > + MEMCG_NR_WRITEBACK, -> > + MEMCG_NR_DIRTY_WRITEBACK_PAGES, +> > + MEMCG_NR_DIRTYABLE_PAGES, +> > + MEMCG_NR_RECLAIM_PAGES, +> > + MEMCG_NR_WRITEBACK, +> > + MEMCG_NR_DIRTY_WRITEBACK_PAGES, > > +}; > > + > > +/* > > + * Statistics for memory cgroup. > > + */ > > +enum mem_cgroup_stat_index { -> > + /* -> > + * For MEM_CONTAINER_TYPE_ALL, usage = pagecache + rss. -> > + */ -> > + MEM_CGROUP_STAT_CACHE, /* # of pages charged as cache */ -> > + MEM_CGROUP_STAT_RSS, /* # of pages charged as anon rss */ -> > + MEM_CGROUP_STAT_FILE_MAPPED, /* # of pages charged as file rss */ -> > + MEM_CGROUP_STAT_PGPGIN_COUNT, /* # of pages paged in */ -> > + MEM_CGROUP_STAT_PGPGOUT_COUNT, /* # of pages paged out */ -> > + MEM_CGROUP_STAT_EVENTS, /* sum of pagein + pageout for internal use */ -> > + MEM_CGROUP_STAT_SWAPOUT, /* # of pages, swapped out */ -> > + MEM_CGROUP_STAT_SOFTLIMIT, /* decrements on each page in/out. -> > + used by soft limit implementation */ -> > + MEM_CGROUP_STAT_THRESHOLDS, /* decrements on each page in/out. -> > + used by threshold implementation */ -> > + MEM_CGROUP_STAT_FILE_DIRTY, /* # of dirty pages in page cache */ -> > + MEM_CGROUP_STAT_WRITEBACK, /* # of pages under writeback */ -> > + MEM_CGROUP_STAT_WRITEBACK_TEMP, /* # of pages under writeback using -> > + temporary buffers */ -> > + MEM_CGROUP_STAT_UNSTABLE_NFS, /* # of NFS unstable pages */ +> > + /* +> > + * For MEM_CONTAINER_TYPE_ALL, usage = pagecache + rss. +> > + */ +> > + MEM_CGROUP_STAT_CACHE, /* # of pages charged as cache */ +> > + MEM_CGROUP_STAT_RSS, /* # of pages charged as anon rss */ +> > + MEM_CGROUP_STAT_FILE_MAPPED, /* # of pages charged as file rss */ +> > + MEM_CGROUP_STAT_PGPGIN_COUNT, /* # of pages paged in */ +> > + MEM_CGROUP_STAT_PGPGOUT_COUNT, /* # of pages paged out */ +> > + MEM_CGROUP_STAT_EVENTS, /* sum of pagein + pageout for internal use */ +> > + MEM_CGROUP_STAT_SWAPOUT, /* # of pages, swapped out */ +> > + MEM_CGROUP_STAT_SOFTLIMIT, /* decrements on each page in/out. +> > + used by soft limit implementation */ +> > + MEM_CGROUP_STAT_THRESHOLDS, /* decrements on each page in/out. +> > + used by threshold implementation */ +> > + MEM_CGROUP_STAT_FILE_DIRTY, /* # of dirty pages in page cache */ +> > + MEM_CGROUP_STAT_WRITEBACK, /* # of pages under writeback */ +> > + MEM_CGROUP_STAT_WRITEBACK_TEMP, /* # of pages under writeback using +> > + temporary buffers */ +> > + MEM_CGROUP_STAT_UNSTABLE_NFS, /* # of NFS unstable pages */ > > + -> > + MEM_CGROUP_STAT_NSTATS, +> > + MEM_CGROUP_STAT_NSTATS, > > +}; > > + -> > #ifdef CONFIG_CGROUP_MEM_RES_CTLR -> > /* -> > * All "charge" functions with gfp_mask should use GFP_KERNEL or +> > #ifdef CONFIG_CGROUP_MEM_RES_CTLR +> > /* +> > * All "charge" functions with gfp_mask should use GFP_KERNEL or > > @@ -117,6 +155,13 @@ extern void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, -> > extern int do_swap_account; -> > #endif +> > extern int do_swap_account; +> > #endif > > > > +extern long mem_cgroup_dirty_ratio(void); > > +extern unsigned long mem_cgroup_dirty_bytes(void); @@ -81,216 +81,216 @@ On Tue, Mar 02, 2010 at 10:08:17AM -0800, Greg Thelen wrote: > > + > > +extern s64 mem_cgroup_page_stat(enum mem_cgroup_page_stat_item item); > > + -> > static inline bool mem_cgroup_disabled(void) -> > { -> > if (mem_cgroup_subsys.disabled) +> > static inline bool mem_cgroup_disabled(void) +> > { +> > if (mem_cgroup_subsys.disabled) > > @@ -125,7 +170,8 @@ static inline bool mem_cgroup_disabled(void) -> > } +> > } > > -> > extern bool mem_cgroup_oom_called(struct task_struct *task); +> > extern bool mem_cgroup_oom_called(struct task_struct *task); > > -void mem_cgroup_update_file_mapped(struct page *page, int val); > > +void mem_cgroup_update_stat(struct page *page, -> > + enum mem_cgroup_stat_index idx, int val); -> > unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order, -> > gfp_t gfp_mask, int nid, -> > int zid); +> > + enum mem_cgroup_stat_index idx, int val); +> > unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order, +> > gfp_t gfp_mask, int nid, +> > int zid); > > @@ -300,8 +346,8 @@ mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p) -> > { -> > } +> > { +> > } > > > > -static inline void mem_cgroup_update_file_mapped(struct page *page, -> > - int val) +> > - int val) > > +static inline void mem_cgroup_update_stat(struct page *page, -> > + enum mem_cgroup_stat_index idx, int val) -> > { -> > } +> > + enum mem_cgroup_stat_index idx, int val) +> > { +> > } > > > > @@ -312,6 +358,31 @@ unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order, -> > return 0; -> > } +> > return 0; +> > } > > > > +static inline long mem_cgroup_dirty_ratio(void) > > +{ -> > + return vm_dirty_ratio; +> > + return vm_dirty_ratio; > > +} > > + > > +static inline unsigned long mem_cgroup_dirty_bytes(void) > > +{ -> > + return vm_dirty_bytes; +> > + return vm_dirty_bytes; > > +} > > + > > +static inline long mem_cgroup_dirty_background_ratio(void) > > +{ -> > + return dirty_background_ratio; +> > + return dirty_background_ratio; > > +} > > + > > +static inline unsigned long mem_cgroup_dirty_background_bytes(void) > > +{ -> > + return dirty_background_bytes; +> > + return dirty_background_bytes; > > +} > > + > > +static inline s64 mem_cgroup_page_stat(enum mem_cgroup_page_stat_item item) > > +{ -> > + return -ENOMEM; +> > + return -ENOMEM; > > +} > > + -> > #endif /* CONFIG_CGROUP_MEM_CONT */ +> > #endif /* CONFIG_CGROUP_MEM_CONT */ > > -> > #endif /* _LINUX_MEMCONTROL_H */ +> > #endif /* _LINUX_MEMCONTROL_H */ > > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > > index a443c30..e74cf66 100644 > > --- a/mm/memcontrol.c > > +++ b/mm/memcontrol.c > > @@ -66,31 +66,16 @@ static int really_do_swap_account __initdata = 1; /* for remember boot option*/ -> > #define SOFTLIMIT_EVENTS_THRESH (1000) -> > #define THRESHOLDS_EVENTS_THRESH (100) +> > #define SOFTLIMIT_EVENTS_THRESH (1000) +> > #define THRESHOLDS_EVENTS_THRESH (100) > > > > -/* > > - * Statistics for memory cgroup. > > - */ > > -enum mem_cgroup_stat_index { -> > - /* -> > - * For MEM_CONTAINER_TYPE_ALL, usage = pagecache + rss. -> > - */ -> > - MEM_CGROUP_STAT_CACHE, /* # of pages charged as cache */ -> > - MEM_CGROUP_STAT_RSS, /* # of pages charged as anon rss */ -> > - MEM_CGROUP_STAT_FILE_MAPPED, /* # of pages charged as file rss */ -> > - MEM_CGROUP_STAT_PGPGIN_COUNT, /* # of pages paged in */ -> > - MEM_CGROUP_STAT_PGPGOUT_COUNT, /* # of pages paged out */ -> > - MEM_CGROUP_STAT_SWAPOUT, /* # of pages, swapped out */ -> > - MEM_CGROUP_STAT_SOFTLIMIT, /* decrements on each page in/out. -> > - used by soft limit implementation */ -> > - MEM_CGROUP_STAT_THRESHOLDS, /* decrements on each page in/out. -> > - used by threshold implementation */ +> > - /* +> > - * For MEM_CONTAINER_TYPE_ALL, usage = pagecache + rss. +> > - */ +> > - MEM_CGROUP_STAT_CACHE, /* # of pages charged as cache */ +> > - MEM_CGROUP_STAT_RSS, /* # of pages charged as anon rss */ +> > - MEM_CGROUP_STAT_FILE_MAPPED, /* # of pages charged as file rss */ +> > - MEM_CGROUP_STAT_PGPGIN_COUNT, /* # of pages paged in */ +> > - MEM_CGROUP_STAT_PGPGOUT_COUNT, /* # of pages paged out */ +> > - MEM_CGROUP_STAT_SWAPOUT, /* # of pages, swapped out */ +> > - MEM_CGROUP_STAT_SOFTLIMIT, /* decrements on each page in/out. +> > - used by soft limit implementation */ +> > - MEM_CGROUP_STAT_THRESHOLDS, /* decrements on each page in/out. +> > - used by threshold implementation */ > > - -> > - MEM_CGROUP_STAT_NSTATS, +> > - MEM_CGROUP_STAT_NSTATS, > > -}; > > - -> > struct mem_cgroup_stat_cpu { -> > s64 count[MEM_CGROUP_STAT_NSTATS]; -> > }; +> > struct mem_cgroup_stat_cpu { +> > s64 count[MEM_CGROUP_STAT_NSTATS]; +> > }; > > > > +/* Per cgroup page statistics */ > > +struct mem_cgroup_page_stat { -> > + enum mem_cgroup_page_stat_item item; -> > + s64 value; +> > + enum mem_cgroup_page_stat_item item; +> > + s64 value; > > +}; > > + -> > /* -> > * per-zone information in memory controller. -> > */ +> > /* +> > * per-zone information in memory controller. +> > */ > > @@ -157,6 +142,15 @@ struct mem_cgroup_threshold_ary { -> > static bool mem_cgroup_threshold_check(struct mem_cgroup *mem); -> > static void mem_cgroup_threshold(struct mem_cgroup *mem); +> > static bool mem_cgroup_threshold_check(struct mem_cgroup *mem); +> > static void mem_cgroup_threshold(struct mem_cgroup *mem); > > > > +enum mem_cgroup_dirty_param { -> > + MEM_CGROUP_DIRTY_RATIO, -> > + MEM_CGROUP_DIRTY_BYTES, -> > + MEM_CGROUP_DIRTY_BACKGROUND_RATIO, -> > + MEM_CGROUP_DIRTY_BACKGROUND_BYTES, +> > + MEM_CGROUP_DIRTY_RATIO, +> > + MEM_CGROUP_DIRTY_BYTES, +> > + MEM_CGROUP_DIRTY_BACKGROUND_RATIO, +> > + MEM_CGROUP_DIRTY_BACKGROUND_BYTES, > > + -> > + MEM_CGROUP_DIRTY_NPARAMS, +> > + MEM_CGROUP_DIRTY_NPARAMS, > > +}; > > + -> > /* -> > * The memory controller data structure. The memory controller controls both -> > * page cache and RSS per cgroup. We would eventually like to provide +> > /* +> > * The memory controller data structure. The memory controller controls both +> > * page cache and RSS per cgroup. We would eventually like to provide > > @@ -205,6 +199,9 @@ struct mem_cgroup { > > -> > unsigned int swappiness; +> > unsigned int swappiness; > > -> > + /* control memory cgroup dirty pages */ -> > + unsigned long dirty_param[MEM_CGROUP_DIRTY_NPARAMS]; +> > + /* control memory cgroup dirty pages */ +> > + unsigned long dirty_param[MEM_CGROUP_DIRTY_NPARAMS]; > > + -> > /* set when res.limit == memsw.limit */ -> > bool memsw_is_minimum; +> > /* set when res.limit == memsw.limit */ +> > bool memsw_is_minimum; > > > > @@ -1021,6 +1018,164 @@ static unsigned int get_swappiness(struct mem_cgroup *memcg) -> > return swappiness; -> > } +> > return swappiness; +> > } > > > > +static unsigned long get_dirty_param(struct mem_cgroup *memcg, -> > + enum mem_cgroup_dirty_param idx) +> > + enum mem_cgroup_dirty_param idx) > > +{ -> > + unsigned long ret; +> > + unsigned long ret; > > + -> > + VM_BUG_ON(idx >= MEM_CGROUP_DIRTY_NPARAMS); -> > + spin_lock(&memcg->reclaim_param_lock); -> > + ret = memcg->dirty_param[idx]; -> > + spin_unlock(&memcg->reclaim_param_lock); +> > + VM_BUG_ON(idx >= MEM_CGROUP_DIRTY_NPARAMS); +> > + spin_lock(&memcg->reclaim_param_lock); +> > + ret = memcg->dirty_param[idx]; +> > + spin_unlock(&memcg->reclaim_param_lock); > > + -> > + return ret; +> > + return ret; > > +} > > + > > > +long mem_cgroup_dirty_ratio(void) > > +{ -> > + struct mem_cgroup *memcg; -> > + long ret = vm_dirty_ratio; +> > + struct mem_cgroup *memcg; +> > + long ret = vm_dirty_ratio; > > + -> > + if (mem_cgroup_disabled()) -> > + return ret; -> > + /* -> > + * It's possible that "current" may be moved to other cgroup while we -> > + * access cgroup. But precise check is meaningless because the task can -> > + * be moved after our access and writeback tends to take long time. -> > + * At least, "memcg" will not be freed under rcu_read_lock(). -> > + */ -> > + rcu_read_lock(); -> > + memcg = mem_cgroup_from_task(current); -> > + if (likely(memcg)) -> > + ret = get_dirty_param(memcg, MEM_CGROUP_DIRTY_RATIO); -> > + rcu_read_unlock(); +> > + if (mem_cgroup_disabled()) +> > + return ret; +> > + /* +> > + * It's possible that "current" may be moved to other cgroup while we +> > + * access cgroup. But precise check is meaningless because the task can +> > + * be moved after our access and writeback tends to take long time. +> > + * At least, "memcg" will not be freed under rcu_read_lock(). +> > + */ +> > + rcu_read_lock(); +> > + memcg = mem_cgroup_from_task(current); +> > + if (likely(memcg)) +> > + ret = get_dirty_param(memcg, MEM_CGROUP_DIRTY_RATIO); +> > + rcu_read_unlock(); > > + -> > + return ret; +> > + return ret; > > +} > > + > > +unsigned long mem_cgroup_dirty_bytes(void) > > +{ -> > + struct mem_cgroup *memcg; -> > + unsigned long ret = vm_dirty_bytes; +> > + struct mem_cgroup *memcg; +> > + unsigned long ret = vm_dirty_bytes; > > + -> > + if (mem_cgroup_disabled()) -> > + return ret; -> > + rcu_read_lock(); -> > + memcg = mem_cgroup_from_task(current); -> > + if (likely(memcg)) -> > + ret = get_dirty_param(memcg, MEM_CGROUP_DIRTY_BYTES); -> > + rcu_read_unlock(); +> > + if (mem_cgroup_disabled()) +> > + return ret; +> > + rcu_read_lock(); +> > + memcg = mem_cgroup_from_task(current); +> > + if (likely(memcg)) +> > + ret = get_dirty_param(memcg, MEM_CGROUP_DIRTY_BYTES); +> > + rcu_read_unlock(); > > + -> > + return ret; +> > + return ret; > > +} > > + > > +long mem_cgroup_dirty_background_ratio(void) > > +{ -> > + struct mem_cgroup *memcg; -> > + long ret = dirty_background_ratio; +> > + struct mem_cgroup *memcg; +> > + long ret = dirty_background_ratio; > > + -> > + if (mem_cgroup_disabled()) -> > + return ret; -> > + rcu_read_lock(); -> > + memcg = mem_cgroup_from_task(current); -> > + if (likely(memcg)) -> > + ret = get_dirty_param(memcg, MEM_CGROUP_DIRTY_BACKGROUND_RATIO); -> > + rcu_read_unlock(); +> > + if (mem_cgroup_disabled()) +> > + return ret; +> > + rcu_read_lock(); +> > + memcg = mem_cgroup_from_task(current); +> > + if (likely(memcg)) +> > + ret = get_dirty_param(memcg, MEM_CGROUP_DIRTY_BACKGROUND_RATIO); +> > + rcu_read_unlock(); > > + -> > + return ret; +> > + return ret; > > +} > > + > > +unsigned long mem_cgroup_dirty_background_bytes(void) > > +{ -> > + struct mem_cgroup *memcg; -> > + unsigned long ret = dirty_background_bytes; +> > + struct mem_cgroup *memcg; +> > + unsigned long ret = dirty_background_bytes; > > + -> > + if (mem_cgroup_disabled()) -> > + return ret; -> > + rcu_read_lock(); -> > + memcg = mem_cgroup_from_task(current); -> > + if (likely(memcg)) -> > + ret = get_dirty_param(memcg, MEM_CGROUP_DIRTY_BACKGROUND_BYTES); -> > + rcu_read_unlock(); +> > + if (mem_cgroup_disabled()) +> > + return ret; +> > + rcu_read_lock(); +> > + memcg = mem_cgroup_from_task(current); +> > + if (likely(memcg)) +> > + ret = get_dirty_param(memcg, MEM_CGROUP_DIRTY_BACKGROUND_BYTES); +> > + rcu_read_unlock(); > > + -> > + return ret; +> > + return ret; > > +} > > Given that mem_cgroup_dirty_[background_]{ratio,bytes}() are similar, @@ -300,3 +300,9 @@ Agreed. Thanks, -Andrea + +-- +To unsubscribe, send a message with 'unsubscribe linux-mm' in +the body to majordomo@kvack.org. For more info on Linux MM, +see: http://www.linux-mm.org/ . +Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> diff --git a/a/content_digest b/N1/content_digest index c87d035..e8366be 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -23,15 +23,15 @@ "> > Infrastructure to account dirty pages per cgroup and add dirty limit\n" "> > interfaces in the cgroupfs:\n" "> >\n" - "> > \302\240- Direct write-out: memory.dirty_ratio, memory.dirty_bytes\n" + "> > - Direct write-out: memory.dirty_ratio, memory.dirty_bytes\n" "> >\n" - "> > \302\240- Background write-out: memory.dirty_background_ratio, memory.dirty_background_bytes\n" + "> > - Background write-out: memory.dirty_background_ratio, memory.dirty_background_bytes\n" "> >\n" "> > Signed-off-by: Andrea Righi <arighi@develer.com>\n" "> > ---\n" - "> > \302\240include/linux/memcontrol.h | \302\240 77 ++++++++++-\n" - "> > \302\240mm/memcontrol.c \302\240 \302\240 \302\240 \302\240 \302\240 \302\240| \302\240336 ++++++++++++++++++++++++++++++++++++++++----\n" - "> > \302\2402 files changed, 384 insertions(+), 29 deletions(-)\n" + "> > include/linux/memcontrol.h | 77 ++++++++++-\n" + "> > mm/memcontrol.c | 336 ++++++++++++++++++++++++++++++++++++++++----\n" + "> > 2 files changed, 384 insertions(+), 29 deletions(-)\n" "> >\n" "> > diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h\n" "> > index 1f9b119..cc88b2e 100644\n" @@ -39,58 +39,58 @@ "> > +++ b/include/linux/memcontrol.h\n" "> > @@ -19,12 +19,50 @@\n" "> >\n" - "> > \302\240#ifndef _LINUX_MEMCONTROL_H\n" - "> > \302\240#define _LINUX_MEMCONTROL_H\n" + "> > #ifndef _LINUX_MEMCONTROL_H\n" + "> > #define _LINUX_MEMCONTROL_H\n" "> > +\n" "> > +#include <linux/writeback.h>\n" - "> > \302\240#include <linux/cgroup.h>\n" + "> > #include <linux/cgroup.h>\n" "> > +\n" - "> > \302\240struct mem_cgroup;\n" - "> > \302\240struct page_cgroup;\n" - "> > \302\240struct page;\n" - "> > \302\240struct mm_struct;\n" + "> > struct mem_cgroup;\n" + "> > struct page_cgroup;\n" + "> > struct page;\n" + "> > struct mm_struct;\n" "> >\n" "> > +/* Cgroup memory statistics items exported to the kernel */\n" "> > +enum mem_cgroup_page_stat_item {\n" - "> > + \302\240 \302\240 \302\240 MEMCG_NR_DIRTYABLE_PAGES,\n" - "> > + \302\240 \302\240 \302\240 MEMCG_NR_RECLAIM_PAGES,\n" - "> > + \302\240 \302\240 \302\240 MEMCG_NR_WRITEBACK,\n" - "> > + \302\240 \302\240 \302\240 MEMCG_NR_DIRTY_WRITEBACK_PAGES,\n" + "> > + MEMCG_NR_DIRTYABLE_PAGES,\n" + "> > + MEMCG_NR_RECLAIM_PAGES,\n" + "> > + MEMCG_NR_WRITEBACK,\n" + "> > + MEMCG_NR_DIRTY_WRITEBACK_PAGES,\n" "> > +};\n" "> > +\n" "> > +/*\n" "> > + * Statistics for memory cgroup.\n" "> > + */\n" "> > +enum mem_cgroup_stat_index {\n" - "> > + \302\240 \302\240 \302\240 /*\n" - "> > + \302\240 \302\240 \302\240 \302\240* For MEM_CONTAINER_TYPE_ALL, usage = pagecache + rss.\n" - "> > + \302\240 \302\240 \302\240 \302\240*/\n" - "> > + \302\240 \302\240 \302\240 MEM_CGROUP_STAT_CACHE, \302\240 \302\240 /* # of pages charged as cache */\n" - "> > + \302\240 \302\240 \302\240 MEM_CGROUP_STAT_RSS, \302\240 \302\240 \302\240 /* # of pages charged as anon rss */\n" - "> > + \302\240 \302\240 \302\240 MEM_CGROUP_STAT_FILE_MAPPED, \302\240/* # of pages charged as file rss */\n" - "> > + \302\240 \302\240 \302\240 MEM_CGROUP_STAT_PGPGIN_COUNT, \302\240 /* # of pages paged in */\n" - "> > + \302\240 \302\240 \302\240 MEM_CGROUP_STAT_PGPGOUT_COUNT, \302\240/* # of pages paged out */\n" - "> > + \302\240 \302\240 \302\240 MEM_CGROUP_STAT_EVENTS, /* sum of pagein + pageout for internal use */\n" - "> > + \302\240 \302\240 \302\240 MEM_CGROUP_STAT_SWAPOUT, /* # of pages, swapped out */\n" - "> > + \302\240 \302\240 \302\240 MEM_CGROUP_STAT_SOFTLIMIT, /* decrements on each page in/out.\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 used by soft limit implementation */\n" - "> > + \302\240 \302\240 \302\240 MEM_CGROUP_STAT_THRESHOLDS, /* decrements on each page in/out.\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 used by threshold implementation */\n" - "> > + \302\240 \302\240 \302\240 MEM_CGROUP_STAT_FILE_DIRTY, \302\240 /* # of dirty pages in page cache */\n" - "> > + \302\240 \302\240 \302\240 MEM_CGROUP_STAT_WRITEBACK, \302\240 /* # of pages under writeback */\n" - "> > + \302\240 \302\240 \302\240 MEM_CGROUP_STAT_WRITEBACK_TEMP, \302\240 /* # of pages under writeback using\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 temporary buffers */\n" - "> > + \302\240 \302\240 \302\240 MEM_CGROUP_STAT_UNSTABLE_NFS, \302\240 /* # of NFS unstable pages */\n" + "> > + /*\n" + "> > + * For MEM_CONTAINER_TYPE_ALL, usage = pagecache + rss.\n" + "> > + */\n" + "> > + MEM_CGROUP_STAT_CACHE, /* # of pages charged as cache */\n" + "> > + MEM_CGROUP_STAT_RSS, /* # of pages charged as anon rss */\n" + "> > + MEM_CGROUP_STAT_FILE_MAPPED, /* # of pages charged as file rss */\n" + "> > + MEM_CGROUP_STAT_PGPGIN_COUNT, /* # of pages paged in */\n" + "> > + MEM_CGROUP_STAT_PGPGOUT_COUNT, /* # of pages paged out */\n" + "> > + MEM_CGROUP_STAT_EVENTS, /* sum of pagein + pageout for internal use */\n" + "> > + MEM_CGROUP_STAT_SWAPOUT, /* # of pages, swapped out */\n" + "> > + MEM_CGROUP_STAT_SOFTLIMIT, /* decrements on each page in/out.\n" + "> > + used by soft limit implementation */\n" + "> > + MEM_CGROUP_STAT_THRESHOLDS, /* decrements on each page in/out.\n" + "> > + used by threshold implementation */\n" + "> > + MEM_CGROUP_STAT_FILE_DIRTY, /* # of dirty pages in page cache */\n" + "> > + MEM_CGROUP_STAT_WRITEBACK, /* # of pages under writeback */\n" + "> > + MEM_CGROUP_STAT_WRITEBACK_TEMP, /* # of pages under writeback using\n" + "> > + temporary buffers */\n" + "> > + MEM_CGROUP_STAT_UNSTABLE_NFS, /* # of NFS unstable pages */\n" "> > +\n" - "> > + \302\240 \302\240 \302\240 MEM_CGROUP_STAT_NSTATS,\n" + "> > + MEM_CGROUP_STAT_NSTATS,\n" "> > +};\n" "> > +\n" - "> > \302\240#ifdef CONFIG_CGROUP_MEM_RES_CTLR\n" - "> > \302\240/*\n" - "> > \302\240* All \"charge\" functions with gfp_mask should use GFP_KERNEL or\n" + "> > #ifdef CONFIG_CGROUP_MEM_RES_CTLR\n" + "> > /*\n" + "> > * All \"charge\" functions with gfp_mask should use GFP_KERNEL or\n" "> > @@ -117,6 +155,13 @@ extern void mem_cgroup_print_oom_info(struct mem_cgroup *memcg,\n" - "> > \302\240extern int do_swap_account;\n" - "> > \302\240#endif\n" + "> > extern int do_swap_account;\n" + "> > #endif\n" "> >\n" "> > +extern long mem_cgroup_dirty_ratio(void);\n" "> > +extern unsigned long mem_cgroup_dirty_bytes(void);\n" @@ -99,216 +99,216 @@ "> > +\n" "> > +extern s64 mem_cgroup_page_stat(enum mem_cgroup_page_stat_item item);\n" "> > +\n" - "> > \302\240static inline bool mem_cgroup_disabled(void)\n" - "> > \302\240{\n" - "> > \302\240 \302\240 \302\240 \302\240if (mem_cgroup_subsys.disabled)\n" + "> > static inline bool mem_cgroup_disabled(void)\n" + "> > {\n" + "> > if (mem_cgroup_subsys.disabled)\n" "> > @@ -125,7 +170,8 @@ static inline bool mem_cgroup_disabled(void)\n" - "> > \302\240}\n" + "> > }\n" "> >\n" - "> > \302\240extern bool mem_cgroup_oom_called(struct task_struct *task);\n" + "> > extern bool mem_cgroup_oom_called(struct task_struct *task);\n" "> > -void mem_cgroup_update_file_mapped(struct page *page, int val);\n" "> > +void mem_cgroup_update_stat(struct page *page,\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 enum mem_cgroup_stat_index idx, int val);\n" - "> > \302\240unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order,\n" - "> > \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240gfp_t gfp_mask, int nid,\n" - "> > \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240int zid);\n" + "> > + enum mem_cgroup_stat_index idx, int val);\n" + "> > unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order,\n" + "> > gfp_t gfp_mask, int nid,\n" + "> > int zid);\n" "> > @@ -300,8 +346,8 @@ mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p)\n" - "> > \302\240{\n" - "> > \302\240}\n" + "> > {\n" + "> > }\n" "> >\n" "> > -static inline void mem_cgroup_update_file_mapped(struct page *page,\n" - "> > - \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 int val)\n" + "> > - int val)\n" "> > +static inline void mem_cgroup_update_stat(struct page *page,\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 enum mem_cgroup_stat_index idx, int val)\n" - "> > \302\240{\n" - "> > \302\240}\n" + "> > + enum mem_cgroup_stat_index idx, int val)\n" + "> > {\n" + "> > }\n" "> >\n" "> > @@ -312,6 +358,31 @@ unsigned long mem_cgroup_soft_limit_reclaim(struct zone *zone, int order,\n" - "> > \302\240 \302\240 \302\240 \302\240return 0;\n" - "> > \302\240}\n" + "> > return 0;\n" + "> > }\n" "> >\n" "> > +static inline long mem_cgroup_dirty_ratio(void)\n" "> > +{\n" - "> > + \302\240 \302\240 \302\240 return vm_dirty_ratio;\n" + "> > + return vm_dirty_ratio;\n" "> > +}\n" "> > +\n" "> > +static inline unsigned long mem_cgroup_dirty_bytes(void)\n" "> > +{\n" - "> > + \302\240 \302\240 \302\240 return vm_dirty_bytes;\n" + "> > + return vm_dirty_bytes;\n" "> > +}\n" "> > +\n" "> > +static inline long mem_cgroup_dirty_background_ratio(void)\n" "> > +{\n" - "> > + \302\240 \302\240 \302\240 return dirty_background_ratio;\n" + "> > + return dirty_background_ratio;\n" "> > +}\n" "> > +\n" "> > +static inline unsigned long mem_cgroup_dirty_background_bytes(void)\n" "> > +{\n" - "> > + \302\240 \302\240 \302\240 return dirty_background_bytes;\n" + "> > + return dirty_background_bytes;\n" "> > +}\n" "> > +\n" "> > +static inline s64 mem_cgroup_page_stat(enum mem_cgroup_page_stat_item item)\n" "> > +{\n" - "> > + \302\240 \302\240 \302\240 return -ENOMEM;\n" + "> > + return -ENOMEM;\n" "> > +}\n" "> > +\n" - "> > \302\240#endif /* CONFIG_CGROUP_MEM_CONT */\n" + "> > #endif /* CONFIG_CGROUP_MEM_CONT */\n" "> >\n" - "> > \302\240#endif /* _LINUX_MEMCONTROL_H */\n" + "> > #endif /* _LINUX_MEMCONTROL_H */\n" "> > diff --git a/mm/memcontrol.c b/mm/memcontrol.c\n" "> > index a443c30..e74cf66 100644\n" "> > --- a/mm/memcontrol.c\n" "> > +++ b/mm/memcontrol.c\n" "> > @@ -66,31 +66,16 @@ static int really_do_swap_account __initdata = 1; /* for remember boot option*/\n" - "> > \302\240#define SOFTLIMIT_EVENTS_THRESH (1000)\n" - "> > \302\240#define THRESHOLDS_EVENTS_THRESH (100)\n" + "> > #define SOFTLIMIT_EVENTS_THRESH (1000)\n" + "> > #define THRESHOLDS_EVENTS_THRESH (100)\n" "> >\n" "> > -/*\n" "> > - * Statistics for memory cgroup.\n" "> > - */\n" "> > -enum mem_cgroup_stat_index {\n" - "> > - \302\240 \302\240 \302\240 /*\n" - "> > - \302\240 \302\240 \302\240 \302\240* For MEM_CONTAINER_TYPE_ALL, usage = pagecache + rss.\n" - "> > - \302\240 \302\240 \302\240 \302\240*/\n" - "> > - \302\240 \302\240 \302\240 MEM_CGROUP_STAT_CACHE, \302\240 \302\240 /* # of pages charged as cache */\n" - "> > - \302\240 \302\240 \302\240 MEM_CGROUP_STAT_RSS, \302\240 \302\240 \302\240 /* # of pages charged as anon rss */\n" - "> > - \302\240 \302\240 \302\240 MEM_CGROUP_STAT_FILE_MAPPED, \302\240/* # of pages charged as file rss */\n" - "> > - \302\240 \302\240 \302\240 MEM_CGROUP_STAT_PGPGIN_COUNT, \302\240 /* # of pages paged in */\n" - "> > - \302\240 \302\240 \302\240 MEM_CGROUP_STAT_PGPGOUT_COUNT, \302\240/* # of pages paged out */\n" - "> > - \302\240 \302\240 \302\240 MEM_CGROUP_STAT_SWAPOUT, /* # of pages, swapped out */\n" - "> > - \302\240 \302\240 \302\240 MEM_CGROUP_STAT_SOFTLIMIT, /* decrements on each page in/out.\n" - "> > - \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 used by soft limit implementation */\n" - "> > - \302\240 \302\240 \302\240 MEM_CGROUP_STAT_THRESHOLDS, /* decrements on each page in/out.\n" - "> > - \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 used by threshold implementation */\n" + "> > - /*\n" + "> > - * For MEM_CONTAINER_TYPE_ALL, usage = pagecache + rss.\n" + "> > - */\n" + "> > - MEM_CGROUP_STAT_CACHE, /* # of pages charged as cache */\n" + "> > - MEM_CGROUP_STAT_RSS, /* # of pages charged as anon rss */\n" + "> > - MEM_CGROUP_STAT_FILE_MAPPED, /* # of pages charged as file rss */\n" + "> > - MEM_CGROUP_STAT_PGPGIN_COUNT, /* # of pages paged in */\n" + "> > - MEM_CGROUP_STAT_PGPGOUT_COUNT, /* # of pages paged out */\n" + "> > - MEM_CGROUP_STAT_SWAPOUT, /* # of pages, swapped out */\n" + "> > - MEM_CGROUP_STAT_SOFTLIMIT, /* decrements on each page in/out.\n" + "> > - used by soft limit implementation */\n" + "> > - MEM_CGROUP_STAT_THRESHOLDS, /* decrements on each page in/out.\n" + "> > - used by threshold implementation */\n" "> > -\n" - "> > - \302\240 \302\240 \302\240 MEM_CGROUP_STAT_NSTATS,\n" + "> > - MEM_CGROUP_STAT_NSTATS,\n" "> > -};\n" "> > -\n" - "> > \302\240struct mem_cgroup_stat_cpu {\n" - "> > \302\240 \302\240 \302\240 \302\240s64 count[MEM_CGROUP_STAT_NSTATS];\n" - "> > \302\240};\n" + "> > struct mem_cgroup_stat_cpu {\n" + "> > s64 count[MEM_CGROUP_STAT_NSTATS];\n" + "> > };\n" "> >\n" "> > +/* Per cgroup page statistics */\n" "> > +struct mem_cgroup_page_stat {\n" - "> > + \302\240 \302\240 \302\240 enum mem_cgroup_page_stat_item item;\n" - "> > + \302\240 \302\240 \302\240 s64 value;\n" + "> > + enum mem_cgroup_page_stat_item item;\n" + "> > + s64 value;\n" "> > +};\n" "> > +\n" - "> > \302\240/*\n" - "> > \302\240* per-zone information in memory controller.\n" - "> > \302\240*/\n" + "> > /*\n" + "> > * per-zone information in memory controller.\n" + "> > */\n" "> > @@ -157,6 +142,15 @@ struct mem_cgroup_threshold_ary {\n" - "> > \302\240static bool mem_cgroup_threshold_check(struct mem_cgroup *mem);\n" - "> > \302\240static void mem_cgroup_threshold(struct mem_cgroup *mem);\n" + "> > static bool mem_cgroup_threshold_check(struct mem_cgroup *mem);\n" + "> > static void mem_cgroup_threshold(struct mem_cgroup *mem);\n" "> >\n" "> > +enum mem_cgroup_dirty_param {\n" - "> > + \302\240 \302\240 \302\240 MEM_CGROUP_DIRTY_RATIO,\n" - "> > + \302\240 \302\240 \302\240 MEM_CGROUP_DIRTY_BYTES,\n" - "> > + \302\240 \302\240 \302\240 MEM_CGROUP_DIRTY_BACKGROUND_RATIO,\n" - "> > + \302\240 \302\240 \302\240 MEM_CGROUP_DIRTY_BACKGROUND_BYTES,\n" + "> > + MEM_CGROUP_DIRTY_RATIO,\n" + "> > + MEM_CGROUP_DIRTY_BYTES,\n" + "> > + MEM_CGROUP_DIRTY_BACKGROUND_RATIO,\n" + "> > + MEM_CGROUP_DIRTY_BACKGROUND_BYTES,\n" "> > +\n" - "> > + \302\240 \302\240 \302\240 MEM_CGROUP_DIRTY_NPARAMS,\n" + "> > + MEM_CGROUP_DIRTY_NPARAMS,\n" "> > +};\n" "> > +\n" - "> > \302\240/*\n" - "> > \302\240* The memory controller data structure. The memory controller controls both\n" - "> > \302\240* page cache and RSS per cgroup. We would eventually like to provide\n" + "> > /*\n" + "> > * The memory controller data structure. The memory controller controls both\n" + "> > * page cache and RSS per cgroup. We would eventually like to provide\n" "> > @@ -205,6 +199,9 @@ struct mem_cgroup {\n" "> >\n" - "> > \302\240 \302\240 \302\240 \302\240unsigned int \302\240 \302\240swappiness;\n" + "> > unsigned int swappiness;\n" "> >\n" - "> > + \302\240 \302\240 \302\240 /* control memory cgroup dirty pages */\n" - "> > + \302\240 \302\240 \302\240 unsigned long dirty_param[MEM_CGROUP_DIRTY_NPARAMS];\n" + "> > + /* control memory cgroup dirty pages */\n" + "> > + unsigned long dirty_param[MEM_CGROUP_DIRTY_NPARAMS];\n" "> > +\n" - "> > \302\240 \302\240 \302\240 \302\240/* set when res.limit == memsw.limit */\n" - "> > \302\240 \302\240 \302\240 \302\240bool \302\240 \302\240 \302\240 \302\240 \302\240 \302\240memsw_is_minimum;\n" + "> > /* set when res.limit == memsw.limit */\n" + "> > bool memsw_is_minimum;\n" "> >\n" "> > @@ -1021,6 +1018,164 @@ static unsigned int get_swappiness(struct mem_cgroup *memcg)\n" - "> > \302\240 \302\240 \302\240 \302\240return swappiness;\n" - "> > \302\240}\n" + "> > return swappiness;\n" + "> > }\n" "> >\n" "> > +static unsigned long get_dirty_param(struct mem_cgroup *memcg,\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 enum mem_cgroup_dirty_param idx)\n" + "> > + enum mem_cgroup_dirty_param idx)\n" "> > +{\n" - "> > + \302\240 \302\240 \302\240 unsigned long ret;\n" + "> > + unsigned long ret;\n" "> > +\n" - "> > + \302\240 \302\240 \302\240 VM_BUG_ON(idx >= MEM_CGROUP_DIRTY_NPARAMS);\n" - "> > + \302\240 \302\240 \302\240 spin_lock(&memcg->reclaim_param_lock);\n" - "> > + \302\240 \302\240 \302\240 ret = memcg->dirty_param[idx];\n" - "> > + \302\240 \302\240 \302\240 spin_unlock(&memcg->reclaim_param_lock);\n" + "> > + VM_BUG_ON(idx >= MEM_CGROUP_DIRTY_NPARAMS);\n" + "> > + spin_lock(&memcg->reclaim_param_lock);\n" + "> > + ret = memcg->dirty_param[idx];\n" + "> > + spin_unlock(&memcg->reclaim_param_lock);\n" "> > +\n" - "> > + \302\240 \302\240 \302\240 return ret;\n" + "> > + return ret;\n" "> > +}\n" "> > +\n" "> \n" "> > +long mem_cgroup_dirty_ratio(void)\n" "> > +{\n" - "> > + \302\240 \302\240 \302\240 struct mem_cgroup *memcg;\n" - "> > + \302\240 \302\240 \302\240 long ret = vm_dirty_ratio;\n" + "> > + struct mem_cgroup *memcg;\n" + "> > + long ret = vm_dirty_ratio;\n" "> > +\n" - "> > + \302\240 \302\240 \302\240 if (mem_cgroup_disabled())\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 return ret;\n" - "> > + \302\240 \302\240 \302\240 /*\n" - "> > + \302\240 \302\240 \302\240 \302\240* It's possible that \"current\" may be moved to other cgroup while we\n" - "> > + \302\240 \302\240 \302\240 \302\240* access cgroup. But precise check is meaningless because the task can\n" - "> > + \302\240 \302\240 \302\240 \302\240* be moved after our access and writeback tends to take long time.\n" - "> > + \302\240 \302\240 \302\240 \302\240* At least, \"memcg\" will not be freed under rcu_read_lock().\n" - "> > + \302\240 \302\240 \302\240 \302\240*/\n" - "> > + \302\240 \302\240 \302\240 rcu_read_lock();\n" - "> > + \302\240 \302\240 \302\240 memcg = mem_cgroup_from_task(current);\n" - "> > + \302\240 \302\240 \302\240 if (likely(memcg))\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 ret = get_dirty_param(memcg, MEM_CGROUP_DIRTY_RATIO);\n" - "> > + \302\240 \302\240 \302\240 rcu_read_unlock();\n" + "> > + if (mem_cgroup_disabled())\n" + "> > + return ret;\n" + "> > + /*\n" + "> > + * It's possible that \"current\" may be moved to other cgroup while we\n" + "> > + * access cgroup. But precise check is meaningless because the task can\n" + "> > + * be moved after our access and writeback tends to take long time.\n" + "> > + * At least, \"memcg\" will not be freed under rcu_read_lock().\n" + "> > + */\n" + "> > + rcu_read_lock();\n" + "> > + memcg = mem_cgroup_from_task(current);\n" + "> > + if (likely(memcg))\n" + "> > + ret = get_dirty_param(memcg, MEM_CGROUP_DIRTY_RATIO);\n" + "> > + rcu_read_unlock();\n" "> > +\n" - "> > + \302\240 \302\240 \302\240 return ret;\n" + "> > + return ret;\n" "> > +}\n" "> > +\n" "> > +unsigned long mem_cgroup_dirty_bytes(void)\n" "> > +{\n" - "> > + \302\240 \302\240 \302\240 struct mem_cgroup *memcg;\n" - "> > + \302\240 \302\240 \302\240 unsigned long ret = vm_dirty_bytes;\n" + "> > + struct mem_cgroup *memcg;\n" + "> > + unsigned long ret = vm_dirty_bytes;\n" "> > +\n" - "> > + \302\240 \302\240 \302\240 if (mem_cgroup_disabled())\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 return ret;\n" - "> > + \302\240 \302\240 \302\240 rcu_read_lock();\n" - "> > + \302\240 \302\240 \302\240 memcg = mem_cgroup_from_task(current);\n" - "> > + \302\240 \302\240 \302\240 if (likely(memcg))\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 ret = get_dirty_param(memcg, MEM_CGROUP_DIRTY_BYTES);\n" - "> > + \302\240 \302\240 \302\240 rcu_read_unlock();\n" + "> > + if (mem_cgroup_disabled())\n" + "> > + return ret;\n" + "> > + rcu_read_lock();\n" + "> > + memcg = mem_cgroup_from_task(current);\n" + "> > + if (likely(memcg))\n" + "> > + ret = get_dirty_param(memcg, MEM_CGROUP_DIRTY_BYTES);\n" + "> > + rcu_read_unlock();\n" "> > +\n" - "> > + \302\240 \302\240 \302\240 return ret;\n" + "> > + return ret;\n" "> > +}\n" "> > +\n" "> > +long mem_cgroup_dirty_background_ratio(void)\n" "> > +{\n" - "> > + \302\240 \302\240 \302\240 struct mem_cgroup *memcg;\n" - "> > + \302\240 \302\240 \302\240 long ret = dirty_background_ratio;\n" + "> > + struct mem_cgroup *memcg;\n" + "> > + long ret = dirty_background_ratio;\n" "> > +\n" - "> > + \302\240 \302\240 \302\240 if (mem_cgroup_disabled())\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 return ret;\n" - "> > + \302\240 \302\240 \302\240 rcu_read_lock();\n" - "> > + \302\240 \302\240 \302\240 memcg = mem_cgroup_from_task(current);\n" - "> > + \302\240 \302\240 \302\240 if (likely(memcg))\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 ret = get_dirty_param(memcg, MEM_CGROUP_DIRTY_BACKGROUND_RATIO);\n" - "> > + \302\240 \302\240 \302\240 rcu_read_unlock();\n" + "> > + if (mem_cgroup_disabled())\n" + "> > + return ret;\n" + "> > + rcu_read_lock();\n" + "> > + memcg = mem_cgroup_from_task(current);\n" + "> > + if (likely(memcg))\n" + "> > + ret = get_dirty_param(memcg, MEM_CGROUP_DIRTY_BACKGROUND_RATIO);\n" + "> > + rcu_read_unlock();\n" "> > +\n" - "> > + \302\240 \302\240 \302\240 return ret;\n" + "> > + return ret;\n" "> > +}\n" "> > +\n" "> > +unsigned long mem_cgroup_dirty_background_bytes(void)\n" "> > +{\n" - "> > + \302\240 \302\240 \302\240 struct mem_cgroup *memcg;\n" - "> > + \302\240 \302\240 \302\240 unsigned long ret = dirty_background_bytes;\n" + "> > + struct mem_cgroup *memcg;\n" + "> > + unsigned long ret = dirty_background_bytes;\n" "> > +\n" - "> > + \302\240 \302\240 \302\240 if (mem_cgroup_disabled())\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 return ret;\n" - "> > + \302\240 \302\240 \302\240 rcu_read_lock();\n" - "> > + \302\240 \302\240 \302\240 memcg = mem_cgroup_from_task(current);\n" - "> > + \302\240 \302\240 \302\240 if (likely(memcg))\n" - "> > + \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 \302\240 ret = get_dirty_param(memcg, MEM_CGROUP_DIRTY_BACKGROUND_BYTES);\n" - "> > + \302\240 \302\240 \302\240 rcu_read_unlock();\n" + "> > + if (mem_cgroup_disabled())\n" + "> > + return ret;\n" + "> > + rcu_read_lock();\n" + "> > + memcg = mem_cgroup_from_task(current);\n" + "> > + if (likely(memcg))\n" + "> > + ret = get_dirty_param(memcg, MEM_CGROUP_DIRTY_BACKGROUND_BYTES);\n" + "> > + rcu_read_unlock();\n" "> > +\n" - "> > + \302\240 \302\240 \302\240 return ret;\n" + "> > + return ret;\n" "> > +}\n" "> \n" "> Given that mem_cgroup_dirty_[background_]{ratio,bytes}() are similar,\n" @@ -317,6 +317,12 @@ "Agreed.\n" "\n" "Thanks,\n" - -Andrea + "-Andrea\n" + "\n" + "--\n" + "To unsubscribe, send a message with 'unsubscribe linux-mm' in\n" + "the body to majordomo@kvack.org. For more info on Linux MM,\n" + "see: http://www.linux-mm.org/ .\n" + "Don't email: <a href=mailto:\"dont@kvack.org\"> email@kvack.org </a>" -d20b75174a890e21df5d2dd77c6060cd1cd11c36141eec138d75f93849055384 +42b95749ec0bde0fcc4e27626d7ac21586c9b0f2723e0dc8a4aaf62dbf3e46b0
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.