From: Zbigniew Jędrzejewski-Szmek Date: Wed, 10 Nov 2021 10:37:15 +0000 (+0100) Subject: core/cgroup: use helper macro for bfq conversion X-Git-Tag: v250-rc1~46^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=311822ac28c99e2fb0e25286bdb72c9188314a66;p=thirdparty%2Fsystemd.git core/cgroup: use helper macro for bfq conversion As suggested in https://github.com/systemd/systemd/pull/20522#discussion_r696699984. --- diff --git a/src/core/cgroup.c b/src/core/cgroup.c index 7d4d5653432..fa397ba8498 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -1206,9 +1206,21 @@ static int cgroup_apply_devices(Unit *u) { return r; } +/* Convert the normal io.weight value to io.bfq.weight */ +#define BFQ_WEIGHT(weight) \ + (weight <= CGROUP_WEIGHT_DEFAULT ? \ + CGROUP_BFQ_WEIGHT_DEFAULT - (CGROUP_WEIGHT_DEFAULT - weight) * (CGROUP_BFQ_WEIGHT_DEFAULT - CGROUP_BFQ_WEIGHT_MIN) / (CGROUP_WEIGHT_DEFAULT - CGROUP_WEIGHT_MIN) : \ + CGROUP_BFQ_WEIGHT_DEFAULT + (weight - CGROUP_WEIGHT_DEFAULT) * (CGROUP_BFQ_WEIGHT_MAX - CGROUP_BFQ_WEIGHT_DEFAULT) / (CGROUP_WEIGHT_MAX - CGROUP_WEIGHT_DEFAULT)) + +assert_cc(BFQ_WEIGHT(1) == 1); +assert_cc(BFQ_WEIGHT(50) == 50); +assert_cc(BFQ_WEIGHT(100) == 100); +assert_cc(BFQ_WEIGHT(500) == 136); +assert_cc(BFQ_WEIGHT(5000) == 545); +assert_cc(BFQ_WEIGHT(10000) == 1000); + static void set_io_weight(Unit *u, uint64_t weight) { char buf[STRLEN("default \n")+DECIMAL_STR_MAX(uint64_t)]; - uint64_t bfq_weight; assert(u); @@ -1216,12 +1228,7 @@ static void set_io_weight(Unit *u, uint64_t weight) { * See also: https://github.com/systemd/systemd/pull/13335 and * https://github.com/torvalds/linux/commit/65752aef0a407e1ef17ec78a7fc31ba4e0b360f9. * The range is 1..1000 apparently, and the default is 100. */ - if (weight <= CGROUP_WEIGHT_DEFAULT) - bfq_weight = CGROUP_BFQ_WEIGHT_DEFAULT - (CGROUP_WEIGHT_DEFAULT - weight) * (CGROUP_BFQ_WEIGHT_DEFAULT - CGROUP_BFQ_WEIGHT_MIN) / (CGROUP_WEIGHT_DEFAULT - CGROUP_WEIGHT_MIN); - else - bfq_weight = CGROUP_BFQ_WEIGHT_DEFAULT + (weight - CGROUP_WEIGHT_DEFAULT) * (CGROUP_BFQ_WEIGHT_MAX - CGROUP_BFQ_WEIGHT_DEFAULT) / (CGROUP_WEIGHT_MAX - CGROUP_WEIGHT_DEFAULT); - - xsprintf(buf, "%" PRIu64 "\n", bfq_weight); + xsprintf(buf, "%" PRIu64 "\n", BFQ_WEIGHT(weight)); (void) set_attribute_and_warn(u, "io", "io.bfq.weight", buf); xsprintf(buf, "default %" PRIu64 "\n", weight); @@ -1230,20 +1237,11 @@ static void set_io_weight(Unit *u, uint64_t weight) { static void set_blkio_weight(Unit *u, uint64_t weight) { char buf[STRLEN("\n")+DECIMAL_STR_MAX(uint64_t)]; - uint64_t bfq_weight; assert(u); - /* FIXME: drop this when distro kernels properly support BFQ through "io.weight" - * See also: https://github.com/systemd/systemd/pull/13335 and - * https://github.com/torvalds/linux/commit/65752aef0a407e1ef17ec78a7fc31ba4e0b360f9. - * The range is 1..1000 apparently, and the default is 100. */ - if (weight <= CGROUP_BLKIO_WEIGHT_DEFAULT) - bfq_weight = CGROUP_BFQ_WEIGHT_DEFAULT - (CGROUP_BLKIO_WEIGHT_DEFAULT - weight) * (CGROUP_BFQ_WEIGHT_DEFAULT - CGROUP_BFQ_WEIGHT_MIN) / (CGROUP_BLKIO_WEIGHT_DEFAULT - CGROUP_BLKIO_WEIGHT_MIN); - else - bfq_weight = CGROUP_BFQ_WEIGHT_DEFAULT + (weight - CGROUP_BLKIO_WEIGHT_DEFAULT) * (CGROUP_BFQ_WEIGHT_MAX - CGROUP_BFQ_WEIGHT_DEFAULT) / (CGROUP_BLKIO_WEIGHT_MAX - CGROUP_BLKIO_WEIGHT_DEFAULT); - - xsprintf(buf, "%" PRIu64 "\n", bfq_weight); + /* FIXME: see comment in set_io_weight(). */ + xsprintf(buf, "%" PRIu64 "\n", BFQ_WEIGHT(weight)); (void) set_attribute_and_warn(u, "blkio", "blkio.bfq.weight", buf); xsprintf(buf, "%" PRIu64 "\n", weight);