Lines Matching +full:len +full:- +full:or +full:- +full:limit
1 // SPDX-License-Identifier: GPL-2.0-or-later
6 * Dmitry Torokhov <dtor@mail.ru> - allow attaching inner qdiscs -
27 -------
32 ------------
36 does not exceed B + R*(t_f-t_i).
42 s_i+....+s_k <= B + R*(t_k - t_i)
45 ----------
55 N(t_* + 0) = N(t_* - 0) - S/R.
69 lat = max ((L-B)/R, (L-M)/P)
73 ------
79 or if the device is not awaken by EOI for some previous packet,
91 rates, use alpha with HZ=1000 :-)
93 With classful TBF, limit is just kept for backwards compatibility.
94 It is passed to the default bfifo qdisc - if the inner qdisc is
95 changed the limit is not effective anymore.
100 u32 limit; /* Maximal length of backlog: bytes */ member
110 s64 t_c; /* Time check-point */
111 struct Qdisc *qdisc; /* Inner qdisc, default - bfifo queue */
123 * len = (time_in_ns * r->rate_bytes_ps) / NSEC_PER_SEC in psched_ns_t2l()
125 u64 len = time_in_ns * r->rate_bytes_ps; in psched_ns_t2l() local
127 do_div(len, NSEC_PER_SEC); in psched_ns_t2l()
129 if (unlikely(r->linklayer == TC_LINKLAYER_ATM)) { in psched_ns_t2l()
130 do_div(len, 53); in psched_ns_t2l()
131 len = len * 48; in psched_ns_t2l()
134 if (len > r->overhead) in psched_ns_t2l()
135 len -= r->overhead; in psched_ns_t2l()
137 len = 0; in psched_ns_t2l()
139 return len; in psched_ns_t2l()
148 if (!tc_can_offload(dev) || !dev->netdev_ops->ndo_setup_tc) in tbf_offload_change()
152 qopt.handle = sch->handle; in tbf_offload_change()
153 qopt.parent = sch->parent; in tbf_offload_change()
154 qopt.replace_params.rate = q->rate; in tbf_offload_change()
155 qopt.replace_params.max_size = q->max_size; in tbf_offload_change()
156 qopt.replace_params.qstats = &sch->qstats; in tbf_offload_change()
158 dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_QDISC_TBF, &qopt); in tbf_offload_change()
166 if (!tc_can_offload(dev) || !dev->netdev_ops->ndo_setup_tc) in tbf_offload_destroy()
170 qopt.handle = sch->handle; in tbf_offload_destroy()
171 qopt.parent = sch->parent; in tbf_offload_destroy()
172 dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_QDISC_TBF, &qopt); in tbf_offload_destroy()
180 qopt.handle = sch->handle; in tbf_offload_dump()
181 qopt.parent = sch->parent; in tbf_offload_dump()
182 qopt.stats.bstats = &sch->bstats; in tbf_offload_dump()
183 qopt.stats.qstats = &sch->qstats; in tbf_offload_dump()
192 .handle = sch->handle, in tbf_offload_graft()
193 .parent = sch->parent, in tbf_offload_graft()
194 .child_handle = new->handle, in tbf_offload_graft()
211 unsigned int len = 0, prev_len = qdisc_pkt_len(skb); in tbf_segment() local
222 qdisc_skb_cb(segs)->pkt_len = segs->len; in tbf_segment()
223 len += segs->len; in tbf_segment()
224 ret = qdisc_enqueue(segs, q->qdisc, to_free); in tbf_segment()
232 sch->q.qlen += nb; in tbf_segment()
234 qdisc_tree_reduce_backlog(sch, 1 - nb, prev_len - len); in tbf_segment()
243 unsigned int len = qdisc_pkt_len(skb); in tbf_enqueue() local
246 if (qdisc_pkt_len(skb) > q->max_size) { in tbf_enqueue()
248 skb_gso_validate_mac_len(skb, q->max_size)) in tbf_enqueue()
252 ret = qdisc_enqueue(skb, q->qdisc, to_free); in tbf_enqueue()
259 sch->qstats.backlog += len; in tbf_enqueue()
260 sch->q.qlen++; in tbf_enqueue()
266 return q->peak.rate_bytes_ps; in tbf_peak_present()
274 skb = q->qdisc->ops->peek(q->qdisc); in tbf_dequeue()
280 unsigned int len = qdisc_pkt_len(skb); in tbf_dequeue() local
283 toks = min_t(s64, now - q->t_c, q->buffer); in tbf_dequeue()
286 ptoks = toks + q->ptokens; in tbf_dequeue()
287 if (ptoks > q->mtu) in tbf_dequeue()
288 ptoks = q->mtu; in tbf_dequeue()
289 ptoks -= (s64) psched_l2t_ns(&q->peak, len); in tbf_dequeue()
291 toks += q->tokens; in tbf_dequeue()
292 if (toks > q->buffer) in tbf_dequeue()
293 toks = q->buffer; in tbf_dequeue()
294 toks -= (s64) psched_l2t_ns(&q->rate, len); in tbf_dequeue()
297 skb = qdisc_dequeue_peeked(q->qdisc); in tbf_dequeue()
301 q->t_c = now; in tbf_dequeue()
302 q->tokens = toks; in tbf_dequeue()
303 q->ptokens = ptoks; in tbf_dequeue()
305 sch->q.qlen--; in tbf_dequeue()
310 qdisc_watchdog_schedule_ns(&q->watchdog, in tbf_dequeue()
311 now + max_t(long, -toks, -ptoks)); in tbf_dequeue()
333 qdisc_reset(q->qdisc); in tbf_reset()
334 q->t_c = ktime_get_ns(); in tbf_reset()
335 q->tokens = q->buffer; in tbf_reset()
336 q->ptokens = q->mtu; in tbf_reset()
337 qdisc_watchdog_cancel(&q->watchdog); in tbf_reset()
341 [TCA_TBF_PARMS] = { .len = sizeof(struct tc_tbf_qopt) },
342 [TCA_TBF_RTAB] = { .type = NLA_BINARY, .len = TC_RTAB_SIZE },
343 [TCA_TBF_PTAB] = { .type = NLA_BINARY, .len = TC_RTAB_SIZE },
370 err = -EINVAL; in tbf_change()
375 if (qopt->rate.linklayer == TC_LINKLAYER_UNAWARE) in tbf_change()
376 qdisc_put_rtab(qdisc_get_rtab(&qopt->rate, in tbf_change()
380 if (qopt->peakrate.linklayer == TC_LINKLAYER_UNAWARE) in tbf_change()
381 qdisc_put_rtab(qdisc_get_rtab(&qopt->peakrate, in tbf_change()
385 buffer = min_t(u64, PSCHED_TICKS2NS(qopt->buffer), ~0U); in tbf_change()
386 mtu = min_t(u64, PSCHED_TICKS2NS(qopt->mtu), ~0U); in tbf_change()
390 psched_ratecfg_precompute(&rate, &qopt->rate, rate64); in tbf_change()
399 if (qopt->peakrate.rate) { in tbf_change()
402 psched_ratecfg_precompute(&peak, &qopt->peakrate, prate64); in tbf_change()
404 pr_warn_ratelimited("sch_tbf: peakrate %llu is lower than or equals to rate %llu !\n", in tbf_change()
406 err = -EINVAL; in tbf_change()
423 max_size, qdisc_dev(sch)->name, in tbf_change()
427 err = -EINVAL; in tbf_change()
431 if (q->qdisc != &noop_qdisc) { in tbf_change()
432 err = fifo_set_limit(q->qdisc, qopt->limit); in tbf_change()
435 } else if (qopt->limit > 0) { in tbf_change()
436 child = fifo_create_dflt(sch, &bfifo_qdisc_ops, qopt->limit, in tbf_change()
449 qdisc_tree_flush_backlog(q->qdisc); in tbf_change()
450 old = q->qdisc; in tbf_change()
451 q->qdisc = child; in tbf_change()
453 q->limit = qopt->limit; in tbf_change()
455 q->mtu = mtu; in tbf_change()
457 q->mtu = PSCHED_TICKS2NS(qopt->mtu); in tbf_change()
458 q->max_size = max_size; in tbf_change()
460 q->buffer = buffer; in tbf_change()
462 q->buffer = PSCHED_TICKS2NS(qopt->buffer); in tbf_change()
463 q->tokens = q->buffer; in tbf_change()
464 q->ptokens = q->mtu; in tbf_change()
466 memcpy(&q->rate, &rate, sizeof(struct psched_ratecfg)); in tbf_change()
467 memcpy(&q->peak, &peak, sizeof(struct psched_ratecfg)); in tbf_change()
483 qdisc_watchdog_init(&q->watchdog, sch); in tbf_init()
484 q->qdisc = &noop_qdisc; in tbf_init()
487 return -EINVAL; in tbf_init()
489 q->t_c = ktime_get_ns(); in tbf_init()
498 qdisc_watchdog_cancel(&q->watchdog); in tbf_destroy()
500 qdisc_put(q->qdisc); in tbf_destroy()
518 opt.limit = q->limit; in tbf_dump()
519 psched_ratecfg_getrate(&opt.rate, &q->rate); in tbf_dump()
521 psched_ratecfg_getrate(&opt.peakrate, &q->peak); in tbf_dump()
524 opt.mtu = PSCHED_NS2TICKS(q->mtu); in tbf_dump()
525 opt.buffer = PSCHED_NS2TICKS(q->buffer); in tbf_dump()
528 if (q->rate.rate_bytes_ps >= (1ULL << 32) && in tbf_dump()
529 nla_put_u64_64bit(skb, TCA_TBF_RATE64, q->rate.rate_bytes_ps, in tbf_dump()
533 q->peak.rate_bytes_ps >= (1ULL << 32) && in tbf_dump()
534 nla_put_u64_64bit(skb, TCA_TBF_PRATE64, q->peak.rate_bytes_ps, in tbf_dump()
542 return -1; in tbf_dump()
550 tcm->tcm_handle |= TC_H_MIN(1); in tbf_dump_class()
551 tcm->tcm_info = q->qdisc->handle; in tbf_dump_class()
564 *old = qdisc_replace(sch, new, &q->qdisc); in tbf_graft()
573 return q->qdisc; in tbf_leaf()
583 if (!walker->stop) { in tbf_walk()