Daisuke Nishimura <nishimura@xxxxxxxxxxxxxxxxx> writes: >> +static unsigned long long >> +memcg_hierarchical_free_pages(struct mem_cgroup *mem) >> +{ >> + struct cgroup *cgroup; >> + unsigned long long min_free, free; >> + >> + min_free = res_counter_read_u64(&mem->res, RES_LIMIT) - >> + res_counter_read_u64(&mem->res, RES_USAGE); >> + cgroup = mem->css.cgroup; >> + if (!mem->use_hierarchy) >> + goto out; >> + >> + while (cgroup->parent) { >> + cgroup = cgroup->parent; >> + mem = mem_cgroup_from_cont(cgroup); >> + if (!mem->use_hierarchy) >> + break; >> + free = res_counter_read_u64(&mem->res, RES_LIMIT) - >> + res_counter_read_u64(&mem->res, RES_USAGE); >> + min_free = min(min_free, free); >> + } >> +out: >> + /* Translate free memory in pages */ >> + return min_free >> PAGE_SHIFT; >> +} >> + > I think you can simplify this function using parent_mem_cgroup(). > > unsigned long free, min_free = ULLONG_MAX; > > while (mem) { > free = res_counter_read_u64(&mem->res, RES_LIMIT) - > res_counter_read_u64(&mem->res, RES_USAGE); > min_free = min(min_free, free); > mem = parent_mem_cgroup(); > } > > /* Translate free memory in pages */ > return min_free >> PAGE_SHIFT; > > And, IMHO, we should return min(global_page_state(NR_FREE_PAGES), min_free >> PAGE_SHIFT). > Because we are allowed to set no-limit(or a very big limit) in memcg, > so min_free can be very big if we don't set a limit against all the memcg's in hierarchy. > > > Thanks, > Dasiuke Nishimura. Thank you. This is a good suggestion. I will update the page to include this. -- Greg -- 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>