@ -2717,39 +2717,48 @@ static int mem_cgroup_hierarchy_write(struct cgroup_subsys_state *css,
return retval ;
}
static unsigned long tree_stat ( struct mem_cgroup * memcg ,
enum mem_cgroup_stat_index idx )
static void tree_stat ( struct mem_cgroup * memcg , unsigned long * stat )
{
struct mem_cgroup * iter ;
uns ig ned long val = 0 ;
int i ;
for_each_mem_cgroup_tree ( iter , memcg )
val + = mem_cgroup_read_stat ( iter , idx ) ;
memset ( stat , 0 , sizeof ( * stat ) * MEMCG_NR_STAT ) ;
return val ;
for_each_mem_cgroup_tree ( iter , memcg ) {
for ( i = 0 ; i < MEMCG_NR_STAT ; i + + )
stat [ i ] + = mem_cgroup_read_stat ( iter , i ) ;
}
}
static unsigned long tree_events ( struct mem_cgroup * memcg ,
enum mem_cgroup_events_index idx )
static void tree_events ( struct mem_cgroup * memcg , unsigned long * events )
{
struct mem_cgroup * iter ;
uns ig ned long val = 0 ;
int i ;
for_each_mem_cgroup_tree ( iter , memcg )
val + = mem_cgroup_read_events ( iter , idx ) ;
memset ( events , 0 , sizeof ( * events ) * MEMCG_NR_EVENTS ) ;
return val ;
for_each_mem_cgroup_tree ( iter , memcg ) {
for ( i = 0 ; i < MEMCG_NR_EVENTS ; i + + )
events [ i ] + = mem_cgroup_read_events ( iter , i ) ;
}
}
static unsigned long mem_cgroup_usage ( struct mem_cgroup * memcg , bool swap )
{
unsigned long val ;
unsigned long val = 0 ;
if ( mem_cgroup_is_root ( memcg ) ) {
val = tree_stat ( memcg , MEM_CGROUP_STAT_CACHE ) ;
val + = tree_stat ( memcg , MEM_CGROUP_STAT_RSS ) ;
if ( swap )
val + = tree_stat ( memcg , MEM_CGROUP_STAT_SWAP ) ;
struct mem_cgroup * iter ;
for_each_mem_cgroup_tree ( iter , memcg ) {
val + = mem_cgroup_read_stat ( iter ,
MEM_CGROUP_STAT_CACHE ) ;
val + = mem_cgroup_read_stat ( iter ,
MEM_CGROUP_STAT_RSS ) ;
if ( swap )
val + = mem_cgroup_read_stat ( iter ,
MEM_CGROUP_STAT_SWAP ) ;
}
} else {
if ( ! swap )
val = page_counter_read ( & memcg - > memory ) ;
@ -5075,6 +5084,8 @@ static int memory_events_show(struct seq_file *m, void *v)
static int memory_stat_show ( struct seq_file * m , void * v )
{
struct mem_cgroup * memcg = mem_cgroup_from_css ( seq_css ( m ) ) ;
unsigned long stat [ MEMCG_NR_STAT ] ;
unsigned long events [ MEMCG_NR_EVENTS ] ;
int i ;
/*
@ -5088,22 +5099,22 @@ static int memory_stat_show(struct seq_file *m, void *v)
* Current memory state :
*/
tree_stat ( memcg , stat ) ;
tree_events ( memcg , events ) ;
seq_printf ( m , " anon %llu \n " ,
( u64 ) tree_stat ( memcg , MEM_CGROUP_STAT_RSS ) * PAGE_SIZE ) ;
( u64 ) stat [ MEM_CGROUP_STAT_RSS ] * PAGE_SIZE ) ;
seq_printf ( m , " file %llu \n " ,
( u64 ) tree_stat ( memcg , MEM_CGROUP_STAT_CACHE ) * PAGE_SIZE ) ;
( u64 ) stat [ MEM_CGROUP_STAT_CACHE ] * PAGE_SIZE ) ;
seq_printf ( m , " sock %llu \n " ,
( u64 ) tree_stat ( memcg , MEMCG_SOCK ) * PAGE_SIZE ) ;
( u64 ) stat [ MEMCG_SOCK ] * PAGE_SIZE ) ;
seq_printf ( m , " file_mapped %llu \n " ,
( u64 ) tree_stat ( memcg , MEM_CGROUP_STAT_FILE_MAPPED ) *
PAGE_SIZE ) ;
( u64 ) stat [ MEM_CGROUP_STAT_FILE_MAPPED ] * PAGE_SIZE ) ;
seq_printf ( m , " file_dirty %llu \n " ,
( u64 ) tree_stat ( memcg , MEM_CGROUP_STAT_DIRTY ) *
PAGE_SIZE ) ;
( u64 ) stat [ MEM_CGROUP_STAT_DIRTY ] * PAGE_SIZE ) ;
seq_printf ( m , " file_writeback %llu \n " ,
( u64 ) tree_stat ( memcg , MEM_CGROUP_STAT_WRITEBACK ) *
PAGE_SIZE ) ;
( u64 ) stat [ MEM_CGROUP_STAT_WRITEBACK ] * PAGE_SIZE ) ;
for ( i = 0 ; i < NR_LRU_LISTS ; i + + ) {
struct mem_cgroup * mi ;
@ -5118,9 +5129,9 @@ static int memory_stat_show(struct seq_file *m, void *v)
/* Accumulated memory events */
seq_printf ( m , " pgfault %lu \n " ,
tree_events ( memcg , MEM_CGROUP_EVENTS_PGFAULT ) ) ;
events [ MEM_CGROUP_EVENTS_PGFAULT ] ) ;
seq_printf ( m , " pgmajfault %lu \n " ,
tree_events ( memcg , MEM_CGROUP_EVENTS_PGMAJFAULT ) ) ;
events [ MEM_CGROUP_EVENTS_PGMAJFAULT ] ) ;
return 0 ;
}