• Roman Gushchin's avatar
    mm: kmem: prepare remote memcg charging infra for interrupt contexts · 37d5985c
    Roman Gushchin authored
    Remote memcg charging API uses current->active_memcg to store the
    currently active memory cgroup, which overwrites the memory cgroup of the
    current process.  It works well for normal contexts, but doesn't work for
    interrupt contexts: indeed, if an interrupt occurs during the execution of
    a section with an active memcg set, all allocations inside the interrupt
    will be charged to the active memcg set (given that we'll enable
    accounting for allocations from an interrupt context).  But because the
    interrupt might have no relation to the active memcg set outside, it's
    obviously wrong from the accounting prospective.
    
    To resolve this problem, let's add a global percpu int_active_memcg
    variable, which will be used to store an active memory cgroup which will
    be used from interrupt contexts.  set_active_memcg() will transparently
    use current->active_memcg or int_active_memcg depending on the context.
    
    To make the read part simple and transparent for the caller, let's
    introduce two new functions:
      - struct mem_cgroup *active_memcg(void),
      - struct mem_cgroup *get_active_memcg(void).
    
    They are returning the active memcg if it's set, hiding all implementation
    details: where to get it depending on the current context.
    Signed-off-by: default avatarRoman Gushchin <guro@fb.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Reviewed-by: default avatarShakeel Butt <shakeelb@google.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Michal Hocko <mhocko@kernel.org>
    Link: http://lkml.kernel.org/r/20200827225843.1270629-4-guro@fb.comSigned-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    37d5985c
memcontrol.c 191 KB