Lines Matching refs:sch
72 struct Qdisc *sch; /* The Classic queue (C-queue) */
208 static void dualpi2_calculate_c_protection(struct Qdisc *sch,
213 q->c_protection_init = (s32)psched_mtu(qdisc_dev(sch)) *
249 * delay, eventually resulting in taildrop behavior once sch->limit is
282 static bool must_drop(struct Qdisc *sch, struct dualpi2_sched_data *q,
289 if (sch->qstats.backlog < 2 * psched_mtu(qdisc_dev(sch)))
355 if (TC_H_MAJ(skb->priority) == q->sch->handle &&
385 static int dualpi2_enqueue_skb(struct sk_buff *skb, struct Qdisc *sch,
388 struct dualpi2_sched_data *q = qdisc_priv(sch);
391 if (unlikely(qdisc_qlen(sch) >= sch->limit) ||
393 qdisc_qstats_overlimit(sch);
396 return qdisc_drop_reason(skb, sch, to_free,
400 if (q->drop_early && must_drop(sch, q, skb)) {
401 qdisc_drop_reason(skb, sch, to_free,
412 if (qdisc_qlen(sch) > q->maxq)
413 q->maxq = qdisc_qlen(sch);
420 ++sch->q.qlen;
421 qdisc_qstats_backlog_inc(sch, skb);
430 return qdisc_enqueue_tail(skb, sch);
441 static int dualpi2_qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch,
444 struct dualpi2_sched_data *q = qdisc_priv(sch);
450 qdisc_qstats_drop(sch);
464 return qdisc_drop(skb, sch, to_free);
481 err = dualpi2_enqueue_skb(nskb, sch, to_free);
499 qdisc_tree_reduce_backlog(sch, -cnt, -byte_len);
503 return dualpi2_enqueue_skb(skb, sch, to_free);
516 static struct sk_buff *dequeue_packet(struct Qdisc *sch,
525 c_len = qdisc_qlen(sch) - qdisc_qlen(q->l_queue);
534 --sch->q.qlen;
537 skb = __qdisc_dequeue_head(&sch->q);
538 WRITE_ONCE(q->c_head_ts, head_enqueue_time(sch));
547 qdisc_qstats_backlog_dec(sch, skb);
575 struct Qdisc *sch, enum skb_drop_reason reason)
580 qdisc_qstats_drop(sch);
583 static struct sk_buff *dualpi2_qdisc_dequeue(struct Qdisc *sch)
585 struct dualpi2_sched_data *q = qdisc_priv(sch);
592 while ((skb = dequeue_packet(sch, q, &credit_change, now))) {
593 if (!q->drop_early && must_drop(sch, q, skb)) {
594 drop_and_retry(q, skb, sch,
601 drop_and_retry(q, skb, sch,
607 qdisc_bstats_update(sch, skb);
612 qdisc_tree_reduce_backlog(sch, q->deferred_drops_cnt,
639 static u32 calculate_probability(struct Qdisc *sch)
641 struct dualpi2_sched_data *q = qdisc_priv(sch);
677 static u32 get_memory_limit(struct Qdisc *sch, u32 limit)
682 u64 memlim = mul_u32_u32(limit, 2 * psched_mtu(qdisc_dev(sch)));
712 struct Qdisc *sch = q->sch;
716 root_lock = qdisc_lock(qdisc_root_sleeping(sch));
719 WRITE_ONCE(q->pi2_prob, calculate_probability(sch));
758 static int dualpi2_change(struct Qdisc *sch, struct nlattr *opt,
780 q = qdisc_priv(sch);
781 sch_tree_lock(sch);
786 WRITE_ONCE(sch->limit, limit);
787 WRITE_ONCE(q->memory_limit, get_memory_limit(sch, limit));
855 dualpi2_calculate_c_protection(sch, q, wc);
870 old_qlen = qdisc_qlen(sch);
871 old_backlog = sch->qstats.backlog;
872 while (qdisc_qlen(sch) > sch->limit ||
874 struct sk_buff *skb = qdisc_dequeue_internal(sch, true);
877 qdisc_qstats_backlog_dec(sch, skb);
878 rtnl_qdisc_drop(skb, sch);
880 qdisc_tree_reduce_backlog(sch, old_qlen - qdisc_qlen(sch),
881 old_backlog - sch->qstats.backlog);
883 sch_tree_unlock(sch);
888 static void dualpi2_reset_default(struct Qdisc *sch)
890 struct dualpi2_sched_data *q = qdisc_priv(sch);
892 q->sch->limit = 10000; /* Max 125ms at 1Gbps */
893 q->memory_limit = get_memory_limit(sch, q->sch->limit);
903 dualpi2_calculate_c_protection(q->sch, q, 10); /* wc=10%, wl=90% */
913 static int dualpi2_init(struct Qdisc *sch, struct nlattr *opt,
916 struct dualpi2_sched_data *q = qdisc_priv(sch);
919 q->l_queue = qdisc_create_dflt(sch->dev_queue, &pfifo_qdisc_ops,
920 TC_H_MAKE(sch->handle, 1), extack);
924 err = tcf_block_get(&q->tcf_block, &q->tcf_filters, sch, extack);
928 q->sch = sch;
929 dualpi2_reset_default(sch);
933 err = dualpi2_change(sch, opt, extack);
944 static int dualpi2_dump(struct Qdisc *sch, struct sk_buff *skb)
946 struct dualpi2_sched_data *q = qdisc_priv(sch);
959 (nla_put_u32(skb, TCA_DUALPI2_LIMIT, READ_ONCE(sch->limit)) ||
986 (nla_put_u32(skb, TCA_DUALPI2_LIMIT, READ_ONCE(sch->limit)) ||
1020 static int dualpi2_dump_stats(struct Qdisc *sch, struct gnet_dump *d)
1022 struct dualpi2_sched_data *q = qdisc_priv(sch);
1047 static void dualpi2_reset(struct Qdisc *sch)
1049 struct dualpi2_sched_data *q = qdisc_priv(sch);
1051 qdisc_reset_queue(sch);
1066 static void dualpi2_destroy(struct Qdisc *sch)
1068 struct dualpi2_sched_data *q = qdisc_priv(sch);
1077 static struct Qdisc *dualpi2_leaf(struct Qdisc *sch, unsigned long arg)
1082 static unsigned long dualpi2_find(struct Qdisc *sch, u32 classid)
1087 static unsigned long dualpi2_bind(struct Qdisc *sch, unsigned long parent,
1097 static struct tcf_block *dualpi2_tcf_block(struct Qdisc *sch, unsigned long cl,
1100 struct dualpi2_sched_data *q = qdisc_priv(sch);
1107 static void dualpi2_walk(struct Qdisc *sch, struct qdisc_walker *arg)
1120 if (arg->fn(sch, i + 1, arg) < 0) {