Messages in this thread | | | From | kamezawa.hiroyu@jp ... | Date | Tue, 23 Sep 2008 00:06:10 +0900 (JST) | Subject | Re: Re: Re: [PATCH 4/13] memcg: force_empty moving account |
| |
----- Original Message ----- >On Mon, 2008-09-22 at 23:50 +0900, kamezawa.hiroyu@jp.fujitsu.com wrote: >> ----- Original Message ----- >> >> + spin_lock_irqsave(&mz->lru_lock, flags); >> >> + } else { >> >> + unlock_page(page); >> >> + put_page(page); >> >> + } >> >> + if (atomic_read(&mem->css.cgroup->count) > 0) >> >> + break; >> >> } >> >> spin_unlock_irqrestore(&mz->lru_lock, flags); >> > >> >do _NOT_ use yield() ever! unless you know what you're doing, and >> >probably not even then. >> > >> >NAK! >> Hmm, sorry. cond_resched() is ok ? > >depends on what you want to do, please explain what you're trying to do. > Sorry again.
This force_empty is called only in following situation - there is no user threas in this cgroup. - a user tries to rmdir() this cgroup or explicitly type echo 1 > ../memory.force_empty.
force_empty() scans lru list of this cgroup and check page_cgroup on the list one by one. Because there are no tasks in this group, force_empty can see following racy condtions while scanning.
- global lru tries to remove the page which pointed by page_cgroup and it is not-on-LRU. - the page is locked by someone. ....find some lock contetion with invalidation/truncate. - in later patch, page_cgroup can be on pagevec(i added) and we have to drain it to remove from LRU.
In above situation, force_empty() have to wait for some event proceeds.
Hmm...detecting busy situation in loop and sleep in out-side-of-loop is better ? Anyway, ok, I'll rewrite this.
BTW, sched.c::yield() is for what purpose now ?
Thanks, -Kame
| |