Messages in this thread Patch in this message | | | Date | Fri, 21 Nov 2008 10:40:07 +0800 | From | Li Zefan <> | Subject | Re: [PATCH 7/9] memcg : mem+swap controlelr core |
| |
> @@ -513,12 +531,25 @@ static int __mem_cgroup_try_charge(struc > css_get(&mem->css); > } > > + while (1) {
This loop will never break out if memory.limit_in_bytes is too low.
Actually, when I set the limit to 0 and moved a task into the cgroup and let the task allocate a page, then the whole system froze, and I had to reset my machine.
And small memory.limit will make the process stuck: # mkdir /memcg/0 # echo 40K > /memcg/0/memory.limit_in_bytes # echo $$ > tasks # ls (stuck)
(another console) # echo 100K > /memcg/0/memory.limit_in_bytes (then the above 'ls' can continue)
> + int ret; > + bool noswap = false; > > - while (unlikely(res_counter_charge(&mem->res, PAGE_SIZE))) { > + ret = res_counter_charge(&mem->res, PAGE_SIZE); > + if (likely(!ret)) { > + if (!do_swap_account) > + break; > + ret = res_counter_charge(&mem->memsw, PAGE_SIZE); > + if (likely(!ret)) > + break; > + /* mem+swap counter fails */ > + res_counter_uncharge(&mem->res, PAGE_SIZE); > + noswap = true; > + } > if (!(gfp_mask & __GFP_WAIT)) > goto nomem; > > - if (try_to_free_mem_cgroup_pages(mem, gfp_mask)) > + if (try_to_free_mem_cgroup_pages(mem, gfp_mask, noswap)) > continue; > > /* > @@ -527,8 +558,13 @@ static int __mem_cgroup_try_charge(struc > * moved to swap cache or just unmapped from the cgroup. > * Check the limit again to see if the reclaim reduced the > * current usage of the cgroup before giving up > + * > */ > - if (res_counter_check_under_limit(&mem->res)) > + if (!do_swap_account && > + res_counter_check_under_limit(&mem->res)) > + continue; > + if (do_swap_account && > + res_counter_check_under_limit(&mem->memsw)) > continue; > > if (!nr_retries--) {
| |