• Roman Gushchin's avatar
    mm: kmem: add direct objcg pointer to task_struct · 1aacbd35
    Roman Gushchin authored
    To charge a freshly allocated kernel object to a memory cgroup, the kernel
    needs to obtain an objcg pointer.  Currently it does it indirectly by
    obtaining the memcg pointer first and then calling to
    __get_obj_cgroup_from_memcg().
    
    Usually tasks spend their entire life belonging to the same object cgroup.
    So it makes sense to save the objcg pointer on task_struct directly, so
    it can be obtained faster.  It requires some work on fork, exit and cgroup
    migrate paths, but these paths are way colder.
    
    To avoid any costly synchronization the following rules are applied:
    1) A task sets it's objcg pointer itself.
    
    2) If a task is being migrated to another cgroup, the least
       significant bit of the objcg pointer is set atomically.
    
    3) On the allocation path the objcg pointer is obtained locklessly
       using the READ_ONCE() macro and the least significant bit is
       checked. If it's set, the following procedure is used to update
       it locklessly:
           - task->objcg is zeroed using cmpxcg
           - new objcg pointer is obtained
           - task->objcg is updated using try_cmpxchg
           - operation is repeated if try_cmpxcg fails
       It guarantees that no updates will be lost if task migration
       is racing against objcg pointer update. It also allows to keep
       both read and write paths fully lockless.
    
    Because the task is keeping a reference to the objcg, it can't go away
    while the task is alive.
    
    This commit doesn't change the way the remote memcg charging works.
    
    Link: https://lkml.kernel.org/r/20231019225346.1822282-3-roman.gushchin@linux.devSigned-off-by: default avatarRoman Gushchin (Cruise) <roman.gushchin@linux.dev>
    Tested-by: default avatarNaresh Kamboju <naresh.kamboju@linaro.org>
    Acked-by: default avatarJohannes Weiner <hannes@cmpxchg.org>
    Acked-by: default avatarShakeel Butt <shakeelb@google.com>
    Reviewed-by: default avatarVlastimil Babka <vbabka@suse.cz>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Dennis Zhou <dennis@kernel.org>
    Cc: Michal Hocko <mhocko@kernel.org>
    Cc: Muchun Song <muchun.song@linux.dev>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    1aacbd35
memcontrol.c 211 KB