[PATCH -mmotm 1/5] memcg: disable irq at page cgroup lock
kamezawa.hiroyu at jp.fujitsu.com
Wed Apr 14 17:14:44 PDT 2010
On Wed, 14 Apr 2010 10:04:30 -0400
Vivek Goyal <vgoyal at redhat.com> wrote:
> On Wed, Apr 14, 2010 at 06:29:04PM +0900, KAMEZAWA Hiroyuki wrote:
> Hi Kame-san,
> May be I am missing something but how does it solve the issue of making sure
> lock_page_cgroup() is not held in interrupt context? IIUC, above code will
> make sure that for file cache accouting, lock_page_cgroup() is taken only
> if task migration is on. But say task migration is on, and then some IO
> completes and we update WRITEBACK stat (i think this is the one which can
> be called from interrupt context), then we will still take the
> lock_page_cgroup() and again run into the issue of deadlocks?
Yes and No.
At "Set", IIRC, almost all updates against DIRTY and WRITBACK accountings
can be done under mapping->tree_lock, which disables IRQ always.
(ex. I don't mention TestSetPageWriteback but account_page_diritied().)
Then, save/restore irq flags is just a cost and no benefit, in such cases.
Of course, there are cases irqs doesn't enabled.
About FILE_MAPPED, it's not updated under mapping->tree_lock.
So, we'll have race with charge/uncharge. We have to take lock_page_cgroup(), always.
So, I think we'll have 2 or 3 interfaces, finally.
mem_cgroup_update_stat_fast() // the caller must disable IRQ and lock_page()
mem_cgroup_update_stat_locked() // the caller has lock_page().
mem_cgroup_update_stat_safe() // the caller don't have to do anything.
Why update_stat_fast() is for avoiding _unnecessary_ costs.
When we lock a page and disables IRQ, we don't have to do anything.
There are no races.
But yes, it's complicated. I'd like to see what we can do.
More information about the Containers