• Yu Kuai's avatar
    blk-cgroup: support to track if policy is online · dfd6200a
    Yu Kuai authored
    A new field 'online' is added to blkg_policy_data to fix following
    2 problem:
    
    1) In blkcg_activate_policy(), if pd_alloc_fn() with 'GFP_NOWAIT'
       failed, 'queue_lock' will be dropped and pd_alloc_fn() will try again
       without 'GFP_NOWAIT'. In the meantime, remove cgroup can race with
       it, and pd_offline_fn() will be called without pd_init_fn() and
       pd_online_fn(). This way null-ptr-deference can be triggered.
    
    2) In order to synchronize pd_free_fn() from blkg_free_workfn() and
       blkcg_deactivate_policy(), 'list_del_init(&blkg->q_node)' will be
       delayed to blkg_free_workfn(), hence pd_offline_fn() can be called
       first in blkg_destroy(), and then blkcg_deactivate_policy() will
       call it again, we must prevent it.
    
    The new field 'online' will be set after pd_online_fn() and will be
    cleared after pd_offline_fn(), in the meantime pd_offline_fn() will only
    be called if 'online' is set.
    Signed-off-by: default avatarYu Kuai <yukuai3@huawei.com>
    Acked-by: default avatarTejun Heo <tj@kernel.org>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Link: https://lore.kernel.org/r/20230119110350.2287325-3-yukuai1@huaweicloud.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    dfd6200a
blk-cgroup.h 15.5 KB