• Tejun Heo's avatar
    blk-iocost: fix NULL iocg deref from racing against initialization · d16baa3f
    Tejun Heo authored
    When initializing iocost for a queue, its rqos should be registered before
    the blkcg policy is activated to allow policy data initiailization to lookup
    the associated ioc. This unfortunately means that the rqos methods can be
    called on bios before iocgs are attached to all existing blkgs.
    
    While the race is theoretically possible on ioc_rqos_throttle(), it mostly
    happened in ioc_rqos_merge() due to the difference in how they lookup ioc.
    The former determines it from the passed in @rqos and then bails before
    dereferencing iocg if the looked up ioc is disabled, which most likely is
    the case if initialization is still in progress. The latter looked up ioc by
    dereferencing the possibly NULL iocg making it a lot more prone to actually
    triggering the bug.
    
    * Make ioc_rqos_merge() use the same method as ioc_rqos_throttle() to look
      up ioc for consistency.
    
    * Make ioc_rqos_throttle() and ioc_rqos_merge() test for NULL iocg before
      dereferencing it.
    
    * Explain the danger of NULL iocgs in blk_iocost_init().
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Reported-by: default avatarJonathan Lemon <bsd@fb.com>
    Cc: stable@vger.kernel.org # v5.4+
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    d16baa3f
blk-iocost.c 96.1 KB