提交 ceb9b8c3 编写于 作者: J Jiufei Xue 提交者: Yang Yingliang

iocost: fix a deadlock in ioc_rqos_throttle()

hulk inclusion
category: feature
bugzilla: 38688
CVE: NA

---------------------------

ioc_rqos_throttle() may called inside queue_lock, the lock should
be unlocked before sleep.
Signed-off-by: NJiufei Xue <jiufei.xue@linux.alibaba.com>
Reviewed-by: NJoseph Qi <joseph.qi@linux.alibaba.com>

Conflict: block/blk-iocost.c
Signed-off-by: NYu Kuai <yukuai3@huawei.com>
Reviewed-by: NHou Tao <houtao1@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 c076cd0f
...@@ -1678,6 +1678,8 @@ static u64 calc_vtime_cost(struct bio *bio, struct ioc_gq *iocg, bool is_merge) ...@@ -1678,6 +1678,8 @@ static u64 calc_vtime_cost(struct bio *bio, struct ioc_gq *iocg, bool is_merge)
static void ioc_rqos_throttle(struct rq_qos *rqos, struct bio *bio, static void ioc_rqos_throttle(struct rq_qos *rqos, struct bio *bio,
spinlock_t *lock) spinlock_t *lock)
__releases(lock)
__acquires(lock)
{ {
struct ioc *ioc = rqos_to_ioc(rqos); struct ioc *ioc = rqos_to_ioc(rqos);
struct request_queue *q = rqos->q; struct request_queue *q = rqos->q;
...@@ -1814,8 +1816,15 @@ static void ioc_rqos_throttle(struct rq_qos *rqos, struct bio *bio, ...@@ -1814,8 +1816,15 @@ static void ioc_rqos_throttle(struct rq_qos *rqos, struct bio *bio,
set_current_state(TASK_UNINTERRUPTIBLE); set_current_state(TASK_UNINTERRUPTIBLE);
if (wait.committed) if (wait.committed)
break; break;
if (lock) {
spin_unlock_irq(lock);
io_schedule();
spin_lock_irq(lock);
} else {
io_schedule(); io_schedule();
} }
}
/* waker already committed us, proceed */ /* waker already committed us, proceed */
finish_wait(&iocg->waitq, &wait.wait); finish_wait(&iocg->waitq, &wait.wait);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册