From: Kirill Tkhai <ktkhai@virtuozzo.com>
To: Matthew Wilcox <willy@infradead.org>
Cc: viro@zeniv.linux.org.uk, hannes@cmpxchg.org, mhocko@kernel.org,
vdavydov.dev@gmail.com, akpm@linux-foundation.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,
shakeelb@google.com, jbacik@fb.com, linux@roeck-us.net,
linux-kernel@vger.kernel.org, linux-mm@kvack.org
Subject: Re: [PATCH 03/10] mm: Assign memcg-aware shrinkers bitmap to memcg
Date: Wed, 21 Mar 2018 18:43:01 +0300 [thread overview]
Message-ID: <638887a1-35f8-a71d-6e45-4e779eb62dc4@virtuozzo.com> (raw)
In-Reply-To: <20180321152647.GB4780@bombadil.infradead.org>
On 21.03.2018 18:26, Matthew Wilcox wrote:
> On Wed, Mar 21, 2018 at 06:12:17PM +0300, Kirill Tkhai wrote:
>> On 21.03.2018 17:56, Matthew Wilcox wrote:
>>> Why use your own bitmap here? Why not use an IDA which can grow and
>>> shrink automatically without you needing to play fun games with RCU?
>>
>> Bitmap allows to use unlocked set_bit()/clear_bit() to maintain the map
>> of not empty shrinkers.
>>
>> So, the reason to use IDR here is to save bitmap memory? Does this mean
>> IDA works fast with sparse identifiers? It seems they require per-memcg
>> lock to call IDR primitives. I just don't have information about this.
>>
>> If so, which IDA primitive can be used to set particular id in bitmap?
>> There is idr_alloc_cyclic(idr, NULL, id, id+1, GFP_KERNEL) only I see
>> to do that.
>
> You're confusing IDR and IDA in your email, which is unfortunate.
>
> You can set a bit in an IDA by calling ida_simple_get(ida, n, n, GFP_FOO);
> You clear it by calling ida_simple_remove(ida, n);
I moved to IDR in the message, since IDA uses global spinlock. It will be
taken every time a first object is added to list_lru, or last is removed.
These may be frequently called operations, and they may scale not good
on big machines.
Using IDR will allow us to introduce memcg-related locks, but I'm still not
sure it's easy to introduce them in scalable-way. Simple set_bit()/clear_bit()
do not require locks at all.
> The identifiers aren't going to be all that sparse; after all you're
> allocating them from a global IDA. Up to 62 identifiers will allocate
> no memory; 63-1024 identifiers will allocate a single 128 byte chunk.
> Between 1025 and 65536 identifiers, you'll allocate a 576-byte chunk
> and then 128-byte chunks for each block of 1024 identifiers (*). One of
> the big wins with the IDA is that it will shrink again after being used.
> I didn't read all the way through your patchset to see if you bother to
> shrink your bitmap after it's no longer used, but most resizing bitmaps
> we have in the kernel don't bother with that part.
>
> (*) Actually it's more complex than that... between 1025 and 1086,
> you'll have a 576 byte chunk, a 128-byte chunk and then use 62 bits of
> the next pointer before allocating a 128 byte chunk when reaching ID
> 1087. Similar things happen for the 62 bits after 2048, 3076 and so on.
> The individual chunks aren't shrunk until they're empty so if you set ID
> 1025 and then ID 1100, then clear ID 1100, the 128-byte chunk will remain
> allocated until ID 1025 is cleared. This probably doesn't matter to you.
Sound great, thanks for explaining this. The big problem I see is
that IDA/IDR add primitives allocate memory, while they will be used
in the places, where they mustn't fail. There is list_lru_add(), and
it's called unconditionally in current kernel code. The patchset makes
the bitmap be populated in this function. So, we can't use IDR there.
Thanks,
Kirill
next prev parent reply other threads:[~2018-03-21 15:43 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-21 13:21 [PATCH 00/10] Improve shrink_slab() scalability (old complexity was O(n^2), new is O(n)) Kirill Tkhai
2018-03-21 13:21 ` [PATCH 01/10] mm: Assign id to every memcg-aware shrinker Kirill Tkhai
2018-03-24 18:40 ` Vladimir Davydov
2018-03-26 15:09 ` Kirill Tkhai
2018-03-26 15:14 ` Matthew Wilcox
2018-03-26 15:38 ` Kirill Tkhai
2018-03-27 9:15 ` Vladimir Davydov
2018-03-27 15:09 ` Kirill Tkhai
2018-03-27 15:48 ` Vladimir Davydov
2018-03-28 10:30 ` Kirill Tkhai
2018-03-28 11:02 ` Vladimir Davydov
2018-03-21 13:21 ` [PATCH 02/10] mm: Maintain memcg-aware shrinkers in mcg_shrinkers array Kirill Tkhai
2018-03-24 18:45 ` Vladimir Davydov
2018-03-26 15:20 ` Kirill Tkhai
2018-03-26 15:34 ` Matthew Wilcox
2018-03-27 9:18 ` Vladimir Davydov
2018-03-27 15:30 ` Kirill Tkhai
2018-03-21 13:21 ` [PATCH 03/10] mm: Assign memcg-aware shrinkers bitmap to memcg Kirill Tkhai
2018-03-21 14:56 ` Matthew Wilcox
2018-03-21 15:12 ` Kirill Tkhai
2018-03-21 15:26 ` Matthew Wilcox
2018-03-21 15:43 ` Kirill Tkhai [this message]
2018-03-21 16:20 ` Matthew Wilcox
2018-03-21 16:42 ` Kirill Tkhai
2018-03-21 17:54 ` Matthew Wilcox
2018-03-22 16:39 ` Kirill Tkhai
2018-03-23 9:06 ` kbuild test robot
2018-03-23 11:26 ` Kirill Tkhai
2018-03-24 19:25 ` Vladimir Davydov
2018-03-26 15:29 ` Kirill Tkhai
2018-03-27 10:00 ` Vladimir Davydov
2018-03-27 15:17 ` Kirill Tkhai
2018-03-21 13:21 ` [PATCH 04/10] fs: Propagate shrinker::id to list_lru Kirill Tkhai
2018-03-24 18:50 ` Vladimir Davydov
2018-03-26 15:29 ` Kirill Tkhai
2018-03-21 13:22 ` [PATCH 05/10] list_lru: Add memcg argument to list_lru_from_kmem() Kirill Tkhai
2018-04-02 3:17 ` [lkp-robot] [list_lru] 42658d54ce: BUG:unable_to_handle_kernel kernel test robot
2018-04-02 8:51 ` Kirill Tkhai
2018-03-21 13:22 ` [PATCH 06/10] list_lru: Pass dst_memcg argument to memcg_drain_list_lru_node() Kirill Tkhai
2018-03-24 19:32 ` Vladimir Davydov
2018-03-26 15:30 ` Kirill Tkhai
2018-03-28 14:49 ` Kirill Tkhai
2018-03-21 13:22 ` [PATCH 07/10] list_lru: Pass lru " Kirill Tkhai
2018-03-21 13:22 ` [PATCH 08/10] mm: Set bit in memcg shrinker bitmap on first list_lru item apearance Kirill Tkhai
2018-03-24 19:45 ` Vladimir Davydov
2018-03-26 15:31 ` Kirill Tkhai
2018-03-21 13:22 ` [PATCH 09/10] mm: Iterate only over charged shrinkers during memcg shrink_slab() Kirill Tkhai
2018-03-24 20:11 ` Vladimir Davydov
2018-03-26 15:33 ` Kirill Tkhai
2018-03-21 13:23 ` [PATCH 10/10] mm: Clear shrinker bit if there are no objects related to memcg Kirill Tkhai
2018-03-24 20:33 ` Vladimir Davydov
2018-03-26 15:37 ` Kirill Tkhai
2018-03-21 13:23 ` [PATCH 00/10] Improve shrink_slab() scalability (old complexity was O(n^2), new is O(n)) Kirill Tkhai
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=638887a1-35f8-a71d-6e45-4e779eb62dc4@virtuozzo.com \
--to=ktkhai@virtuozzo.com \
--cc=akpm@linux-foundation.org \
--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=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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox