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;
|
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,
|
static int bfq_io_set_weight_legacy(struct cgroup_subsys_state *css,
|
||||||
struct cftype *cftype,
|
struct cftype *cftype,
|
||||||
u64 val)
|
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) {
|
hlist_for_each_entry(blkg, &blkcg->blkg_list, blkcg_node) {
|
||||||
struct bfq_group *bfqg = blkg_to_bfqg(blkg);
|
struct bfq_group *bfqg = blkg_to_bfqg(blkg);
|
||||||
|
|
||||||
if (!bfqg)
|
if (bfqg)
|
||||||
continue;
|
bfq_group_set_weight(bfqg, val);
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
spin_unlock_irq(&blkcg->lock);
|
spin_unlock_irq(&blkcg->lock);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user