On Wed, 14 Apr 2010 10:04:30 -0400 Vivek Goyal <vgoyal@xxxxxxxxxx> 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() and mem_cgroup_update_stat_locked() // the caller has lock_page(). and 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. Thanks, -Kame -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxxx For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>