Lines Matching refs:sch

92 static inline int gred_wred_mode_check(struct Qdisc *sch)
94 struct gred_sched *table = qdisc_priv(sch);
115 struct Qdisc *sch)
118 return sch->qstats.backlog;
165 static int gred_enqueue(struct sk_buff *skb, struct Qdisc *sch,
169 struct gred_sched *t = qdisc_priv(sch);
182 if (likely(sch->qstats.backlog + qdisc_pkt_len(skb) <=
183 sch->limit))
184 return qdisc_enqueue_tail(skb, sch);
214 gred_backlog(t, q, sch));
227 qdisc_qstats_overlimit(sch);
237 qdisc_qstats_overlimit(sch);
247 if (gred_backlog(t, q, sch) + qdisc_pkt_len(skb) <= q->limit) {
249 return qdisc_enqueue_tail(skb, sch);
254 return qdisc_drop_reason(skb, sch, to_free, SKB_DROP_REASON_QDISC_OVERLIMIT);
257 qdisc_drop_reason(skb, sch, to_free, SKB_DROP_REASON_QDISC_CONGESTED);
261 static struct sk_buff *gred_dequeue(struct Qdisc *sch)
264 struct gred_sched *t = qdisc_priv(sch);
266 skb = qdisc_dequeue_head(sch);
279 if (!sch->qstats.backlog)
293 static void gred_reset(struct Qdisc *sch)
296 struct gred_sched *t = qdisc_priv(sch);
298 qdisc_reset_queue(sch);
311 static void gred_offload(struct Qdisc *sch, enum tc_gred_command command)
313 struct gred_sched *table = qdisc_priv(sch);
314 struct net_device *dev = qdisc_dev(sch);
322 opt->handle = sch->handle;
323 opt->parent = sch->parent;
348 opt->set.qstats = &sch->qstats;
354 static int gred_offload_dump_stats(struct Qdisc *sch)
356 struct gred_sched *table = qdisc_priv(sch);
367 hw_stats->handle = sch->handle;
368 hw_stats->parent = sch->parent;
376 ret = qdisc_offload_dump_helper(sch, TC_SETUP_QDISC_GRED, hw_stats);
380 sch_tree_lock(sch);
390 sch->qstats.qlen += hw_stats->stats.qstats[i].qlen;
391 sch->qstats.backlog += hw_stats->stats.qstats[i].backlog;
392 sch->qstats.drops += hw_stats->stats.qstats[i].drops;
393 sch->qstats.requeues += hw_stats->stats.qstats[i].requeues;
394 sch->qstats.overlimits += hw_stats->stats.qstats[i].overlimits;
396 _bstats_update(&sch->bstats, bytes, packets);
397 sch_tree_unlock(sch);
408 static int gred_change_table_def(struct Qdisc *sch, struct nlattr *dps,
411 struct gred_sched *table = qdisc_priv(sch);
439 sch_tree_lock(sch);
450 sch_tree_unlock(sch);
455 if (gred_wred_mode_check(sch))
477 gred_offload(sch, TC_GRED_REPLACE);
481 static inline int gred_change_vq(struct Qdisc *sch, int dp,
487 struct gred_sched *table = qdisc_priv(sch);
505 if (ctl->limit > sch->limit)
506 q->limit = sch->limit;
642 static int gred_change(struct Qdisc *sch, struct nlattr *opt,
645 struct gred_sched *table = qdisc_priv(sch);
660 sch->limit = nla_get_u32(tb[TCA_GRED_LIMIT]);
661 return gred_change_table_def(sch, tb[TCA_GRED_DPS], extack);
704 sch_tree_lock(sch);
706 err = gred_change_vq(sch, ctl->DP, ctl, prio, stab, max_P, &prealloc,
716 if (gred_wred_mode_check(sch))
720 sch_tree_unlock(sch);
723 gred_offload(sch, TC_GRED_REPLACE);
727 sch_tree_unlock(sch);
732 static int gred_init(struct Qdisc *sch, struct nlattr *opt,
735 struct gred_sched *table = qdisc_priv(sch);
754 sch->limit = nla_get_u32(tb[TCA_GRED_LIMIT]);
756 sch->limit = qdisc_dev(sch)->tx_queue_len
757 * psched_mtu(qdisc_dev(sch));
759 if (qdisc_dev(sch)->netdev_ops->ndo_setup_tc) {
765 return gred_change_table_def(sch, tb[TCA_GRED_DPS], extack);
768 static int gred_dump(struct Qdisc *sch, struct sk_buff *skb)
770 struct gred_sched *table = qdisc_priv(sch);
781 if (gred_offload_dump_stats(sch))
798 if (nla_put_u32(skb, TCA_GRED_LIMIT, sch->limit))
824 opt.backlog = gred_backlog(table, q, sch);
880 gred_backlog(table, q, sch)))
908 static void gred_destroy(struct Qdisc *sch)
910 struct gred_sched *table = qdisc_priv(sch);
917 gred_offload(sch, TC_GRED_DESTROY);