@ -429,6 +429,74 @@ void vmpressure(gfp_t gfp, struct mem_cgroup *memcg, bool tree,
__vmpressure ( gfp , memcg , false , tree , scanned , reclaimed ) ;
__vmpressure ( gfp , memcg , false , tree , scanned , reclaimed ) ;
}
}
# else
static void vmpressure_memcg ( gfp_t gfp , struct mem_cgroup * memcg , bool tree ,
unsigned long scanned , unsigned long reclaimed )
{
}
# endif
static void vmpressure_global ( gfp_t gfp , unsigned long scanned ,
unsigned long reclaimed )
{
struct vmpressure * vmpr = & global_vmpressure ;
unsigned long pressure ;
if ( ! ( gfp & ( __GFP_HIGHMEM | __GFP_MOVABLE | __GFP_IO | __GFP_FS ) ) )
return ;
if ( ! scanned )
return ;
spin_lock ( & vmpr - > sr_lock ) ;
vmpr - > scanned + = scanned ;
vmpr - > reclaimed + = reclaimed ;
scanned = vmpr - > scanned ;
reclaimed = vmpr - > reclaimed ;
spin_unlock ( & vmpr - > sr_lock ) ;
if ( scanned < vmpressure_win )
return ;
spin_lock ( & vmpr - > sr_lock ) ;
vmpr - > scanned = 0 ;
vmpr - > reclaimed = 0 ;
spin_unlock ( & vmpr - > sr_lock ) ;
pressure = vmpressure_calc_pressure ( scanned , reclaimed ) ;
vmpressure_notify ( pressure ) ;
}
/**
* vmpressure ( ) - Account memory pressure through scanned / reclaimed ratio
* @ gfp : reclaimer ' s gfp mask
* @ memcg : cgroup memory controller handle
* @ tree : legacy subtree mode
* @ scanned : number of pages scanned
* @ reclaimed : number of pages reclaimed
*
* This function should be called from the vmscan reclaim path to account
* " instantaneous " memory pressure ( scanned / reclaimed ratio ) . The raw
* pressure index is then further refined and averaged over time .
*
* If @ tree is set , vmpressure is in traditional userspace reporting
* mode : @ memcg is considered the pressure root and userspace is
* notified of the entire subtree ' s reclaim efficiency .
*
* If @ tree is not set , reclaim efficiency is recorded for @ memcg , and
* only in - kernel users are notified .
*
* This function does not return any value .
*/
void vmpressure ( gfp_t gfp , struct mem_cgroup * memcg , bool tree ,
unsigned long scanned , unsigned long reclaimed )
{
if ( ! memcg & & tree )
vmpressure_global ( gfp , scanned , reclaimed ) ;
if ( IS_ENABLED ( CONFIG_MEMCG ) )
vmpressure_memcg ( gfp , memcg , tree , scanned , reclaimed ) ;
}
/**
/**
* vmpressure_prio ( ) - Account memory pressure through reclaimer priority level
* vmpressure_prio ( ) - Account memory pressure through reclaimer priority level