Lines Matching refs:qdisc

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