• Ming Lei's avatar
    blk-cgroup: Flush stats before releasing blkcg_gq · 20cb1c2f
    Ming Lei authored
    As noted by Michal, the blkg_iostat_set's in the lockless list hold
    reference to blkg's to protect against their removal. Those blkg's
    hold reference to blkcg. When a cgroup is being destroyed,
    cgroup_rstat_flush() is only called at css_release_work_fn() which
    is called when the blkcg reference count reaches 0. This circular
    dependency will prevent blkcg and some blkgs from being freed after
    they are made offline.
    
    It is less a problem if the cgroup to be destroyed also has other
    controllers like memory that will call cgroup_rstat_flush() which will
    clean up the reference count. If block is the only controller that uses
    rstat, these offline blkcg and blkgs may never be freed leaking more
    and more memory over time.
    
    To prevent this potential memory leak:
    
    - flush blkcg per-cpu stats list in __blkg_release(), when no new stat
    can be added
    
    - add global blkg_stat_lock for covering concurrent parent blkg stat
    update
    
    - don't grab bio->bi_blkg reference when adding the stats into blkcg's
    per-cpu stat list since all stats are guaranteed to be consumed before
    releasing blkg instance, and grabbing blkg reference for stats was the
    most fragile part of original patch
    
    Based on Waiman's patch:
    
    https://lore.kernel.org/linux-block/20221215033132.230023-3-longman@redhat.com/
    
    Fixes: 3b8cc629 ("blk-cgroup: Optimize blkcg_rstat_flush()")
    Cc: stable@vger.kernel.org
    Reported-by: default avatarJay Shin <jaeshin@redhat.com>
    Acked-by: default avatarTejun Heo <tj@kernel.org>
    Cc: Waiman Long <longman@redhat.com>
    Cc: mkoutny@suse.com
    Cc: Yosry Ahmed <yosryahmed@google.com>
    Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
    Link: https://lore.kernel.org/r/20230609234249.1412858-1-ming.lei@redhat.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    20cb1c2f
blk-cgroup.c 55.8 KB