[PATCH 06/10] cgroups: pull up res counter charge failure interpretation to caller

Frederic Weisbecker fweisbec at gmail.com
Wed Feb 1 03:37:46 UTC 2012


res_counter_charge() always returns -ENOMEM when the limit is reached and
the charge thus can't happen.

However it's up to the caller to interpret this failure and return the
appropriate error value.  The task counter subsystem will need to report
the user that a fork() has been cancelled because of some limit reached,
not because we are too short on memory.

Fix this by returning -1 when res_counter_charge() fails.

Signed-off-by: Frederic Weisbecker <fweisbec at gmail.com>
Cc: Paul Menage <paul at paulmenage.org>
Cc: Li Zefan <lizf at cn.fujitsu.com>
Cc: Johannes Weiner <hannes at cmpxchg.org>
Cc: Aditya Kali <adityakali at google.com>
Cc: Oleg Nesterov <oleg at redhat.com>
Cc: Tim Hockin <thockin at hockin.org>
Cc: Tejun Heo <htejun at gmail.com>
Cc: Containers <containers at lists.linux-foundation.org>
Cc: Glauber Costa <glommer at gmail.com>
Cc: Cgroups <cgroups at vger.kernel.org>
Cc: Daniel J Walsh <dwalsh at redhat.com>
Cc: "Daniel P. Berrange" <berrange at redhat.com>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu at jp.fujitsu.com>
Cc: Max Kellermann <mk at cm4all.com>
Cc: Mandeep Singh Baines <msb at chromium.org>
Acked-by: Kirill A. Shutemov <kirill at shutemov.name>
Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
---
 Documentation/cgroups/resource_counter.txt |    2 ++
 kernel/res_counter.c                       |    2 +-
 2 files changed, 3 insertions(+), 1 deletions(-)

diff --git a/Documentation/cgroups/resource_counter.txt b/Documentation/cgroups/resource_counter.txt
index a2cd05b..24ec61c 100644
--- a/Documentation/cgroups/resource_counter.txt
+++ b/Documentation/cgroups/resource_counter.txt
@@ -76,6 +76,8 @@ to work with it.
 	limit_fail_at parameter is set to the particular res_counter element
 	where the charging failed.
 
+	It returns 0 on success and -1 on failure.
+
  d. int res_counter_charge_locked
 			(struct res_counter *rc, unsigned long val)
 
diff --git a/kernel/res_counter.c b/kernel/res_counter.c
index d2fc4cd..78cc444 100644
--- a/kernel/res_counter.c
+++ b/kernel/res_counter.c
@@ -26,7 +26,7 @@ int res_counter_charge_locked(struct res_counter *counter, unsigned long val)
 {
 	if (counter->usage + val > counter->limit) {
 		counter->failcnt++;
-		return -ENOMEM;
+		return -1;
 	}
 
 	counter->usage += val;
-- 
1.7.5.4



More information about the Containers mailing list