mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
block, bfq: don't change ioprio class for a bfq_queue on a service tree
On each deactivation or re-scheduling (after being served) of a bfq_queue, BFQ invokes the function __bfq_entity_update_weight_prio(), to perform pending updates of ioprio, weight and ioprio class for the bfq_queue. BFQ also invokes this function on I/O-request dispatches, to raise or lower weights more quickly when needed, thereby improving latency. However, the entity representing the bfq_queue may be on the active (sub)tree of a service tree when this happens, and, although with a very low probability, the bfq_queue may happen to also have a pending change of its ioprio class. If both conditions hold when __bfq_entity_update_weight_prio() is invoked, then the entity moves to a sort of hybrid state: the new service tree for the entity, as returned by bfq_entity_service_tree(), differs from service tree on which the entity still is. The functions that handle activations and deactivations of entities do not cope with such a hybrid state (and would need to become more complex to cope). This commit addresses this issue by just making __bfq_entity_update_weight_prio() not perform also a possible pending change of ioprio class, when invoked on an I/O-request dispatch for a bfq_queue. Such a change is thus postponed to when __bfq_entity_update_weight_prio() is invoked on deactivation or re-scheduling of the bfq_queue. Reported-by: Marco Piazza <[email protected]> Reported-by: Laurentiu Nicola <[email protected]> Signed-off-by: Paolo Valente <[email protected]> Tested-by: Marco Piazza <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
This commit is contained in:
parent
7a69f9c60b
commit
431b17f9d5
3 changed files with 46 additions and 10 deletions
|
|
@ -3483,11 +3483,17 @@ static void bfq_update_wr_data(struct bfq_data *bfqd, struct bfq_queue *bfqq)
|
|||
}
|
||||
}
|
||||
}
|
||||
/* Update weight both if it must be raised and if it must be lowered */
|
||||
/*
|
||||
* To improve latency (for this or other queues), immediately
|
||||
* update weight both if it must be raised and if it must be
|
||||
* lowered. Since, entity may be on some active tree here, and
|
||||
* might have a pending change of its ioprio class, invoke
|
||||
* next function with the last parameter unset (see the
|
||||
* comments on the function).
|
||||
*/
|
||||
if ((entity->weight > entity->orig_weight) != (bfqq->wr_coeff > 1))
|
||||
__bfq_entity_update_weight_prio(
|
||||
bfq_entity_service_tree(entity),
|
||||
entity);
|
||||
__bfq_entity_update_weight_prio(bfq_entity_service_tree(entity),
|
||||
entity, false);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in a new issue