blkcg: separate out tg_conf_updated() from tg_set_conf()
tg_set_conf() is largely consisted of parsing and setting the new config and the follow-up application and propagation. This patch separates out the latter part into tg_conf_updated(). This will be used to implement interface for the unified hierarchy. Signed-off-by: Tejun Heo <tj@kernel.org> Signed-off-by: Jens Axboe <axboe@fb.com>
This commit is contained in:
parent
36aa9e5f59
commit
69948b070e
1 changed files with 32 additions and 28 deletions
|
@ -1144,35 +1144,11 @@ static int tg_print_conf_uint(struct seq_file *sf, void *v)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t tg_set_conf(struct kernfs_open_file *of,
|
static void tg_conf_updated(struct throtl_grp *tg)
|
||||||
char *buf, size_t nbytes, loff_t off, bool is_u64)
|
|
||||||
{
|
{
|
||||||
struct blkcg *blkcg = css_to_blkcg(of_css(of));
|
struct throtl_service_queue *sq = &tg->service_queue;
|
||||||
struct blkg_conf_ctx ctx;
|
|
||||||
struct throtl_grp *tg;
|
|
||||||
struct throtl_service_queue *sq;
|
|
||||||
struct blkcg_gq *blkg;
|
|
||||||
struct cgroup_subsys_state *pos_css;
|
struct cgroup_subsys_state *pos_css;
|
||||||
int ret;
|
struct blkcg_gq *blkg;
|
||||||
u64 v;
|
|
||||||
|
|
||||||
ret = blkg_conf_prep(blkcg, &blkcg_policy_throtl, buf, &ctx);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = -EINVAL;
|
|
||||||
if (sscanf(ctx.body, "%llu", &v) != 1)
|
|
||||||
goto out_finish;
|
|
||||||
if (!v)
|
|
||||||
v = -1;
|
|
||||||
|
|
||||||
tg = blkg_to_tg(ctx.blkg);
|
|
||||||
sq = &tg->service_queue;
|
|
||||||
|
|
||||||
if (is_u64)
|
|
||||||
*(u64 *)((void *)tg + of_cft(of)->private) = v;
|
|
||||||
else
|
|
||||||
*(unsigned int *)((void *)tg + of_cft(of)->private) = v;
|
|
||||||
|
|
||||||
throtl_log(&tg->service_queue,
|
throtl_log(&tg->service_queue,
|
||||||
"limit change rbps=%llu wbps=%llu riops=%u wiops=%u",
|
"limit change rbps=%llu wbps=%llu riops=%u wiops=%u",
|
||||||
|
@ -1186,7 +1162,7 @@ static ssize_t tg_set_conf(struct kernfs_open_file *of,
|
||||||
* restrictions in the whole hierarchy and allows them to bypass
|
* restrictions in the whole hierarchy and allows them to bypass
|
||||||
* blk-throttle.
|
* blk-throttle.
|
||||||
*/
|
*/
|
||||||
blkg_for_each_descendant_pre(blkg, pos_css, ctx.blkg)
|
blkg_for_each_descendant_pre(blkg, pos_css, tg_to_blkg(tg))
|
||||||
tg_update_has_rules(blkg_to_tg(blkg));
|
tg_update_has_rules(blkg_to_tg(blkg));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1204,7 +1180,35 @@ static ssize_t tg_set_conf(struct kernfs_open_file *of,
|
||||||
tg_update_disptime(tg);
|
tg_update_disptime(tg);
|
||||||
throtl_schedule_next_dispatch(sq->parent_sq, true);
|
throtl_schedule_next_dispatch(sq->parent_sq, true);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t tg_set_conf(struct kernfs_open_file *of,
|
||||||
|
char *buf, size_t nbytes, loff_t off, bool is_u64)
|
||||||
|
{
|
||||||
|
struct blkcg *blkcg = css_to_blkcg(of_css(of));
|
||||||
|
struct blkg_conf_ctx ctx;
|
||||||
|
struct throtl_grp *tg;
|
||||||
|
int ret;
|
||||||
|
u64 v;
|
||||||
|
|
||||||
|
ret = blkg_conf_prep(blkcg, &blkcg_policy_throtl, buf, &ctx);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = -EINVAL;
|
||||||
|
if (sscanf(ctx.body, "%llu", &v) != 1)
|
||||||
|
goto out_finish;
|
||||||
|
if (!v)
|
||||||
|
v = -1;
|
||||||
|
|
||||||
|
tg = blkg_to_tg(ctx.blkg);
|
||||||
|
|
||||||
|
if (is_u64)
|
||||||
|
*(u64 *)((void *)tg + of_cft(of)->private) = v;
|
||||||
|
else
|
||||||
|
*(unsigned int *)((void *)tg + of_cft(of)->private) = v;
|
||||||
|
|
||||||
|
tg_conf_updated(tg);
|
||||||
ret = 0;
|
ret = 0;
|
||||||
out_finish:
|
out_finish:
|
||||||
blkg_conf_finish(&ctx);
|
blkg_conf_finish(&ctx);
|
||||||
|
|
Loading…
Reference in a new issue