On Thu, Jan 10, 2013 at 1:03 PM, Kamezawa Hiroyuki <kamezawa.hiroyu@xxxxxxxxxxxxxx> wrote: > (2013/01/10 13:26), Sha Zhengju wrote: > >> But this method also has its pros and cons(e.g. need lock nesting). So >> I doubt whether the following is able to deal with these issues all >> together: >> (CPU-A does "page stat accounting" and CPU-B does "move") >> >> CPU-A CPU-B >> >> move_lock_mem_cgroup() >> memcg = pc->mem_cgroup >> SetPageDirty(page) >> move_unlock_mem_cgroup() >> move_lock_mem_cgroup() >> if (PageDirty) { >> old_memcg->nr_dirty --; >> new_memcg->nr_dirty ++; >> } >> pc->mem_cgroup = new_memcg >> move_unlock_mem_cgroup() >> >> memcg->nr_dirty ++ >> >> >> For CPU-A, we save pc->mem_cgroup in a temporary variable just before >> SetPageDirty inside move_lock and then update stats if the page is set >> PG_dirty successfully. But CPU-B may do "moving" in advance that >> "old_memcg->nr_dirty --" will make old_memcg->nr_dirty incorrect but >> soon CPU-A will do "memcg->nr_dirty ++" at the heels that amend the >> stats. >> However, there is a potential problem that old_memcg->nr_dirty may be >> minus in a very short period but not a big issue IMHO. >> > > IMHO, this will work. Please take care of that the recorded memcg will not > be invalid pointer when you update the nr_dirty later. > (Maybe RCU will protect it.) > Yes, there're 3 places to change pc->mem_cgroup: charge & uncharge & move_account. "charge" has no race with stat updater and "uncharge" doesn't reset pc->mem_cgroup directly, also "move_account" is just the one we are handling, so they may do no harm here. Meanwhile, invalid pointer made by cgroup deletion may also be avoided by RCU. Yet it's a rough conclusion by quick look... > _If_ this method can handle "nesting" problem clearer and make > implementation > simpler, please go ahead. To be honest, I'm not sure how the code will be > until Okay, later I'll try to propose the patch. > seeing the patch. Hmm, why you write SetPageDirty() here rather than > TestSetPageDirty().... > No particular reason...TestSetPageDirty() may be more precise... : ) -- Thanks, Sha -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html