block, bfq: factor out a helper to split bfqq in bfq_init_rq()
Make code cleaner, there are no functional changes. Signed-off-by: Yu Kuai <yukuai3@huawei.com> Link: https://lore.kernel.org/r/20240909134154.954924-8-yukuai1@huaweicloud.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
3c61429c29
commit
a7609d2aec
@ -6737,11 +6737,10 @@ bfq_split_bfqq(struct bfq_io_cq *bic, struct bfq_queue *bfqq)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct bfq_queue *bfq_get_bfqq_handle_split(struct bfq_data *bfqd,
|
static struct bfq_queue *
|
||||||
struct bfq_io_cq *bic,
|
__bfq_get_bfqq_handle_split(struct bfq_data *bfqd, struct bfq_io_cq *bic,
|
||||||
struct bio *bio,
|
struct bio *bio, bool split, bool is_sync,
|
||||||
bool split, bool is_sync,
|
bool *new_queue)
|
||||||
bool *new_queue)
|
|
||||||
{
|
{
|
||||||
unsigned int act_idx = bfq_actuator_index(bfqd, bio);
|
unsigned int act_idx = bfq_actuator_index(bfqd, bio);
|
||||||
struct bfq_queue *bfqq = bic_to_bfqq(bic, is_sync, act_idx);
|
struct bfq_queue *bfqq = bic_to_bfqq(bic, is_sync, act_idx);
|
||||||
@ -6845,6 +6844,59 @@ static struct bfq_queue *bfq_waker_bfqq(struct bfq_queue *bfqq)
|
|||||||
return waker_bfqq;
|
return waker_bfqq;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct bfq_queue *bfq_get_bfqq_handle_split(struct bfq_data *bfqd,
|
||||||
|
struct bfq_io_cq *bic,
|
||||||
|
struct bio *bio,
|
||||||
|
unsigned int idx,
|
||||||
|
bool is_sync)
|
||||||
|
{
|
||||||
|
struct bfq_queue *waker_bfqq;
|
||||||
|
struct bfq_queue *bfqq;
|
||||||
|
bool new_queue = false;
|
||||||
|
|
||||||
|
bfqq = __bfq_get_bfqq_handle_split(bfqd, bic, bio, false, is_sync,
|
||||||
|
&new_queue);
|
||||||
|
if (unlikely(new_queue))
|
||||||
|
return bfqq;
|
||||||
|
|
||||||
|
/* If the queue was seeky for too long, break it apart. */
|
||||||
|
if (!bfq_bfqq_coop(bfqq) || !bfq_bfqq_split_coop(bfqq) ||
|
||||||
|
bic->bfqq_data[idx].stably_merged)
|
||||||
|
return bfqq;
|
||||||
|
|
||||||
|
waker_bfqq = bfq_waker_bfqq(bfqq);
|
||||||
|
|
||||||
|
/* Update bic before losing reference to bfqq */
|
||||||
|
if (bfq_bfqq_in_large_burst(bfqq))
|
||||||
|
bic->bfqq_data[idx].saved_in_large_burst = true;
|
||||||
|
|
||||||
|
bfqq = bfq_split_bfqq(bic, bfqq);
|
||||||
|
if (bfqq) {
|
||||||
|
bfq_bfqq_resume_state(bfqq, bfqd, bic, true);
|
||||||
|
return bfqq;
|
||||||
|
}
|
||||||
|
|
||||||
|
bfqq = __bfq_get_bfqq_handle_split(bfqd, bic, bio, true, is_sync, NULL);
|
||||||
|
if (unlikely(bfqq == &bfqd->oom_bfqq))
|
||||||
|
return bfqq;
|
||||||
|
|
||||||
|
bfq_bfqq_resume_state(bfqq, bfqd, bic, false);
|
||||||
|
bfqq->waker_bfqq = waker_bfqq;
|
||||||
|
bfqq->tentative_waker_bfqq = NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the waker queue disappears, then new_bfqq->waker_bfqq must be
|
||||||
|
* reset. So insert new_bfqq into the
|
||||||
|
* woken_list of the waker. See
|
||||||
|
* bfq_check_waker for details.
|
||||||
|
*/
|
||||||
|
if (waker_bfqq)
|
||||||
|
hlist_add_head(&bfqq->woken_list_node,
|
||||||
|
&bfqq->waker_bfqq->woken_list);
|
||||||
|
|
||||||
|
return bfqq;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If needed, init rq, allocate bfq data structures associated with
|
* If needed, init rq, allocate bfq data structures associated with
|
||||||
* rq, and increment reference counters in the destination bfq_queue
|
* rq, and increment reference counters in the destination bfq_queue
|
||||||
@ -6876,7 +6928,6 @@ static struct bfq_queue *bfq_init_rq(struct request *rq)
|
|||||||
struct bfq_io_cq *bic;
|
struct bfq_io_cq *bic;
|
||||||
const int is_sync = rq_is_sync(rq);
|
const int is_sync = rq_is_sync(rq);
|
||||||
struct bfq_queue *bfqq;
|
struct bfq_queue *bfqq;
|
||||||
bool new_queue = false;
|
|
||||||
unsigned int a_idx = bfq_actuator_index(bfqd, bio);
|
unsigned int a_idx = bfq_actuator_index(bfqd, bio);
|
||||||
|
|
||||||
if (unlikely(!rq->elv.icq))
|
if (unlikely(!rq->elv.icq))
|
||||||
@ -6893,53 +6944,9 @@ static struct bfq_queue *bfq_init_rq(struct request *rq)
|
|||||||
return RQ_BFQQ(rq);
|
return RQ_BFQQ(rq);
|
||||||
|
|
||||||
bic = icq_to_bic(rq->elv.icq);
|
bic = icq_to_bic(rq->elv.icq);
|
||||||
|
|
||||||
bfq_check_ioprio_change(bic, bio);
|
bfq_check_ioprio_change(bic, bio);
|
||||||
|
|
||||||
bfq_bic_update_cgroup(bic, bio);
|
bfq_bic_update_cgroup(bic, bio);
|
||||||
|
bfqq = bfq_get_bfqq_handle_split(bfqd, bic, bio, a_idx, is_sync);
|
||||||
bfqq = bfq_get_bfqq_handle_split(bfqd, bic, bio, false, is_sync,
|
|
||||||
&new_queue);
|
|
||||||
|
|
||||||
if (likely(!new_queue)) {
|
|
||||||
/* If the queue was seeky for too long, break it apart. */
|
|
||||||
if (bfq_bfqq_coop(bfqq) && bfq_bfqq_split_coop(bfqq) &&
|
|
||||||
!bic->bfqq_data[a_idx].stably_merged) {
|
|
||||||
struct bfq_queue *waker_bfqq = bfq_waker_bfqq(bfqq);
|
|
||||||
|
|
||||||
/* Update bic before losing reference to bfqq */
|
|
||||||
if (bfq_bfqq_in_large_burst(bfqq))
|
|
||||||
bic->bfqq_data[a_idx].saved_in_large_burst =
|
|
||||||
true;
|
|
||||||
|
|
||||||
bfqq = bfq_split_bfqq(bic, bfqq);
|
|
||||||
if (!bfqq) {
|
|
||||||
bfqq = bfq_get_bfqq_handle_split(bfqd, bic, bio,
|
|
||||||
true, is_sync,
|
|
||||||
NULL);
|
|
||||||
if (likely(bfqq != &bfqd->oom_bfqq)) {
|
|
||||||
bfq_bfqq_resume_state(bfqq, bfqd, bic,
|
|
||||||
false);
|
|
||||||
bfqq->waker_bfqq = waker_bfqq;
|
|
||||||
bfqq->tentative_waker_bfqq = NULL;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If the waker queue disappears, then
|
|
||||||
* new_bfqq->waker_bfqq must be
|
|
||||||
* reset. So insert new_bfqq into the
|
|
||||||
* woken_list of the waker. See
|
|
||||||
* bfq_check_waker for details.
|
|
||||||
*/
|
|
||||||
if (waker_bfqq)
|
|
||||||
hlist_add_head(
|
|
||||||
&bfqq->woken_list_node,
|
|
||||||
&bfqq->waker_bfqq->woken_list);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
bfq_bfqq_resume_state(bfqq, bfqd, bic, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bfqq_request_allocated(bfqq);
|
bfqq_request_allocated(bfqq);
|
||||||
bfqq->ref++;
|
bfqq->ref++;
|
||||||
|
Loading…
Reference in New Issue
Block a user