Lines Matching defs:qdisc

16 static bool nfp_abm_qdisc_is_red(struct nfp_qdisc *qdisc)
18 return qdisc->type == NFP_QDISC_RED || qdisc->type == NFP_QDISC_GRED;
21 static bool nfp_abm_qdisc_child_valid(struct nfp_qdisc *qdisc, unsigned int id)
23 return qdisc->children[id] &&
24 qdisc->children[id] != NFP_QDISC_UNTRACKED;
45 nfp_abm_stats_update_red(struct nfp_abm_link *alink, struct nfp_qdisc *qdisc,
52 if (!qdisc->offloaded)
55 for (i = 0; i < qdisc->red.num_bands; i++) {
57 &qdisc->red.band[i].stats);
63 &qdisc->red.band[i].xstats);
71 nfp_abm_stats_update_mq(struct nfp_abm_link *alink, struct nfp_qdisc *qdisc)
75 if (qdisc->type != NFP_QDISC_MQ)
79 if (nfp_abm_qdisc_child_valid(qdisc, i))
80 nfp_abm_stats_update_red(alink, qdisc->children[i], i);
106 nfp_abm_qdisc_unlink_children(struct nfp_qdisc *qdisc,
112 if (nfp_abm_qdisc_child_valid(qdisc, i)) {
113 qdisc->children[i]->use_cnt--;
114 qdisc->children[i] = NULL;
119 nfp_abm_qdisc_offload_stop(struct nfp_abm_link *alink, struct nfp_qdisc *qdisc)
123 /* Don't complain when qdisc is getting unlinked */
124 if (qdisc->use_cnt)
126 qdisc->handle);
128 if (!nfp_abm_qdisc_is_red(qdisc))
131 for (i = 0; i < qdisc->red.num_bands; i++) {
132 qdisc->red.band[i].stats.backlog_pkts = 0;
133 qdisc->red.band[i].stats.backlog_bytes = 0;
146 * been reported back to the tc qdisc stats.
173 nfp_abm_stats_init(struct nfp_abm_link *alink, struct nfp_qdisc *qdisc,
179 for (i = 0; i < qdisc->red.num_bands; i++) {
181 &qdisc->red.band[i].prev_stats,
182 &qdisc->red.band[i].prev_xstats);
191 nfp_abm_offload_compile_red(struct nfp_abm_link *alink, struct nfp_qdisc *qdisc,
197 good_red = qdisc->type == NFP_QDISC_RED &&
198 qdisc->params_ok &&
199 qdisc->use_cnt == 1 &&
201 !qdisc->children[0];
202 good_gred = qdisc->type == NFP_QDISC_GRED &&
203 qdisc->params_ok &&
204 qdisc->use_cnt == 1;
205 qdisc->offload_mark = good_red || good_gred;
208 if (qdisc->offload_mark && !qdisc->offloaded)
209 if (nfp_abm_stats_init(alink, qdisc, queue))
210 qdisc->offload_mark = false;
212 if (!qdisc->offload_mark)
219 qdisc->red.band[i].threshold);
220 act = qdisc->red.band[i].ecn ?
227 nfp_abm_offload_compile_mq(struct nfp_abm_link *alink, struct nfp_qdisc *qdisc)
231 qdisc->offload_mark = qdisc->type == NFP_QDISC_MQ;
232 if (!qdisc->offload_mark)
236 struct nfp_qdisc *child = qdisc->children[i];
238 if (!nfp_abm_qdisc_child_valid(qdisc, i))
249 struct nfp_qdisc *qdisc;
261 qdisc = nfp_abm_qdisc_tree_deref_slot(slot);
262 qdisc->offload_mark = false;
270 qdisc = nfp_abm_qdisc_tree_deref_slot(slot);
271 if (!qdisc->offload_mark && qdisc->offloaded)
272 nfp_abm_qdisc_offload_stop(alink, qdisc);
273 qdisc->offloaded = qdisc->offload_mark;
286 struct nfp_qdisc *qdisc)
292 if (!qdisc->use_cnt)
297 if (qdisc->type == NFP_QDISC_MQ &&
298 qdisc == alink->root_qdisc &&
310 if (mq->children[i] == qdisc) {
316 WARN(qdisc->use_cnt != mq_refs, "non-zero qdisc use count: %d (- %d)\n",
317 qdisc->use_cnt, mq_refs);
322 struct nfp_qdisc *qdisc)
326 if (!qdisc)
328 nfp_abm_qdisc_clear_mq(netdev, alink, qdisc);
330 TC_H_MAJ(qdisc->handle)) != qdisc);
332 kfree(qdisc->children);
333 kfree(qdisc);
344 struct nfp_qdisc *qdisc;
347 qdisc = kzalloc(sizeof(*qdisc), GFP_KERNEL);
348 if (!qdisc)
352 qdisc->children = kcalloc(children, sizeof(void *), GFP_KERNEL);
353 if (!qdisc->children)
357 qdisc->netdev = netdev;
358 qdisc->type = type;
359 qdisc->parent_handle = parent_handle;
360 qdisc->handle = handle;
361 qdisc->num_children = children;
363 err = radix_tree_insert(&alink->qdiscs, TC_H_MAJ(qdisc->handle), qdisc);
371 return qdisc;
374 kfree(qdisc->children);
376 kfree(qdisc);
389 unsigned int children, struct nfp_qdisc **qdisc)
391 *qdisc = nfp_abm_qdisc_find(alink, handle);
392 if (*qdisc) {
393 if (WARN_ON((*qdisc)->type != type))
398 *qdisc = nfp_abm_qdisc_alloc(netdev, alink, type, parent_handle, handle,
400 return *qdisc ? 0 : -ENOMEM;
407 struct nfp_qdisc *qdisc;
409 qdisc = nfp_abm_qdisc_find(alink, handle);
410 if (!qdisc)
414 if (alink->root_qdisc == qdisc)
415 qdisc->use_cnt--;
417 nfp_abm_qdisc_unlink_children(qdisc, 0, qdisc->num_children);
418 nfp_abm_qdisc_free(netdev, alink, qdisc);
420 if (alink->root_qdisc == qdisc) {
485 struct nfp_qdisc *qdisc;
490 qdisc = nfp_abm_qdisc_find(alink, handle);
491 if (!qdisc)
493 /* If the qdisc offload has stopped we may need to adjust the backlog
494 * counters back so carry on even if qdisc is not currently offloaded.
497 for (i = 0; i < qdisc->red.num_bands; i++) {
501 nfp_abm_stats_calculate(&qdisc->red.band[i].stats,
502 &qdisc->red.band[i].prev_stats,
504 qdisc->red.band[i].prev_stats = qdisc->red.band[i].stats;
506 nfp_abm_stats_red_calculate(&qdisc->red.band[i].xstats,
507 &qdisc->red.band[i].prev_xstats,
509 qdisc->red.band[i].prev_xstats = qdisc->red.band[i].xstats;
512 return qdisc->offloaded ? 0 : -EOPNOTSUPP;
579 struct nfp_qdisc *qdisc;
584 opt->handle, 0, &qdisc);
588 qdisc->params_ok = nfp_abm_gred_check_params(alink, opt);
589 if (qdisc->params_ok) {
590 qdisc->red.num_bands = opt->set.dp_cnt;
591 for (i = 0; i < qdisc->red.num_bands; i++) {
592 qdisc->red.band[i].ecn = opt->set.tab[i].is_ecn;
593 qdisc->red.band[i].threshold = opt->set.tab[i].min;
597 if (qdisc->use_cnt)
622 struct nfp_qdisc *qdisc;
626 qdisc = nfp_abm_qdisc_find(alink, opt->handle);
627 if (!qdisc || !qdisc->offloaded)
630 nfp_abm_stats_red_calculate(&qdisc->red.band[0].xstats,
631 &qdisc->red.band[0].prev_xstats,
633 qdisc->red.band[0].prev_xstats = qdisc->red.band[0].xstats;
641 struct nfp_qdisc *qdisc;
645 qdisc = nfp_abm_qdisc_find(alink, handle);
646 if (!qdisc)
648 /* If the qdisc offload has stopped we may need to adjust the backlog
649 * counters back so carry on even if qdisc is not currently offloaded.
652 nfp_abm_stats_calculate(&qdisc->red.band[0].stats,
653 &qdisc->red.band[0].prev_stats,
655 qdisc->red.band[0].prev_stats = qdisc->red.band[0].stats;
657 return qdisc->offloaded ? 0 : -EOPNOTSUPP;
701 struct nfp_qdisc *qdisc;
705 opt->handle, 1, &qdisc);
711 if (nfp_abm_qdisc_child_valid(qdisc, 0))
712 qdisc->children[0]->use_cnt--;
713 qdisc->children[0] = NULL;
719 qdisc->children[0] = NFP_QDISC_UNTRACKED;
722 qdisc->params_ok = nfp_abm_red_check_params(alink, opt);
723 if (qdisc->params_ok) {
724 qdisc->red.num_bands = 1;
725 qdisc->red.band[0].ecn = opt->set.is_ecn;
726 qdisc->red.band[0].threshold = opt->set.min;
729 if (qdisc->use_cnt == 1)
760 struct nfp_qdisc *qdisc;
765 &qdisc);
769 qdisc->params_ok = true;
770 qdisc->offloaded = true;
779 struct nfp_qdisc *qdisc, *red;
782 qdisc = nfp_abm_qdisc_find(alink, handle);
783 if (!qdisc)
791 memset(&qdisc->mq.stats, 0, sizeof(qdisc->mq.stats));
792 memset(&qdisc->mq.prev_stats, 0, sizeof(qdisc->mq.prev_stats));
794 for (i = 0; i < qdisc->num_children; i++) {
795 if (!nfp_abm_qdisc_child_valid(qdisc, i))
798 if (!nfp_abm_qdisc_is_red(qdisc->children[i]))
800 red = qdisc->children[i];
803 nfp_abm_stats_propagate(&qdisc->mq.stats,
805 nfp_abm_stats_propagate(&qdisc->mq.prev_stats,
810 nfp_abm_stats_calculate(&qdisc->mq.stats, &qdisc->mq.prev_stats,
813 return qdisc->offloaded ? 0 : -EOPNOTSUPP;