Revert "Revert "block, bfq: honor already-setup queue merges""
[ Upstream commit15729ff814
] A crash [1] happened to be triggered in conjunction with commit2d52c58b9c
("block, bfq: honor already-setup queue merges"). The latter was then reverted by commitebc69e897e
("Revert "block, bfq: honor already-setup queue merges""). Yet, the reverted commit was not the one introducing the bug. In fact, it actually triggered a UAF introduced by a different commit, and now fixed by commitd29bd41428
("block, bfq: reset last_bfqq_created on group change"). So, there is no point in keeping commit2d52c58b9c
("block, bfq: honor already-setup queue merges") out. This commit restores it. [1] https://bugzilla.kernel.org/show_bug.cgi?id=214503 Reported-by: Holger Hoffstätte <holger@applied-asynchrony.com> Signed-off-by: Paolo Valente <paolo.valente@linaro.org> Link: https://lore.kernel.org/r/20211125181510.15004-1-paolo.valente@linaro.org Signed-off-by: Jens Axboe <axboe@kernel.dk> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Родитель
5b8d69c8c1
Коммит
65d8a73745
|
@ -2662,6 +2662,15 @@ bfq_setup_merge(struct bfq_queue *bfqq, struct bfq_queue *new_bfqq)
|
||||||
* are likely to increase the throughput.
|
* are likely to increase the throughput.
|
||||||
*/
|
*/
|
||||||
bfqq->new_bfqq = new_bfqq;
|
bfqq->new_bfqq = new_bfqq;
|
||||||
|
/*
|
||||||
|
* The above assignment schedules the following redirections:
|
||||||
|
* each time some I/O for bfqq arrives, the process that
|
||||||
|
* generated that I/O is disassociated from bfqq and
|
||||||
|
* associated with new_bfqq. Here we increases new_bfqq->ref
|
||||||
|
* in advance, adding the number of processes that are
|
||||||
|
* expected to be associated with new_bfqq as they happen to
|
||||||
|
* issue I/O.
|
||||||
|
*/
|
||||||
new_bfqq->ref += process_refs;
|
new_bfqq->ref += process_refs;
|
||||||
return new_bfqq;
|
return new_bfqq;
|
||||||
}
|
}
|
||||||
|
@ -2724,6 +2733,10 @@ bfq_setup_cooperator(struct bfq_data *bfqd, struct bfq_queue *bfqq,
|
||||||
{
|
{
|
||||||
struct bfq_queue *in_service_bfqq, *new_bfqq;
|
struct bfq_queue *in_service_bfqq, *new_bfqq;
|
||||||
|
|
||||||
|
/* if a merge has already been setup, then proceed with that first */
|
||||||
|
if (bfqq->new_bfqq)
|
||||||
|
return bfqq->new_bfqq;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check delayed stable merge for rotational or non-queueing
|
* Check delayed stable merge for rotational or non-queueing
|
||||||
* devs. For this branch to be executed, bfqq must not be
|
* devs. For this branch to be executed, bfqq must not be
|
||||||
|
@ -2825,9 +2838,6 @@ bfq_setup_cooperator(struct bfq_data *bfqd, struct bfq_queue *bfqq,
|
||||||
if (bfq_too_late_for_merging(bfqq))
|
if (bfq_too_late_for_merging(bfqq))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (bfqq->new_bfqq)
|
|
||||||
return bfqq->new_bfqq;
|
|
||||||
|
|
||||||
if (!io_struct || unlikely(bfqq == &bfqd->oom_bfqq))
|
if (!io_struct || unlikely(bfqq == &bfqd->oom_bfqq))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче