On Thu, Apr 14, 2011 at 5:16 PM, KAMEZAWA Hiroyuki < kamezawa.hiroyu@jp.fujitsu.com> wrote: > On Thu, 14 Apr 2011 15:54:21 -0700 > Ying Han wrote: > > > There are two watermarks added per-memcg including "high_wmark" and > "low_wmark". > > The per-memcg kswapd is invoked when the memcg's memory > usage(usage_in_bytes) > > is higher than the low_wmark. Then the kswapd thread starts to reclaim > pages > > until the usage is lower than the high_wmark. > > > > Each watermark is calculated based on the hard_limit(limit_in_bytes) for > each > > memcg. Each time the hard_limit is changed, the corresponding wmarks are > > re-calculated. Since memory controller charges only user pages, there is > > no need for a "min_wmark". The current calculation of wmarks is based on > > individual tunable low/high_wmark_distance, which are set to 0 by > default. > > > > changelog v4..v3: > > 1. remove legacy comments > > 2. rename the res_counter_check_under_high_wmark_limit > > 3. replace the wmark_ratio per-memcg by individual tunable for both > wmarks. > > 4. add comments on low/high_wmark > > 5. add individual tunables for low/high_wmarks and remove wmark_ratio > > 6. replace the mem_cgroup_get_limit() call by res_count_read_u64(). The > first > > one returns large value w/ swapon. > > > > changelog v3..v2: > > 1. Add VM_BUG_ON() on couple of places. > > 2. Remove the spinlock on the min_free_kbytes since the consequence of > reading > > stale data. > > 3. Remove the "min_free_kbytes" API and replace it with wmark_ratio based > on > > hard_limit. > > > > changelog v2..v1: > > 1. Remove the res_counter_charge on wmark due to performance concern. > > 2. Move the new APIs min_free_kbytes, reclaim_wmarks into seperate > commit. > > 3. Calculate the min_free_kbytes automatically based on the > limit_in_bytes. > > 4. make the wmark to be consistant with core VM which checks the free > pages > > instead of usage. > > 5. changed wmark to be boolean > > > > Signed-off-by: Ying Han > > Acked-by: KAMEZAWA Hiroyuki > > some nitpick below. > > > > > --- > > include/linux/memcontrol.h | 1 + > > include/linux/res_counter.h | 78 > +++++++++++++++++++++++++++++++++++++++++++ > > kernel/res_counter.c | 6 +++ > > mm/memcontrol.c | 48 ++++++++++++++++++++++++++ > > 4 files changed, 133 insertions(+), 0 deletions(-) > > > > diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h > > index 5a5ce70..3ece36d 100644 > > --- a/include/linux/memcontrol.h > > +++ b/include/linux/memcontrol.h > > @@ -82,6 +82,7 @@ int task_in_mem_cgroup(struct task_struct *task, const > struct mem_cgroup *mem); > > > > extern struct mem_cgroup *try_get_mem_cgroup_from_page(struct page > *page); > > extern struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p); > > +extern int mem_cgroup_watermark_ok(struct mem_cgroup *mem, int > charge_flags); > > > > static inline > > int mm_match_cgroup(const struct mm_struct *mm, const struct mem_cgroup > *cgroup) > > diff --git a/include/linux/res_counter.h b/include/linux/res_counter.h > > index c9d625c..77eaaa9 100644 > > --- a/include/linux/res_counter.h > > +++ b/include/linux/res_counter.h > > @@ -39,6 +39,14 @@ struct res_counter { > > */ > > unsigned long long soft_limit; > > /* > > + * the limit that reclaim triggers. > > + */ > > + unsigned long long low_wmark_limit; > > + /* > > + * the limit that reclaim stops. > > + */ > > + unsigned long long high_wmark_limit; > > + /* > > * the number of unsuccessful attempts to consume the resource > > */ > > unsigned long long failcnt; > > @@ -55,6 +63,9 @@ struct res_counter { > > > > #define RESOURCE_MAX (unsigned long long)LLONG_MAX > > > > +#define CHARGE_WMARK_LOW 0x01 > > +#define CHARGE_WMARK_HIGH 0x02 > > + > > /** > > * Helpers to interact with userspace > > * res_counter_read_u64() - returns the value of the specified member. > > @@ -92,6 +103,8 @@ enum { > > RES_LIMIT, > > RES_FAILCNT, > > RES_SOFT_LIMIT, > > + RES_LOW_WMARK_LIMIT, > > + RES_HIGH_WMARK_LIMIT > > }; > > > > /* > > @@ -147,6 +160,24 @@ static inline unsigned long long > res_counter_margin(struct res_counter *cnt) > > return margin; > > } > > > > +static inline bool > > +res_counter_high_wmark_limit_check_locked(struct res_counter *cnt) > > +{ > > + if (cnt->usage < cnt->high_wmark_limit) > > + return true; > > + > > + return false; > > +} > > + > > +static inline bool > > +res_counter_low_wmark_limit_check_locked(struct res_counter *cnt) > > +{ > > + if (cnt->usage < cnt->low_wmark_limit) > > + return true; > > + > > + return false; > > +} > > I like res_counter_under_low_wmark_limit_locked() rather than this name. > Thanks for review. Will change this on the next post. --Ying > > Thanks, > -Kame > >