From: Balbir Singh <balbir@linux.vnet.ibm.com>
To: linux-mm@kvack.org
Cc: Hugh Dickins <hugh@veritas.com>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
YAMAMOTO Takashi <yamamoto@valinux.co.jp>,
Paul Menage <menage@google.com>,
Lee Schermerhorn <Lee.Schermerhorn@hp.com>,
Nick Piggin <nickpiggin@yahoo.com.au>,
"Eric W. Biederman" <ebiederm@xmission.com>,
David Rientjes <rientjes@google.com>,
Andrew Morton <akpm@linux-foundation.org>,
Pavel Emelianov <xemul@openvz.org>,
Balbir Singh <balbir@linux.vnet.ibm.com>,
Rik Van Riel <riel@redhat.com>,
Herbert Poetzl <herbert@13thfloor.at>,
KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Subject: [RFC] [PATCH 1/4] Modify resource counters to add soft limit support
Date: Wed, 13 Feb 2008 20:42:14 +0530 [thread overview]
Message-ID: <20080213151214.7529.3954.sendpatchset@localhost.localdomain> (raw)
In-Reply-To: <20080213151201.7529.53642.sendpatchset@localhost.localdomain>
The resource counter member limit is split into soft and hard limits.
The same locking rule apply for both limits.
Signed-off-by: Balbir Singh <balbir@linux.vnet.ibm.com>
---
include/linux/res_counter.h | 34 ++++++++++++++++++++++++++--------
kernel/res_counter.c | 11 +++++++----
mm/memcontrol.c | 10 +++++-----
3 files changed, 38 insertions(+), 17 deletions(-)
diff -puN mm/vmscan.c~memory-controller-res_counters-soft-limit-setup mm/vmscan.c
diff -puN mm/memcontrol.c~memory-controller-res_counters-soft-limit-setup mm/memcontrol.c
--- linux-2.6.24/mm/memcontrol.c~memory-controller-res_counters-soft-limit-setup 2008-02-13 19:50:24.000000000 +0530
+++ linux-2.6.24-balbir/mm/memcontrol.c 2008-02-13 19:50:24.000000000 +0530
@@ -568,7 +568,7 @@ unsigned long mem_cgroup_isolate_pages(u
* Charge the memory controller for page usage.
* Return
* 0 if the charge was successful
- * < 0 if the cgroup is over its limit
+ * < 0 if the cgroup is over its hard limit
*/
static int mem_cgroup_charge_common(struct page *page, struct mm_struct *mm,
gfp_t gfp_mask, enum charge_type ctype)
@@ -632,7 +632,7 @@ retry:
/*
* If we created the page_cgroup, we should free it on exceeding
- * the cgroup limit.
+ * the cgroup hard limit.
*/
while (res_counter_charge(&mem->res, PAGE_SIZE)) {
if (!(gfp_mask & __GFP_WAIT))
@@ -645,10 +645,10 @@ retry:
* try_to_free_mem_cgroup_pages() might not give us a full
* picture of reclaim. Some pages are reclaimed and might be
* moved to swap cache or just unmapped from the cgroup.
- * Check the limit again to see if the reclaim reduced the
+ * Check the hard limit again to see if the reclaim reduced the
* current usage of the cgroup before giving up
*/
- if (res_counter_check_under_limit(&mem->res))
+ if (res_counter_check_under_limit(&mem->res, RES_HARD_LIMIT))
continue;
if (!nr_retries--) {
@@ -1028,7 +1028,7 @@ static struct cftype mem_cgroup_files[]
},
{
.name = "limit_in_bytes",
- .private = RES_LIMIT,
+ .private = RES_HARD_LIMIT,
.write = mem_cgroup_write,
.read = mem_cgroup_read,
},
diff -puN kernel/res_counter.c~memory-controller-res_counters-soft-limit-setup kernel/res_counter.c
--- linux-2.6.24/kernel/res_counter.c~memory-controller-res_counters-soft-limit-setup 2008-02-13 19:50:24.000000000 +0530
+++ linux-2.6.24-balbir/kernel/res_counter.c 2008-02-13 19:50:24.000000000 +0530
@@ -16,12 +16,13 @@
void res_counter_init(struct res_counter *counter)
{
spin_lock_init(&counter->lock);
- counter->limit = (unsigned long long)LLONG_MAX;
+ counter->soft_limit = (unsigned long long)LLONG_MAX;
+ counter->hard_limit = (unsigned long long)LLONG_MAX;
}
int res_counter_charge_locked(struct res_counter *counter, unsigned long val)
{
- if (counter->usage + val > counter->limit) {
+ if (counter->usage + val > counter->hard_limit) {
counter->failcnt++;
return -ENOMEM;
}
@@ -65,8 +66,10 @@ res_counter_member(struct res_counter *c
switch (member) {
case RES_USAGE:
return &counter->usage;
- case RES_LIMIT:
- return &counter->limit;
+ case RES_SOFT_LIMIT:
+ return &counter->soft_limit;
+ case RES_HARD_LIMIT:
+ return &counter->hard_limit;
case RES_FAILCNT:
return &counter->failcnt;
};
diff -puN include/linux/res_counter.h~memory-controller-res_counters-soft-limit-setup include/linux/res_counter.h
--- linux-2.6.24/include/linux/res_counter.h~memory-controller-res_counters-soft-limit-setup 2008-02-13 19:50:24.000000000 +0530
+++ linux-2.6.24-balbir/include/linux/res_counter.h 2008-02-13 19:50:24.000000000 +0530
@@ -27,7 +27,13 @@ struct res_counter {
/*
* the limit that usage cannot exceed
*/
- unsigned long long limit;
+ unsigned long long hard_limit;
+ /*
+ * the limit that usage can exceed, but under memory
+ * pressure, we will reclaim back memory above the
+ * soft limit mark
+ */
+ unsigned long long soft_limit;
/*
* the number of unsuccessful attempts to consume the resource
*/
@@ -64,7 +70,8 @@ ssize_t res_counter_write(struct res_cou
enum {
RES_USAGE,
- RES_LIMIT,
+ RES_SOFT_LIMIT,
+ RES_HARD_LIMIT,
RES_FAILCNT,
};
@@ -101,11 +108,21 @@ int res_counter_charge(struct res_counte
void res_counter_uncharge_locked(struct res_counter *counter, unsigned long val);
void res_counter_uncharge(struct res_counter *counter, unsigned long val);
-static inline bool res_counter_limit_check_locked(struct res_counter *cnt)
+static inline bool res_counter_limit_check_locked(struct res_counter *cnt,
+ int member)
{
- if (cnt->usage < cnt->limit)
- return true;
-
+ switch (member) {
+ case RES_HARD_LIMIT:
+ if (cnt->usage < cnt->hard_limit)
+ return true;
+ break;
+ case RES_SOFT_LIMIT:
+ if (cnt->usage < cnt->soft_limit)
+ return true;
+ break;
+ default:
+ BUG_ON(1);
+ }
return false;
}
@@ -113,13 +130,14 @@ static inline bool res_counter_limit_che
* Helper function to detect if the cgroup is within it's limit or
* not. It's currently called from cgroup_rss_prepare()
*/
-static inline bool res_counter_check_under_limit(struct res_counter *cnt)
+static inline bool res_counter_check_under_limit(struct res_counter *cnt,
+ int member)
{
bool ret;
unsigned long flags;
spin_lock_irqsave(&cnt->lock, flags);
- ret = res_counter_limit_check_locked(cnt);
+ ret = res_counter_limit_check_locked(cnt, member);
spin_unlock_irqrestore(&cnt->lock, flags);
return ret;
}
diff -puN include/linux/memcontrol.h~memory-controller-res_counters-soft-limit-setup include/linux/memcontrol.h
_
--
Warm Regards,
Balbir Singh
Linux Technology Center
IBM, ISTL
--
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>
next prev parent reply other threads:[~2008-02-13 15:15 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-02-13 15:12 [RFC] [PATCH 0/4] Add soft limits to the memory controller Balbir Singh
2008-02-13 15:12 ` Balbir Singh [this message]
2008-02-13 17:12 ` [RFC] [PATCH 1/4] Modify resource counters to add soft limit support Pavel Emelyanov
2008-02-13 17:19 ` Balbir Singh
2008-02-13 17:38 ` Pavel Emelyanov
2008-02-13 17:54 ` Balbir Singh
2008-02-13 15:12 ` [RFC] [PATCH 2/4] Add the soft limit interface Balbir Singh
2008-02-13 15:12 ` [RFC] [PATCH 3/4] Reclaim from groups over their soft limit under memory pressure Balbir Singh
2008-02-14 7:30 ` KAMEZAWA Hiroyuki
2008-02-14 7:40 ` Balbir Singh
2008-02-14 8:42 ` KAMEZAWA Hiroyuki
2008-02-14 9:16 ` Balbir Singh
2008-02-15 4:17 ` Paul Menage
2008-02-15 4:25 ` Balbir Singh
2008-02-15 5:07 ` KAMEZAWA Hiroyuki
2008-02-15 5:16 ` Paul Menage
2008-02-15 5:18 ` Balbir Singh
2008-02-15 5:30 ` Paul Menage
2008-02-15 5:33 ` KAMEZAWA Hiroyuki
2008-02-15 5:29 ` KAMEZAWA Hiroyuki
2008-02-15 6:36 ` Balbir Singh
2008-02-14 10:27 ` YAMAMOTO Takashi
2008-02-15 3:19 ` Balbir Singh
2008-02-13 15:12 ` [RFC] [PATCH 4/4] Add soft limit documentation Balbir Singh
2008-02-13 15:59 ` Randy Dunlap
2008-02-13 16:08 ` Balbir Singh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080213151214.7529.3954.sendpatchset@localhost.localdomain \
--to=balbir@linux.vnet.ibm.com \
--cc=Lee.Schermerhorn@hp.com \
--cc=a.p.zijlstra@chello.nl \
--cc=akpm@linux-foundation.org \
--cc=ebiederm@xmission.com \
--cc=herbert@13thfloor.at \
--cc=hugh@veritas.com \
--cc=kamezawa.hiroyu@jp.fujitsu.com \
--cc=linux-mm@kvack.org \
--cc=menage@google.com \
--cc=nickpiggin@yahoo.com.au \
--cc=riel@redhat.com \
--cc=rientjes@google.com \
--cc=xemul@openvz.org \
--cc=yamamoto@valinux.co.jp \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).