@@ -1912,6 +1912,35 @@ static ssize_t tg_set_max(struct kernfs_open_file *of,
return ret ?: nbytes;
}
+static int tg_print_cg2_weight(struct seq_file *sf, void *v)
+{
+ struct blkcg *blkcg = css_to_blkcg(seq_css(sf));
+ struct throtl_group_data *tgd = blkcg_to_tgd(blkcg);
+
+ seq_printf(sf, "default %u\n", tgd->weight);
+ return tg_print_weight_device(sf, v);
+}
+
+static ssize_t tg_set_cg2_weight(struct kernfs_open_file *of,
+ char *buf, size_t nbytes, loff_t off)
+{
+ char *endp;
+ int ret;
+ u64 v;
+
+ buf = strim(buf);
+
+ /* "WEIGHT" or "default WEIGHT" sets the default weight */
+ v = simple_strtoull(buf, &endp, 0);
+ if (*endp == '\0' || sscanf(buf, "default %llu", &v) == 1) {
+ ret = tg_set_weight(of_css(of), of_cft(of), v);
+ return ret ?: nbytes;
+ }
+
+ /* "MAJ:MIN WEIGHT" */
+ return tg_set_weight_device(of, buf, nbytes, off);
+}
+
static struct cftype throtl_files[] = {
{
.name = "max",
@@ -1919,6 +1948,19 @@ static struct cftype throtl_files[] = {
.seq_show = tg_print_max,
.write = tg_set_max,
},
+ {
+ .name = "throttle.weight",
+ .flags = CFTYPE_NOT_ON_ROOT,
+ .private = offsetof(struct throtl_grp, service_queue.weight),
+ .seq_show = tg_print_cg2_weight,
+ .write = tg_set_cg2_weight,
+ },
+ {
+ .name = "throttle.mode_device",
+ .flags = CFTYPE_ONLY_ON_ROOT,
+ .seq_show = throtl_print_mode_device,
+ .write = tg_set_mode_device,
+ },
{ } /* terminate */
};
Example usage of the cgroup2 interface: $echo "+io" > /sys/fs/cgroup/cgroup.subtree_control set bandwidth based proporation mode $echo "8:0 weight_bw" > /sys/fs/cgroup/io.throttle.mode_device $mkdir /sys/fs/cgroup/test set cgroup weight $echo "8:0 200" > /sys/fs/cgroup/test/io.throttle.weight $echo $$ > /sys/fs/cgroup/test/cgroup.procs Signed-off-by: Shaohua Li <shli@fb.com> --- block/blk-throttle.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+)