Re: [PATCH 3/4] memcg: hierarchical reclaim by CSS ID

From: Li Zefan
Date: Thu Jan 15 2009 - 20:50:00 EST


KAMEZAWA Hiroyuki wrote:
> On Fri, 16 Jan 2009 09:29:48 +0800
> Li Zefan <lizf@xxxxxxxxxxxxxx> wrote:
>
>>> /*
>>> - * Dance down the hierarchy if needed to reclaim memory. We remember the
>>> - * last child we reclaimed from, so that we don't end up penalizing
>>> - * one child extensively based on its position in the children list.
>>> + * Visit the first child (need not be the first child as per the ordering
>>> + * of the cgroup list, since we track last_scanned_child) of @mem and use
>>> + * that to reclaim free pages from.
>>> + */
>>> +static struct mem_cgroup *
>>> +mem_cgroup_select_victim(struct mem_cgroup *root_mem)
>>> +{
>>> + struct mem_cgroup *ret = NULL;
>>> + struct cgroup_subsys_state *css;
>>> + int nextid, found;
>>> +
>>> + if (!root_mem->use_hierarchy) {
>>> + spin_lock(&root_mem->reclaim_param_lock);
>>> + root_mem->scan_age++;
>>> + spin_unlock(&root_mem->reclaim_param_lock);
>>> + css_get(&root_mem->css);
>>> + ret = root_mem;
>>> + }
>>> +
>>> + while (!ret) {
>>> + rcu_read_lock();
>>> + nextid = root_mem->last_scanned_child + 1;
>>> + css = css_get_next(&mem_cgroup_subsys, nextid, &root_mem->css,
>>> + &found);
>>> + if (css && css_is_populated(css) && css_tryget(css))
>> I don't see why you need to check css_is_populated(css) ?
>>
>
> Main reason is for sanity. I don't like to hold css->refcnt of not populated css.

I think this is a rare case. It's just a very short period when a cgroup is
being created but not yet fully created.

> Second reason is for avoinding unnecessary calls to try_to_free_pages(),
> it's heavy. I should also add mem->res.usage == 0 case for skipping but not yet.
>

And if mem->res.usage == 0 is checked, css_is_popuated() is just redundant.

> THanks,
> -Kame
>
>>> + ret = container_of(css, struct mem_cgroup, css);
>>> +
>>> + rcu_read_unlock();
>>> + /* Updates scanning parameter */
>>> + spin_lock(&root_mem->reclaim_param_lock);
>>> + if (!css) {
>>> + /* this means start scan from ID:1 */
>>> + root_mem->last_scanned_child = 0;
>>> + root_mem->scan_age++;
>>> + } else
>>> + root_mem->last_scanned_child = found;
>>> + spin_unlock(&root_mem->reclaim_param_lock);
>>> + }
>>> +
>>> + return ret;
>>> +}
>>> +
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/