All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kirill Tkhai <ktkhai@virtuozzo.com>
To: Vladimir Davydov <vdavydov.dev@gmail.com>
Cc: akpm@linux-foundation.org, shakeelb@google.com,
	viro@zeniv.linux.org.uk, hannes@cmpxchg.org, mhocko@kernel.org,
	tglx@linutronix.de, pombredanne@nexb.com,
	stummala@codeaurora.org, gregkh@linuxfoundation.org,
	sfr@canb.auug.org.au, guro@fb.com, mka@chromium.org,
	penguin-kernel@I-love.SAKURA.ne.jp, chris@chris-wilson.co.uk,
	longman@redhat.com, minchan@kernel.org, hillf.zj@alibaba-inc.com,
	ying.huang@intel.com, mgorman@techsingularity.net, jbacik@fb.com,
	linux@roeck-us.net, linux-kernel@vger.kernel.org,
	linux-mm@kvack.org, willy@infradead.org, lirongqing@baidu.com,
	aryabinin@virtuozzo.com
Subject: Re: [PATCH v2 04/12] mm: Assign memcg-aware shrinkers bitmap to memcg
Date: Thu, 3 May 2018 14:15:59 +0300	[thread overview]
Message-ID: <96bd3025-2b8d-9ed6-c60f-3793102932a9@virtuozzo.com> (raw)
In-Reply-To: <20180428150827.b2bh7hhma7pp4av5@esperanza>

On 28.04.2018 18:08, Vladimir Davydov wrote:
> On Tue, Apr 24, 2018 at 03:24:53PM +0300, Kirill Tkhai wrote:
>>>>>>>> +int expand_shrinker_maps(int old_nr, int nr)
>>>>>>>> +{
>>>>>>>> +	int id, size, old_size, node, ret;
>>>>>>>> +	struct mem_cgroup *memcg;
>>>>>>>> +
>>>>>>>> +	old_size = old_nr / BITS_PER_BYTE;
>>>>>>>> +	size = nr / BITS_PER_BYTE;
>>>>>>>> +
>>>>>>>> +	down_write(&shrinkers_max_nr_rwsem);
>>>>>>>> +	for_each_node(node) {
>>>>>>>
>>>>>>> Iterating over cgroups first, numa nodes second seems like a better idea
>>>>>>> to me. I think you should fold for_each_node in memcg_expand_maps.
>>>>>>>
>>>>>>>> +		idr_for_each_entry(&mem_cgroup_idr, memcg, id) {
>>>>>>>
>>>>>>> Iterating over mem_cgroup_idr looks strange. Why don't you use
>>>>>>> for_each_mem_cgroup?
>>>>>>
>>>>>> We want to allocate shrinkers maps in mem_cgroup_css_alloc(), since
>>>>>> mem_cgroup_css_online() mustn't fail (it's a requirement of currently
>>>>>> existing design of memcg_cgroup::id).
>>>>>>
>>>>>> A new memcg is added to parent's list between two of these calls:
>>>>>>
>>>>>> css_create()
>>>>>>   ss->css_alloc()
>>>>>>   list_add_tail_rcu(&css->sibling, &parent_css->children)
>>>>>>   ss->css_online()
>>>>>>
>>>>>> for_each_mem_cgroup() does not see allocated, but not linked children.
>>>>>
>>>>> Why don't we move shrinker map allocation to css_online then?
>>>>
>>>> Because the design of memcg_cgroup::id prohibits mem_cgroup_css_online() to fail.
>>>> This function can't fail.
>>>
>>> I fail to understand why it is so. Could you please elaborate?
>>
>> mem_cgroup::id is freed not in mem_cgroup_css_free(), but earlier. It's freed
>> between mem_cgroup_css_offline() and mem_cgroup_free(), after the last reference
>> is put.
>>
>> In case of sometimes we want to free it in mem_cgroup_css_free(), this will
>> introduce assymmetric in the logic, which makes it more difficult. There is
>> already a bug, which I fixed in
>>
>> "memcg: remove memcg_cgroup::id from IDR on mem_cgroup_css_alloc() failure"
>>
>> new change will make this code completely not-modular and unreadable.
> 
> How is that? AFAIU all we need to do to handle css_online failure
> properly is call mem_cgroup_id_remove() from mem_cgroup_css_free().
> That's it, as mem_cgroup_id_remove() is already safe to call more
> than once for the same cgroup - the first call will free the id
> while all subsequent calls will do nothing.

I seemed confusing a reader for me, but now I'll agree with you, since
it's OK for you as for a reader.
 
>>  
>>>>
>>>> I don't think it will be good to dive into reworking of this stuff for this patchset,
>>>> which is really already big. Also, it will be assymmetric to allocate one part of
>>>> data in css_alloc(), while another data in css_free(). This breaks cgroup design,
>>>> which specially introduces this two function to differ allocation and onlining.
>>>> Also, I've just move the allocation to alloc_mem_cgroup_per_node_info() like it was
>>>> suggested in comments to v1...
>>>
>>> Yeah, but (ab)using mem_cgroup_idr for iterating over all allocated
>>> memory cgroups looks rather dubious to me...
>>
>> But we have to iterate over all allocated memory cgroups in any way,
>> as all of them must have expanded maps. What is the problem?
>> It's rather simple method, and it faster then for_each_mem_cgroup()
>> cycle, since it does not have to play with get and put of refcounters.
> 
> I don't like this, because mem_cgroup_idr was initially introduced to
> avoid depletion of css ids by offline cgroups. We could fix that problem
> by extending swap_cgroup to UINT_MAX, in which case mem_cgroup_idr
> wouldn't be needed at all. Reusing mem_cgroup_idr for iterating over
> allocated cgroups deprives us of the ability to reconsider that design
> decision in future, neither does it look natural IMO. Besides, in order
> to use mem_cgroup_idr for your purpose, you have to reshuffle the code
> of mem_cgroup_css_alloc in a rather contrived way IMO.
> 
> I agree that allocating parts of struct mem_cgroup in css_online may
> look dubious, but IMHO it's better than inventing a new way to iterate
> over cgroups instead of using the iterator provided by cgroup core.
> May be, you should ask Tejun which way he thinks is better.
> 
> Thanks,
> Vladimir
> 

  reply	other threads:[~2018-05-03 11:15 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-17 18:52 [PATCH v2 00/12] Improve shrink_slab() scalability (old complexity was O(n^2), new is O(n)) Kirill Tkhai
2018-04-17 18:53 ` [PATCH v2 01/12] mm: Assign id to every memcg-aware shrinker Kirill Tkhai
2018-04-18 14:14   ` Tetsuo Handa
2018-04-18 14:27     ` Kirill Tkhai
2018-04-18 14:32       ` Tetsuo Handa
2018-04-18 14:32         ` Tetsuo Handa
2018-04-18 15:02         ` Kirill Tkhai
2018-04-22 17:16   ` Vladimir Davydov
2018-04-17 18:53 ` [PATCH v2 02/12] memcg: Refactoring in mem_cgroup_alloc() Kirill Tkhai
2018-04-17 18:53 ` [PATCH v2 03/12] memcg: Refactoring in alloc_mem_cgroup_per_node_info() Kirill Tkhai
2018-04-17 18:53 ` [PATCH v2 04/12] mm: Assign memcg-aware shrinkers bitmap to memcg Kirill Tkhai
2018-04-18 12:55   ` kbuild test robot
2018-04-18 12:55     ` kbuild test robot
2018-04-18 13:05     ` Kirill Tkhai
2018-04-22 17:59   ` Vladimir Davydov
2018-04-23 10:54     ` Kirill Tkhai
2018-04-24 11:28       ` Vladimir Davydov
2018-04-24 11:38         ` Kirill Tkhai
2018-04-24 12:15           ` Vladimir Davydov
2018-04-24 12:24             ` Kirill Tkhai
2018-04-28 15:08               ` Vladimir Davydov
2018-05-03 11:15                 ` Kirill Tkhai [this message]
2018-04-24 12:13         ` Kirill Tkhai
2018-04-23 11:02     ` Kirill Tkhai
2018-04-23 11:06     ` Kirill Tkhai
2018-04-24 11:08       ` Vladimir Davydov
2018-04-17 18:53 ` [PATCH v2 05/12] fs: Propagate shrinker::id to list_lru Kirill Tkhai
2018-04-22 18:03   ` Vladimir Davydov
2018-04-17 18:53 ` [PATCH v2 06/12] list_lru: Add memcg argument to list_lru_from_kmem() Kirill Tkhai
2018-04-17 18:54 ` [PATCH v2 07/12] list_lru: Pass dst_memcg argument to memcg_drain_list_lru_node() Kirill Tkhai
2018-04-17 18:54 ` [PATCH v2 08/12] list_lru: Pass lru " Kirill Tkhai
2018-04-17 18:54 ` [PATCH v2 09/12] mm: Set bit in memcg shrinker bitmap on first list_lru item apearance Kirill Tkhai
2018-04-17 18:54 ` [PATCH v2 10/12] mm: Iterate only over charged shrinkers during memcg shrink_slab() Kirill Tkhai
2018-04-22 18:19   ` Vladimir Davydov
2018-04-17 18:54 ` [PATCH v2 11/12] mm: Add SHRINK_EMPTY shrinker methods return value Kirill Tkhai
2018-04-17 18:54 ` [PATCH v2 12/12] mm: Clear shrinker bit if there are no objects related to memcg Kirill Tkhai
2018-04-22 18:21   ` Vladimir Davydov
2018-04-23 10:01     ` Kirill Tkhai
2018-04-24 10:56       ` Vladimir Davydov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=96bd3025-2b8d-9ed6-c60f-3793102932a9@virtuozzo.com \
    --to=ktkhai@virtuozzo.com \
    --cc=akpm@linux-foundation.org \
    --cc=aryabinin@virtuozzo.com \
    --cc=chris@chris-wilson.co.uk \
    --cc=gregkh@linuxfoundation.org \
    --cc=guro@fb.com \
    --cc=hannes@cmpxchg.org \
    --cc=hillf.zj@alibaba-inc.com \
    --cc=jbacik@fb.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux@roeck-us.net \
    --cc=lirongqing@baidu.com \
    --cc=longman@redhat.com \
    --cc=mgorman@techsingularity.net \
    --cc=mhocko@kernel.org \
    --cc=minchan@kernel.org \
    --cc=mka@chromium.org \
    --cc=penguin-kernel@I-love.SAKURA.ne.jp \
    --cc=pombredanne@nexb.com \
    --cc=sfr@canb.auug.org.au \
    --cc=shakeelb@google.com \
    --cc=stummala@codeaurora.org \
    --cc=tglx@linutronix.de \
    --cc=vdavydov.dev@gmail.com \
    --cc=viro@zeniv.linux.org.uk \
    --cc=willy@infradead.org \
    --cc=ying.huang@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.