Message ID | 7a4f1b1b0f67bb02d0caadae808c1a89413c202d.1479161136.git.shli@fb.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, Nov 14, 2016 at 02:22:10PM -0800, Shaohua Li wrote: > each queue will have a state machine. Initially queue is in LIMIT_HIGH > state, which means all cgroups will be throttled according to their high > limit. After all cgroups with high limit cross the limit, the queue state > gets upgraded to LIMIT_MAX state. > cgroups without high limit will use max limit for their high limit. Haven't looked at the actual mechanism yet so please correct me if I'm getting it wrong but at least the above explanation reads incorrect. Shouldn't max limits applied regardless of whether other cgroups are above high or not? Thanks.
On Tue, Nov 22, 2016 at 03:16:43PM -0500, Tejun Heo wrote: > On Mon, Nov 14, 2016 at 02:22:10PM -0800, Shaohua Li wrote: > > each queue will have a state machine. Initially queue is in LIMIT_HIGH > > state, which means all cgroups will be throttled according to their high > > limit. After all cgroups with high limit cross the limit, the queue state > > gets upgraded to LIMIT_MAX state. > > cgroups without high limit will use max limit for their high limit. > > Haven't looked at the actual mechanism yet so please correct me if I'm > getting it wrong but at least the above explanation reads incorrect. > Shouldn't max limits applied regardless of whether other cgroups are > above high or not? That's true. Since the max limit is higher than high limit (the interface patch 2 has the check), if cgroup is throttled according to high limit, max limit is respected too. Thanks, Shaohua -- To unsubscribe from this list: send the line "unsubscribe linux-block" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/block/blk-throttle.c b/block/blk-throttle.c index a564215..ec53671 100644 --- a/block/blk-throttle.c +++ b/block/blk-throttle.c @@ -208,12 +208,29 @@ static struct throtl_data *sq_to_td(struct throtl_service_queue *sq) static uint64_t tg_bps_limit(struct throtl_grp *tg, int rw) { - return tg->bps[rw][tg->td->limit_index]; + struct blkcg_gq *blkg = tg_to_blkg(tg); + uint64_t ret; + + if (cgroup_subsys_on_dfl(io_cgrp_subsys) && !blkg->parent) + return -1; + ret = tg->bps[rw][tg->td->limit_index]; + if (ret == -1 && tg->td->limit_index == LIMIT_HIGH) + return tg->bps[rw][LIMIT_MAX]; + + return ret; } static unsigned int tg_iops_limit(struct throtl_grp *tg, int rw) { - return tg->iops[rw][tg->td->limit_index]; + struct blkcg_gq *blkg = tg_to_blkg(tg); + unsigned int ret; + + if (cgroup_subsys_on_dfl(io_cgrp_subsys) && !blkg->parent) + return -1; + ret = tg->iops[rw][tg->td->limit_index]; + if (ret == -1 && tg->td->limit_index == LIMIT_HIGH) + return tg->iops[rw][LIMIT_MAX]; + return ret; } /**
each queue will have a state machine. Initially queue is in LIMIT_HIGH state, which means all cgroups will be throttled according to their high limit. After all cgroups with high limit cross the limit, the queue state gets upgraded to LIMIT_MAX state. cgroups without high limit will use max limit for their high limit. Signed-off-by: Shaohua Li <shli@fb.com> --- block/blk-throttle.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-)