Thread (17 messages) 17 messages, 4 authors, 2024-08-30

Re: [PATCH v2] memcg: add charging of already allocated slab objects

From: Vlastimil Babka <hidden>
Date: 2024-08-29 08:43:02
Also in: cgroups, linux-mm, lkml

On 8/29/24 02:49, Yosry Ahmed wrote:
On Wed, Aug 28, 2024 at 5:20 PM Shakeel Butt [off-list ref] wrote:
quoted
On Wed, Aug 28, 2024 at 04:25:30PM GMT, Yosry Ahmed wrote:
quoted
On Tue, Aug 27, 2024 at 4:52 PM Shakeel Butt [off-list ref] wrote:
quoted
[...]
quoted
quoted
+
+       /* Ignore KMALLOC_NORMAL cache to avoid circular dependency. */
+       if ((s->flags & KMALLOC_TYPE) == SLAB_KMALLOC)
+               return true;
Taking a step back here, why do we need this? Which circular
dependency are we avoiding here?
commit 494c1dfe855ec1f70f89552fce5eadf4a1717552
Author: Waiman Long [off-list ref]
Date:   Mon Jun 28 19:37:38 2021 -0700

    mm: memcg/slab: create a new set of kmalloc-cg-<n> caches

    There are currently two problems in the way the objcg pointer array
    (memcg_data) in the page structure is being allocated and freed.

    On its allocation, it is possible that the allocated objcg pointer
    array comes from the same slab that requires memory accounting. If this
    happens, the slab will never become empty again as there is at least
    one object left (the obj_cgroup array) in the slab.

    When it is freed, the objcg pointer array object may be the last one
    in its slab and hence causes kfree() to be called again. With the
    right workload, the slab cache may be set up in a way that allows the
    recursive kfree() calling loop to nest deep enough to cause a kernel
    stack overflow and panic the system.
    ...
Thanks for the reference, this makes sense.
Another reason is memory savings, if we have a small subset of objects in
KMALLOC_NORMAL caches accounted, there might be e.g. one vector per a slab
just to account on object while the rest is unaccounted. Separating between
kmalloc and kmalloc-cg caches keeps the former with no vectors and the
latter with fully used vectors.
Wouldn't it be easier to special case the specific slab cache used for
the objcg vector or use a dedicated cache for it instead of using
kmalloc caches to begin with?
The problem is the vector isn't a fixed size, it depends on how many objects
a particular slab (not even a particular cache) has.
Anyway, I am fine with any approach you and/or the slab maintainers
prefer, as long as we make things clear. If you keep the following
approach as-is, please expand the comment or refer to the commit you
just referenced.

Personally, I prefer either explicitly special casing the slab cache
used for the objcgs vector, explicitly tagging KMALLOC_NORMAL
allocations, or having a dedicated documented helper that finds the
slab cache kmalloc type (if any) or checks if it is a KMALLOC_NORMAL
cache.
A helper to check is_kmalloc_normal() would be better than defining
KMALLOC_TYPE and using it directly, yes. We don't need to handle any other
types now until anyone needs those.

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help