diff mbox

[V5,04/17] blk-throttle: configure bps/iops limit for cgroup in low limit

Message ID 04bae2f6239c13d3160d7c0196c97217c5e4b4c3.1481833017.git.shli@fb.com (mailing list archive)
State New, archived
Headers show

Commit Message

Shaohua Li Dec. 15, 2016, 8:32 p.m. UTC
each queue will have a state machine. Initially queue is in LIMIT_LOW
state, which means all cgroups will be throttled according to their low
limit. After all cgroups with low limit cross the limit, the queue state
gets upgraded to LIMIT_MAX state.
For max limit, cgroup will use the limit configured by user.
For low limit, cgroup will use the minimal between low limit and max
limit configured by user. Last patch already did the convertion.

Signed-off-by: Shaohua Li <shli@fb.com>
---
 block/blk-throttle.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

Comments

Tejun Heo Jan. 9, 2017, 5:35 p.m. UTC | #1
Hello,

On Thu, Dec 15, 2016 at 12:32:55PM -0800, Shaohua Li wrote:
> each queue will have a state machine. Initially queue is in LIMIT_LOW
> state, which means all cgroups will be throttled according to their low
> limit. After all cgroups with low limit cross the limit, the queue state
> gets upgraded to LIMIT_MAX state.

As with the previous patch, I don't think it's correct to default to
MAX for LIMIT_LOW and then enforce it.  Without specific
configuration, a cgroup should always be above below (so, no latency
requirement) and below max (no hard limiting).

Thanks.
diff mbox

Patch

diff --git a/block/blk-throttle.c b/block/blk-throttle.c
index fcc4199..e55bd36 100644
--- a/block/blk-throttle.c
+++ b/block/blk-throttle.c
@@ -212,11 +212,21 @@  static struct throtl_data *sq_to_td(struct throtl_service_queue *sq)
 
 static uint64_t tg_bps_limit(struct throtl_grp *tg, int rw)
 {
+	struct blkcg_gq *blkg = tg_to_blkg(tg);
+	uint64_t ret;
+
+	if (cgroup_subsys_on_dfl(io_cgrp_subsys) && !blkg->parent)
+		return U64_MAX;
 	return tg->bps[rw][tg->td->limit_index];
 }
 
 static unsigned int tg_iops_limit(struct throtl_grp *tg, int rw)
 {
+	struct blkcg_gq *blkg = tg_to_blkg(tg);
+	unsigned int ret;
+
+	if (cgroup_subsys_on_dfl(io_cgrp_subsys) && !blkg->parent)
+		return UINT_MAX;
 	return tg->iops[rw][tg->td->limit_index];
 }