bfq: Extract bfq_group_set_weight from bfq_io_set_weight_legacy
This function will be useful when we update weight from the soon-coming per-device interface. Signed-off-by: Fam Zheng <zhengfeiran@bytedance.com> Reviewed-by: Paolo Valente <paolo.valente@linaro.org> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
e9d3c866bf
commit
5ff047e328
@ -919,6 +919,36 @@ static int bfq_io_show_weight(struct seq_file *sf, void *v)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void bfq_group_set_weight(struct bfq_group *bfqg, u64 weight)
|
||||
{
|
||||
/*
|
||||
* Setting the prio_changed flag of the entity
|
||||
* to 1 with new_weight == weight would re-set
|
||||
* the value of the weight to its ioprio mapping.
|
||||
* Set the flag only if necessary.
|
||||
*/
|
||||
if ((unsigned short)weight != bfqg->entity.new_weight) {
|
||||
bfqg->entity.new_weight = (unsigned short)weight;
|
||||
/*
|
||||
* Make sure that the above new value has been
|
||||
* stored in bfqg->entity.new_weight before
|
||||
* setting the prio_changed flag. In fact,
|
||||
* this flag may be read asynchronously (in
|
||||
* critical sections protected by a different
|
||||
* lock than that held here), and finding this
|
||||
* flag set may cause the execution of the code
|
||||
* for updating parameters whose value may
|
||||
* depend also on bfqg->entity.new_weight (in
|
||||
* __bfq_entity_update_weight_prio).
|
||||
* This barrier makes sure that the new value
|
||||
* of bfqg->entity.new_weight is correctly
|
||||
* seen in that code.
|
||||
*/
|
||||
smp_wmb();
|
||||
bfqg->entity.prio_changed = 1;
|
||||
}
|
||||
}
|
||||
|
||||
static int bfq_io_set_weight_legacy(struct cgroup_subsys_state *css,
|
||||
struct cftype *cftype,
|
||||
u64 val)
|
||||
@ -937,34 +967,8 @@ static int bfq_io_set_weight_legacy(struct cgroup_subsys_state *css,
|
||||
hlist_for_each_entry(blkg, &blkcg->blkg_list, blkcg_node) {
|
||||
struct bfq_group *bfqg = blkg_to_bfqg(blkg);
|
||||
|
||||
if (!bfqg)
|
||||
continue;
|
||||
/*
|
||||
* Setting the prio_changed flag of the entity
|
||||
* to 1 with new_weight == weight would re-set
|
||||
* the value of the weight to its ioprio mapping.
|
||||
* Set the flag only if necessary.
|
||||
*/
|
||||
if ((unsigned short)val != bfqg->entity.new_weight) {
|
||||
bfqg->entity.new_weight = (unsigned short)val;
|
||||
/*
|
||||
* Make sure that the above new value has been
|
||||
* stored in bfqg->entity.new_weight before
|
||||
* setting the prio_changed flag. In fact,
|
||||
* this flag may be read asynchronously (in
|
||||
* critical sections protected by a different
|
||||
* lock than that held here), and finding this
|
||||
* flag set may cause the execution of the code
|
||||
* for updating parameters whose value may
|
||||
* depend also on bfqg->entity.new_weight (in
|
||||
* __bfq_entity_update_weight_prio).
|
||||
* This barrier makes sure that the new value
|
||||
* of bfqg->entity.new_weight is correctly
|
||||
* seen in that code.
|
||||
*/
|
||||
smp_wmb();
|
||||
bfqg->entity.prio_changed = 1;
|
||||
}
|
||||
if (bfqg)
|
||||
bfq_group_set_weight(bfqg, val);
|
||||
}
|
||||
spin_unlock_irq(&blkcg->lock);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user