Re: [PATCH v4] memcg: add charging of already allocated slab objects
From: Yosry Ahmed <hidden>
Date: 2024-09-06 17:39:21
Also in:
cgroups, linux-mm, lkml
On Fri, Sep 6, 2024 at 10:29 AM Vlastimil Babka [off-list ref] wrote:
On 9/6/24 19:19, Yosry Ahmed wrote:quoted
[..]quoted
I felt it could be improved more, so ended up with this. Thoughts? /** * kmem_cache_charge - memcg charge an already allocated slab memory * @objp: address of the slab object to memcg charge * @gfpflags: describe the allocation context * * kmem_cache_charge allows charging a slab object to the current memcg, * primarily in cases where charging at allocation time might not be possible * because the target memcg is not known (i.e. softirq context) * * The objp should be pointer returned by the slab allocator functions like * kmalloc (with __GFP_ACCOUNT in flags) or kmem_cache_alloc. The memcg chargeAren't allocations done with kmalloc(__GFP_ACCOUNT) already accounted? Why would we need to call kmem_cache_charge() for those?AFAIU current_obj_cgroup() returns NULL because we're in the interrupt context and no remote memcg context has been set. Thus the charging is skipped. The patch commit log describes such scenario for network receive.
Oh yeah I missed that part. I thought the networking allocations in interrupt context are made without __GFP_ACCOUNT to begin with.
But in case of kmalloc() the allocation must have been still attempted with __GFP_ACCOUNT so a kmalloc-cg cache is used even if the charging fails.
It is still possible that the initial allocation did not have __GFP_ACCOUNT, but not from a KMALLOC_NORMAL cache (e.g. KMALLOC_DMA or KMALLOC_RECLAIM). In this case kmem_cache_charge() should still work, right?
If there's another usage for kmem_cache_charge() where the memcg is available but we don't want to charge immediately on purpose (such as the Linus' idea for struct file), we might need to find another way to tell kmalloc() to use the kmalloc-cg cache but not charge immediately...
Can we just use a dedicated kmem_cache for this instead?