• Shakeel Butt's avatar
    memcg: make memcg->event_list_lock irqsafe · 4ba9515d
    Shakeel Butt authored
    The memcg->event_list_lock is usually taken in the normal context but when
    the userspace closes the corresponding eventfd, eventfd_release through
    memcg_event_wake takes memcg->event_list_lock with interrupts disabled.
    This is not an issue on its own but it creates a nested dependency from
    eventfd_ctx->wqh.lock to memcg->event_list_lock.
    
    Independently, for unrelated eventfd, eventfd_signal() can be called in
    the irq context, thus making eventfd_ctx->wqh.lock an irq lock.  For
    example, FPGA DFL driver, VHOST VPDA driver and couple of VFIO drivers.
    This will force memcg->event_list_lock to be an irqsafe lock as well.
    
    One way to break the nested dependency between eventfd_ctx->wqh.lock and
    memcg->event_list_lock is to add an indirection.  However the simplest
    solution would be to make memcg->event_list_lock irqsafe.  This is cgroup
    v1 feature, is in maintenance and may get deprecated in near future.  So,
    no need to add more code.
    
    BTW this has been discussed previously [1] but there weren't irq users of
    eventfd_signal() at the time.
    
    [1] https://www.spinics.net/lists/cgroups/msg06248.html
    
    Link: https://lkml.kernel.org/r/20210830172953.207257-1-shakeelb@google.comSigned-off-by: default avatarShakeel Butt <shakeelb@google.com>
    Cc: Tejun Heo <tj@kernel.org>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Michal Hocko <mhocko@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    4ba9515d
memcontrol.c 193 KB