blk-iocost: fix spin_lock won't release in sq
hulk inclusion
category: feature
bugzilla: 38688
CVE: NA
---------------------------
ioc_rqos_throttle() will be called with spin_lock_irq(q->queue_lock)
called in sq. However, ioc_rqos_throttle() will call
spin_lock_irq(&ioc->lock) and spin_unlock_irq(&ioc->lock) before
'q->queue_lock' is released. Thus, local irqs will be enabled after
'ioc->lock' is released and 'q->queue_lock' might never be released.
spin_lock_irq(q->queue_lock) --> local irq will be disabled
rq_qos_throttle
spin_lock_irq(&ioc->lock)
spin_unlock_irq(&ioc->lock) --> local irq will be enabled before
'q->queue_lock' is released
spin_unlock_irq(&q->queue_lock)
io_schedule()
spin_lock_irq(q->queue_lock)
Fix the problem by using spin_lock_irqsave()/spin_unlock_irqrestore()
for other locks.
Signed-off-by: NYu Kuai <yukuai3@huawei.com>
Reviewed-by: NHou Tao <houtao1@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
Showing
想要评论请 注册 或 登录