Re: [PATCH] memcg: Fix memcg_kmem_bypass() for remote memcg charging

Zefan Li
2020-05-13T11:19:56Z

On 2020/5/13 17:05, Michal Hocko wrote:
> On Wed 13-05-20 15:28:28, Li Zefan wrote:
>> While trying to use remote memcg charging in an out-of-tree kernel module
>> I found it's not working, because the current thread is a workqueue thread.
>>
>> Signed-off-by: Zefan Li <lizefan-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
>> ---
>>
>> No need to queue this for v5.7 as currently no upstream users of this memcg
>> feature suffer from this bug.
>>
>> ---
>> mm/memcontrol.c | 2 ++
>> 1 file changed, 2 insertions(+)
>>
>> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
>> index a3b97f1..db836fc 100644
>> --- a/mm/memcontrol.c
>> +++ b/mm/memcontrol.c
>> @@ -2802,6 +2802,8 @@ static void memcg_schedule_kmem_cache_create(struct mem_cgroup *memcg,
>>
>> static inline bool memcg_kmem_bypass(void)
>> {
>> + if (unlikely(current->active_memcg))
>> + return false;
>
> I am confused. Why the check below is insufficient? It checks for both mm
> and PF_KTHREAD?
>

memalloc_use_memcg(memcg);
alloc_page(GFP_KERNEL_ACCOUNT);
memalloc_unuse_memcg();

If we run above code in a workqueue thread the memory won't be charged to the specific
memcg, because memcg_kmem_bypass() returns true in this case.

>> if (in_interrupt() || !current->mm || (current->flags & PF_KTHREAD))
>> return true;
>> return false;