From: "Paul Menage" <menage@google.com>
To: balbir@linux.vnet.ibm.com
Cc: linux-mm@kvack.org, Sudhir Kumar <skumar@linux.vnet.ibm.com>,
YAMAMOTO Takashi <yamamoto@valinux.co.jp>,
lizf@cn.fujitsu.com, linux-kernel@vger.kernel.org,
David Rientjes <rientjes@google.com>,
Pavel Emelianov <xemul@openvz.org>,
Andrew Morton <akpm@linux-foundation.org>,
KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Subject: Re: [-mm][PATCH 3/4] Add rlimit controller accounting and control
Date: Thu, 8 May 2008 14:45:13 -0700 [thread overview]
Message-ID: <6599ad830805081445w5991b47cld2861aab26ac6323@mail.gmail.com> (raw)
In-Reply-To: <48230FBB.20105@linux.vnet.ibm.com>
On Thu, May 8, 2008 at 7:35 AM, Balbir Singh <balbir@linux.vnet.ibm.com> wrote:
>
> I currently intend to use this controller for controlling memory related
> rlimits, like address space and mlock'ed memory. How about we use something like
> "memrlimit"?
Sounds reasonable.
>
> Good suggestion, but it will be hard if not impossible to account the data
> correctly as it changes, if we do the accounting/summation at bind time. We'll
> need a really big lock to do it, something I want to avoid. Did you have
> something else in mind?
Yes, it'll be tricky but I think worthwhile. I believe it can be done
without the charge/uncharge code needing to take a global lock, except
for when we're actually binding/unbinding, with careful use of RCU.
My first thought for how to do this was that we have a field
"bind_transition" that indicates whether we're transitioning between
bound and unbound, and a bind_mutex. By default the charge/unpath uses
RCU, but by marking that we're in a transition state, the charge path
will use the mutex instead. By waiting for all existing chargers that
are using RCU to exit, we can then take the lock and synchronize with
the chargers.
So the charge/uncharge path would do:
rcu_read_lock();
if (ss->tranistioning) {
rcu_read_unlock();
locked = 1;
mutex_lock(&ss->bind_mutex);
}
if (ss->active) {
/* do charge/uncharge stuff, which must not block */
}
if (locked) {
mutex_unlock(&ss->bind_mutex);
} else {
rcu_read_unlock();
}
and the bind path would do something like:
ss->transitioning = 1;
synchronize_rcu();
mutex_lock(&ss->bind_mutex);
for_each_mm(mm) {
down_read(&mm->mmap_sem);
add_charge_for_mm();
up_read(&mm->mmap_sem);
}
mutex_unlock(&ss->bind_mutex);
ss->transitioning = 0;
But this would break because we're nesting mmap_sem inside bind_mutex
in the bind path, but in the charge path we're nesting bind_mutex
inside mmap_sem. So we'd probably need to define a new bit
MMF_RLIMIT_ACCOUNTED in mm->flags to indicate whether that mm's
address space usage is accounted for. Once we've done that, we can use
mmap_sem to synchronize changes to the per-mm charged status for free,
since we already hold mmap_sem whenever we're doing the charging,
right? So it becomes simple:
charge path:
if (!test_bit(MMF_RLIMIT_ACCOUNTED, &mm->flags))
return 0;
/* do charge/uncharge stuff */
bind path:
while((mm = find_unaccounted_mm()) {
down_write(&mm->mmap_sem);
add_charge_for_mm();
set_bit(MMF_RLIMIT_ACCOUNTED, &mm->flags);
up_write(&mm->mmap_sem);
}
Paul
--
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-05-08 21:45 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-05-03 21:37 [-mm][PATCH 0/4] Add rlimit controller to cgroups (v3) Balbir Singh
2008-05-03 21:37 ` [-mm][PATCH 1/4] Setup the rlimit controller Balbir Singh
2008-05-05 22:11 ` Andrew Morton
2008-05-06 3:40 ` Balbir Singh
2008-05-06 1:31 ` Li Zefan
2008-05-06 8:15 ` Balbir Singh
2008-05-03 21:38 ` [-mm][PATCH 2/4] Enhance cgroup mm_owner_changed callback to add task information Balbir Singh
2008-05-05 22:15 ` Andrew Morton
2008-05-06 3:43 ` Balbir Singh
2008-05-05 23:00 ` Paul Menage
2008-05-03 21:38 ` [-mm][PATCH 3/4] Add rlimit controller accounting and control Balbir Singh
2008-05-05 22:24 ` Andrew Morton
2008-05-05 22:32 ` David Rientjes
2008-05-06 5:34 ` Balbir Singh
2008-05-07 3:17 ` Paul Menage
2008-05-07 5:59 ` Pavel Emelyanov
2008-05-08 14:54 ` Balbir Singh
2008-05-08 23:22 ` Paul Menage
2008-05-07 3:29 ` Paul Menage
2008-05-08 14:35 ` Balbir Singh
2008-05-08 21:45 ` Paul Menage [this message]
2008-05-09 13:35 ` Balbir Singh
2008-05-03 21:38 ` [-mm][PATCH 4/4] Add rlimit controller documentation Balbir Singh
2008-05-05 22:35 ` Andrew Morton
2008-05-06 5:39 ` Balbir Singh
2008-05-06 5:54 ` Andrew Morton
2008-05-06 7:59 ` Balbir Singh
2008-05-04 15:24 ` [-mm][PATCH 0/4] Add rlimit controller to cgroups (v3) kamezawa.hiroyu
2008-05-05 4:21 ` Balbir Singh
2008-05-07 1:09 ` KAMEZAWA Hiroyuki
2008-05-04 15:27 ` kamezawa.hiroyu
2008-05-05 4:24 ` 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=6599ad830805081445w5991b47cld2861aab26ac6323@mail.gmail.com \
--to=menage@google.com \
--cc=akpm@linux-foundation.org \
--cc=balbir@linux.vnet.ibm.com \
--cc=kamezawa.hiroyu@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=lizf@cn.fujitsu.com \
--cc=rientjes@google.com \
--cc=skumar@linux.vnet.ibm.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).