From: Muchun Song <muchun.song@linux.dev>
To: Yafang Shao <laoar.shao@gmail.com>
Cc: Shakeel Butt <shakeelb@google.com>,
Alexei Starovoitov <ast@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Andrii Nakryiko <andrii@kernel.org>, Martin Lau <kafai@fb.com>,
Song Liu <songliubraving@fb.com>, Yonghong Song <yhs@fb.com>,
john fastabend <john.fastabend@gmail.com>,
KP Singh <kpsingh@kernel.org>,
Stanislav Fomichev <sdf@google.com>, Hao Luo <haoluo@google.com>,
jolsa@kernel.org, Johannes Weiner <hannes@cmpxchg.org>,
Michal Hocko <mhocko@kernel.org>,
Roman Gushchin <roman.gushchin@linux.dev>,
Muchun Song <songmuchun@bytedance.com>,
Andrew Morton <akpm@linux-foundation.org>,
netdev <netdev@vger.kernel.org>, bpf <bpf@vger.kernel.org>,
Linux MM <linux-mm@kvack.org>
Subject: Re: [PATCH bpf-next 05/15] bpf: Fix incorrect mem_cgroup_put
Date: Fri, 12 Aug 2022 13:33:54 +0800 [thread overview]
Message-ID: <870C70CA-C760-40A5-8A04-F0962EFDF507@linux.dev> (raw)
In-Reply-To: <CALOAHbCXfRKDEt7jsUBsf-pQ-A7TpXPxGKYxu_GZN-8BUe2auw@mail.gmail.com>
> On Aug 12, 2022, at 08:27, Yafang Shao <laoar.shao@gmail.com> wrote:
>
> On Thu, Aug 11, 2022 at 11:47 PM Shakeel Butt <shakeelb@google.com> wrote:
>>
>> On Thu, Aug 11, 2022 at 10:49:13AM +0800, Yafang Shao wrote:
>>> On Thu, Aug 11, 2022 at 1:07 AM Shakeel Butt <shakeelb@google.com> wrote:
>>>>
>>>> On Wed, Aug 10, 2022 at 03:18:30PM +0000, Yafang Shao wrote:
>>>>> The memcg may be the root_mem_cgroup, in which case we shouldn't put it.
>>>>
>>>> No, it is ok to put root_mem_cgroup. css_put already handles the root
>>>> cgroups.
>>>>
>>>
>>> Ah, this commit log doesn't describe the issue clearly. I should improve it.
>>> The issue is that in bpf_map_get_memcg() it doesn't get the objcg if
>>> map->objcg is NULL (that can happen if the map belongs to the root
>>> memcg), so we shouldn't put the objcg if map->objcg is NULL neither in
>>> bpf_map_put_memcg().
>>
>> Sorry I am still not understanding. We are not 'getting' objcg in
>> bpf_map_get_memcg(). We are 'getting' memcg from map->objcg and if that
>> is NULL the function is returning root memcg and putting root memcg is
>> totally fine.
>
> When the map belongs to root_mem_cgroup, the map->objcg is NULL, right ?
> See also bpf_map_save_memcg() and it describes clearly in the comment -
>
> static void bpf_map_save_memcg(struct bpf_map *map)
> {
> /* Currently if a map is created by a process belonging to the root
> * memory cgroup, get_obj_cgroup_from_current() will return NULL.
> * So we have to check map->objcg for being NULL each time it's
> * being used.
> */
> map->objcg = get_obj_cgroup_from_current();
> }
>
> So for the root_mem_cgroup case, bpf_map_get_memcg() will return
> root_mem_cgroup directly without getting its css, right ? See below,
>
> static struct mem_cgroup *bpf_map_get_memcg(const struct bpf_map *map)
> {
>
> if (map->objcg)
> return get_mem_cgroup_from_objcg(map->objcg);
>
> return root_mem_cgroup; // without css_get(&memcg->css);
> }
>
> But it will put the css unconditionally. See below,
>
> memcg = bpf_map_get_memcg(map);
> ...
> mem_cgroup_put(memcg);
>
> So we should put it *conditionally* as well.
Hi,
No. We could put root_mem_cgroup unconditionally since the root css
is treated as no reference css. See css_put().
static inline void css_put(struct cgroup_subsys_state *css)
{
// The root memcg’s css has been set with CSS_NO_REF.
if (!(css->flags & CSS_NO_REF))
percpu_ref_put(&css->refcnt);
}
Muchun,
Thanks.
>
> memcg = bpf_map_get_memcg(map);
> ...
> + if (map->objcg)
> mem_cgroup_put(memcg);
>
> Is it clear to you ?
>
>> Or are you saying that root_mem_cgroup is NULL?
>>
>
> No
>
> --
> Regards
> Yafang
next prev parent reply other threads:[~2022-08-12 5:34 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-10 15:18 [PATCH bpf-next 00/15] bpf: Introduce selectable memcg for bpf map Yafang Shao
2022-08-10 15:18 ` [PATCH bpf-next 01/15] bpf: Remove unneeded memset in queue_stack_map creation Yafang Shao
2022-08-10 15:18 ` [PATCH bpf-next 02/15] bpf: Use bpf_map_area_free instread of kvfree Yafang Shao
2022-08-10 15:18 ` [PATCH bpf-next 03/15] bpf: Make __GFP_NOWARN consistent in bpf map creation Yafang Shao
2022-08-10 15:18 ` [PATCH bpf-next 04/15] bpf: Use bpf_map_area_alloc consistently on " Yafang Shao
2022-08-10 15:18 ` [PATCH bpf-next 05/15] bpf: Fix incorrect mem_cgroup_put Yafang Shao
2022-08-10 17:07 ` Shakeel Butt
2022-08-11 2:49 ` Yafang Shao
2022-08-11 15:47 ` Shakeel Butt
2022-08-12 0:27 ` Yafang Shao
2022-08-12 5:33 ` Muchun Song [this message]
2022-08-12 11:25 ` Yafang Shao
2022-08-11 16:48 ` Roman Gushchin
2022-08-12 0:31 ` Yafang Shao
2022-08-10 15:18 ` [PATCH bpf-next 06/15] bpf: Define bpf_map_{get,put}_memcg for !CONFIG_MEMCG_KMEM Yafang Shao
2022-08-10 15:18 ` [PATCH bpf-next 07/15] bpf: Call bpf_map_init_from_attr() immediately after map creation Yafang Shao
2022-08-10 15:18 ` [PATCH bpf-next 08/15] bpf: Save memcg in bpf_map_init_from_attr() Yafang Shao
2022-08-10 15:18 ` [PATCH bpf-next 09/15] bpf: Use scoped-based charge in bpf_map_area_alloc Yafang Shao
2022-08-10 15:18 ` [PATCH bpf-next 10/15] bpf: Introduce new helpers bpf_ringbuf_pages_{alloc,free} Yafang Shao
2022-08-10 15:18 ` [PATCH bpf-next 11/15] bpf: Use bpf_map_kzalloc in arraymap Yafang Shao
2022-08-10 15:18 ` [PATCH bpf-next 12/15] bpf: Use bpf_map_kvcalloc in bpf_local_storage Yafang Shao
2022-08-10 15:18 ` [PATCH bpf-next 13/15] mm, memcg: Add new helper get_obj_cgroup_from_cgroup Yafang Shao
2022-08-11 16:16 ` Roman Gushchin
2022-08-12 0:35 ` Yafang Shao
2022-08-12 17:40 ` Roman Gushchin
2022-08-12 23:56 ` Yafang Shao
2022-08-13 18:30 ` Roman Gushchin
2022-08-14 2:35 ` Yafang Shao
2022-08-12 16:57 ` Shakeel Butt
2022-08-13 0:07 ` Yafang Shao
2022-08-10 15:18 ` [PATCH bpf-next 14/15] bpf: Add return value for bpf_map_init_from_attr Yafang Shao
2022-08-10 15:18 ` [PATCH bpf-next 15/15] bpf: Introduce selectable memcg for bpf map Yafang Shao
2022-08-10 19:00 ` [PATCH bpf-next 00/15] " patchwork-bot+netdevbpf
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=870C70CA-C760-40A5-8A04-F0962EFDF507@linux.dev \
--to=muchun.song@linux.dev \
--cc=akpm@linux-foundation.org \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=hannes@cmpxchg.org \
--cc=haoluo@google.com \
--cc=john.fastabend@gmail.com \
--cc=jolsa@kernel.org \
--cc=kafai@fb.com \
--cc=kpsingh@kernel.org \
--cc=laoar.shao@gmail.com \
--cc=linux-mm@kvack.org \
--cc=mhocko@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=roman.gushchin@linux.dev \
--cc=sdf@google.com \
--cc=shakeelb@google.com \
--cc=songliubraving@fb.com \
--cc=songmuchun@bytedance.com \
--cc=yhs@fb.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