Lines Matching refs:q
212 struct qfq_sched *q = qdisc_priv(sch); in qfq_find_class() local
215 clc = qdisc_class_find(&q->clhash, classid); in qfq_find_class()
223 unsigned int len = cl->qdisc->q.qlen; in qfq_purge_queue()
265 static void qfq_init_agg(struct qfq_sched *q, struct qfq_aggregate *agg, in qfq_init_agg() argument
269 hlist_add_head(&agg->nonfull_next, &q->nonfull_aggs); in qfq_init_agg()
275 static struct qfq_aggregate *qfq_find_agg(struct qfq_sched *q, in qfq_find_agg() argument
280 hlist_for_each_entry(agg, &q->nonfull_aggs, nonfull_next) in qfq_find_agg()
289 static void qfq_update_agg(struct qfq_sched *q, struct qfq_aggregate *agg, in qfq_update_agg() argument
294 if (new_num_classes == q->max_agg_classes) in qfq_update_agg()
298 new_num_classes == q->max_agg_classes - 1) /* agg no more full */ in qfq_update_agg()
299 hlist_add_head(&agg->nonfull_next, &q->nonfull_aggs); in qfq_update_agg()
311 q->min_slot_shift); in qfq_update_agg()
312 agg->grp = &q->groups[i]; in qfq_update_agg()
315 q->wsum += in qfq_update_agg()
322 static void qfq_add_to_agg(struct qfq_sched *q, in qfq_add_to_agg() argument
328 qfq_update_agg(q, agg, agg->num_classes+1); in qfq_add_to_agg()
329 if (cl->qdisc->q.qlen > 0) { /* adding an active class */ in qfq_add_to_agg()
332 cl && q->in_serv_agg != agg) /* agg was inactive */ in qfq_add_to_agg()
333 qfq_activate_agg(q, agg, enqueue); /* schedule agg */ in qfq_add_to_agg()
339 static void qfq_destroy_agg(struct qfq_sched *q, struct qfq_aggregate *agg) in qfq_destroy_agg() argument
343 if (q->in_serv_agg == agg) in qfq_destroy_agg()
344 q->in_serv_agg = qfq_choose_next_agg(q); in qfq_destroy_agg()
349 static void qfq_deactivate_class(struct qfq_sched *q, struct qfq_class *cl) in qfq_deactivate_class() argument
356 qfq_deactivate_agg(q, agg); in qfq_deactivate_class()
360 static void qfq_rm_from_agg(struct qfq_sched *q, struct qfq_class *cl) in qfq_rm_from_agg() argument
366 qfq_destroy_agg(q, agg); in qfq_rm_from_agg()
369 qfq_update_agg(q, agg, agg->num_classes-1); in qfq_rm_from_agg()
373 static void qfq_deact_rm_from_agg(struct qfq_sched *q, struct qfq_class *cl) in qfq_deact_rm_from_agg() argument
375 if (cl->qdisc->q.qlen > 0) /* class is active */ in qfq_deact_rm_from_agg()
376 qfq_deactivate_class(q, cl); in qfq_deact_rm_from_agg()
378 qfq_rm_from_agg(q, cl); in qfq_deact_rm_from_agg()
385 struct qfq_sched *q = qdisc_priv(sch); in qfq_change_agg() local
386 struct qfq_aggregate *new_agg = qfq_find_agg(q, lmax, weight); in qfq_change_agg()
392 qfq_init_agg(q, new_agg, lmax, weight); in qfq_change_agg()
394 qfq_deact_rm_from_agg(q, cl); in qfq_change_agg()
395 qfq_add_to_agg(q, new_agg, cl); in qfq_change_agg()
403 struct qfq_sched *q = qdisc_priv(sch); in qfq_change_class() local
449 if (q->wsum + delta_w > QFQ_MAX_WSUM) { in qfq_change_class()
451 delta_w, q->wsum); in qfq_change_class()
490 qdisc_class_hash_insert(&q->clhash, &cl->common); in qfq_change_class()
493 qdisc_class_hash_grow(sch, &q->clhash); in qfq_change_class()
497 new_agg = qfq_find_agg(q, lmax, weight); in qfq_change_class()
507 qfq_init_agg(q, new_agg, lmax, weight); in qfq_change_class()
510 qfq_deact_rm_from_agg(q, cl); in qfq_change_class()
511 qfq_add_to_agg(q, new_agg, cl); in qfq_change_class()
525 struct qfq_sched *q = qdisc_priv(sch); in qfq_destroy_class() local
527 qfq_rm_from_agg(q, cl); in qfq_destroy_class()
535 struct qfq_sched *q = qdisc_priv(sch); in qfq_delete_class() local
544 qdisc_class_hash_remove(&q->clhash, &cl->common); in qfq_delete_class()
576 struct qfq_sched *q = qdisc_priv(sch); in qfq_tcf_chain() local
581 return &q->filter_list; in qfq_tcf_chain()
659 cl->qdisc->qstats.qlen = cl->qdisc->q.qlen; in qfq_dump_class_stats()
674 struct qfq_sched *q = qdisc_priv(sch); in qfq_walk() local
681 for (i = 0; i < q->clhash.hashsize; i++) { in qfq_walk()
682 hlist_for_each_entry(cl, &q->clhash.hash[i], common.hnode) { in qfq_walk()
699 struct qfq_sched *q = qdisc_priv(sch); in qfq_classify() local
712 result = tc_classify(skb, q->filter_list, &res); in qfq_classify()
745 static inline struct qfq_group *qfq_ffs(struct qfq_sched *q, in qfq_ffs() argument
749 return &q->groups[index]; in qfq_ffs()
762 static int qfq_calc_state(struct qfq_sched *q, const struct qfq_group *grp) in qfq_calc_state() argument
765 unsigned int state = qfq_gt(grp->S, q->V); in qfq_calc_state()
766 unsigned long mask = mask_from(q->bitmaps[ER], grp->index); in qfq_calc_state()
770 next = qfq_ffs(q, mask); in qfq_calc_state()
785 static inline void qfq_move_groups(struct qfq_sched *q, unsigned long mask, in qfq_move_groups() argument
788 q->bitmaps[dst] |= q->bitmaps[src] & mask; in qfq_move_groups()
789 q->bitmaps[src] &= ~mask; in qfq_move_groups()
792 static void qfq_unblock_groups(struct qfq_sched *q, int index, u64 old_F) in qfq_unblock_groups() argument
794 unsigned long mask = mask_from(q->bitmaps[ER], index + 1); in qfq_unblock_groups()
798 next = qfq_ffs(q, mask); in qfq_unblock_groups()
804 qfq_move_groups(q, mask, EB, ER); in qfq_unblock_groups()
805 qfq_move_groups(q, mask, IB, IR); in qfq_unblock_groups()
818 static void qfq_make_eligible(struct qfq_sched *q) in qfq_make_eligible() argument
820 unsigned long vslot = q->V >> q->min_slot_shift; in qfq_make_eligible()
821 unsigned long old_vslot = q->oldV >> q->min_slot_shift; in qfq_make_eligible()
825 qfq_move_groups(q, mask, IR, ER); in qfq_make_eligible()
826 qfq_move_groups(q, mask, IB, EB); in qfq_make_eligible()
944 static void qfq_update_eligible(struct qfq_sched *q) in qfq_update_eligible() argument
949 ineligible = q->bitmaps[IR] | q->bitmaps[IB]; in qfq_update_eligible()
951 if (!q->bitmaps[ER]) { in qfq_update_eligible()
952 grp = qfq_ffs(q, ineligible); in qfq_update_eligible()
953 if (qfq_gt(grp->S, q->V)) in qfq_update_eligible()
954 q->V = grp->S; in qfq_update_eligible()
956 qfq_make_eligible(q); in qfq_update_eligible()
968 if (cl->qdisc->q.qlen == 0) /* no more packets, remove from list */ in agg_dequeue()
1006 static inline void qfq_update_agg_ts(struct qfq_sched *q,
1010 static void qfq_schedule_agg(struct qfq_sched *q, struct qfq_aggregate *agg);
1014 struct qfq_sched *q = qdisc_priv(sch); in qfq_dequeue() local
1015 struct qfq_aggregate *in_serv_agg = q->in_serv_agg; in qfq_dequeue()
1050 qfq_update_agg_ts(q, in_serv_agg, requeue); in qfq_dequeue()
1051 qfq_schedule_agg(q, in_serv_agg); in qfq_dequeue()
1052 } else if (sch->q.qlen == 0) { /* no aggregate to serve */ in qfq_dequeue()
1053 q->in_serv_agg = NULL; in qfq_dequeue()
1061 in_serv_agg = q->in_serv_agg = qfq_choose_next_agg(q); in qfq_dequeue()
1067 sch->q.qlen--; in qfq_dequeue()
1080 q->V += (u64)len * IWSUM; in qfq_dequeue()
1083 (unsigned long long) q->V); in qfq_dequeue()
1088 static struct qfq_aggregate *qfq_choose_next_agg(struct qfq_sched *q) in qfq_choose_next_agg() argument
1094 qfq_update_eligible(q); in qfq_choose_next_agg()
1095 q->oldV = q->V; in qfq_choose_next_agg()
1097 if (!q->bitmaps[ER]) in qfq_choose_next_agg()
1100 grp = qfq_ffs(q, q->bitmaps[ER]); in qfq_choose_next_agg()
1111 __clear_bit(grp->index, &q->bitmaps[ER]); in qfq_choose_next_agg()
1121 __clear_bit(grp->index, &q->bitmaps[ER]); in qfq_choose_next_agg()
1122 s = qfq_calc_state(q, grp); in qfq_choose_next_agg()
1123 __set_bit(grp->index, &q->bitmaps[s]); in qfq_choose_next_agg()
1126 qfq_unblock_groups(q, grp->index, old_F); in qfq_choose_next_agg()
1144 static void qfq_update_start(struct qfq_sched *q, struct qfq_aggregate *agg) in qfq_update_start() argument
1151 limit = qfq_round_down(q->V, slot_shift) + (1ULL << slot_shift); in qfq_update_start()
1153 if (!qfq_gt(agg->F, q->V) || qfq_gt(roundedF, limit)) { in qfq_update_start()
1155 mask = mask_from(q->bitmaps[ER], agg->grp->index); in qfq_update_start()
1157 struct qfq_group *next = qfq_ffs(q, mask); in qfq_update_start()
1166 agg->S = q->V; in qfq_update_start()
1178 qfq_update_agg_ts(struct qfq_sched *q, in qfq_update_agg_ts() argument
1182 qfq_update_start(q, agg); in qfq_update_agg_ts()
1193 struct qfq_sched *q = qdisc_priv(sch); in qfq_enqueue() local
1227 ++sch->q.qlen; in qfq_enqueue()
1231 if (cl->qdisc->q.qlen != 1) { in qfq_enqueue()
1245 q->in_serv_agg == agg) in qfq_enqueue()
1248 qfq_activate_agg(q, agg, enqueue); in qfq_enqueue()
1256 static void qfq_schedule_agg(struct qfq_sched *q, struct qfq_aggregate *agg) in qfq_schedule_agg() argument
1280 __clear_bit(grp->index, &q->bitmaps[IR]); in qfq_schedule_agg()
1281 __clear_bit(grp->index, &q->bitmaps[IB]); in qfq_schedule_agg()
1282 } else if (!q->bitmaps[ER] && qfq_gt(roundedS, q->V) && in qfq_schedule_agg()
1283 q->in_serv_agg == NULL) in qfq_schedule_agg()
1284 q->V = roundedS; in qfq_schedule_agg()
1288 s = qfq_calc_state(q, grp); in qfq_schedule_agg()
1289 __set_bit(grp->index, &q->bitmaps[s]); in qfq_schedule_agg()
1292 s, q->bitmaps[s], in qfq_schedule_agg()
1295 (unsigned long long) q->V); in qfq_schedule_agg()
1303 static void qfq_activate_agg(struct qfq_sched *q, struct qfq_aggregate *agg, in qfq_activate_agg() argument
1308 qfq_update_agg_ts(q, agg, reason); in qfq_activate_agg()
1309 if (q->in_serv_agg == NULL) { /* no aggr. in service or scheduled */ in qfq_activate_agg()
1310 q->in_serv_agg = agg; /* start serving this aggregate */ in qfq_activate_agg()
1312 q->oldV = q->V = agg->S; in qfq_activate_agg()
1313 } else if (agg != q->in_serv_agg) in qfq_activate_agg()
1314 qfq_schedule_agg(q, agg); in qfq_activate_agg()
1317 static void qfq_slot_remove(struct qfq_sched *q, struct qfq_group *grp, in qfq_slot_remove() argument
1340 static void qfq_deactivate_agg(struct qfq_sched *q, struct qfq_aggregate *agg) in qfq_deactivate_agg() argument
1347 if (agg == q->in_serv_agg) { in qfq_deactivate_agg()
1349 q->in_serv_agg = qfq_choose_next_agg(q); in qfq_deactivate_agg()
1354 qfq_slot_remove(q, grp, agg); in qfq_deactivate_agg()
1357 __clear_bit(grp->index, &q->bitmaps[IR]); in qfq_deactivate_agg()
1358 __clear_bit(grp->index, &q->bitmaps[EB]); in qfq_deactivate_agg()
1359 __clear_bit(grp->index, &q->bitmaps[IB]); in qfq_deactivate_agg()
1361 if (test_bit(grp->index, &q->bitmaps[ER]) && in qfq_deactivate_agg()
1362 !(q->bitmaps[ER] & ~((1UL << grp->index) - 1))) { in qfq_deactivate_agg()
1363 mask = q->bitmaps[ER] & ((1UL << grp->index) - 1); in qfq_deactivate_agg()
1368 qfq_move_groups(q, mask, EB, ER); in qfq_deactivate_agg()
1369 qfq_move_groups(q, mask, IB, IR); in qfq_deactivate_agg()
1371 __clear_bit(grp->index, &q->bitmaps[ER]); in qfq_deactivate_agg()
1376 __clear_bit(grp->index, &q->bitmaps[ER]); in qfq_deactivate_agg()
1377 __clear_bit(grp->index, &q->bitmaps[IR]); in qfq_deactivate_agg()
1378 __clear_bit(grp->index, &q->bitmaps[EB]); in qfq_deactivate_agg()
1379 __clear_bit(grp->index, &q->bitmaps[IB]); in qfq_deactivate_agg()
1382 s = qfq_calc_state(q, grp); in qfq_deactivate_agg()
1383 __set_bit(grp->index, &q->bitmaps[s]); in qfq_deactivate_agg()
1390 struct qfq_sched *q = qdisc_priv(sch); in qfq_qlen_notify() local
1393 if (cl->qdisc->q.qlen == 0) in qfq_qlen_notify()
1394 qfq_deactivate_class(q, cl); in qfq_qlen_notify()
1397 static unsigned int qfq_drop_from_slot(struct qfq_sched *q, in qfq_drop_from_slot() argument
1412 if (cl->qdisc->q.qlen == 0) in qfq_drop_from_slot()
1413 qfq_deactivate_class(q, cl); in qfq_drop_from_slot()
1424 struct qfq_sched *q = qdisc_priv(sch); in qfq_drop() local
1429 grp = &q->groups[i]; in qfq_drop()
1431 len = qfq_drop_from_slot(q, &grp->slots[j]); in qfq_drop()
1433 sch->q.qlen--; in qfq_drop()
1445 struct qfq_sched *q = qdisc_priv(sch); in qfq_init_qdisc() local
1450 err = qdisc_class_hash_init(&q->clhash); in qfq_init_qdisc()
1460 q->max_agg_classes = 1<<max_cl_shift; in qfq_init_qdisc()
1464 q->min_slot_shift = FRAC_BITS + maxbudg_shift - QFQ_MAX_INDEX; in qfq_init_qdisc()
1467 grp = &q->groups[i]; in qfq_init_qdisc()
1469 grp->slot_shift = q->min_slot_shift + i; in qfq_init_qdisc()
1474 INIT_HLIST_HEAD(&q->nonfull_aggs); in qfq_init_qdisc()
1481 struct qfq_sched *q = qdisc_priv(sch); in qfq_reset_qdisc() local
1485 for (i = 0; i < q->clhash.hashsize; i++) { in qfq_reset_qdisc()
1486 hlist_for_each_entry(cl, &q->clhash.hash[i], common.hnode) { in qfq_reset_qdisc()
1487 if (cl->qdisc->q.qlen > 0) in qfq_reset_qdisc()
1488 qfq_deactivate_class(q, cl); in qfq_reset_qdisc()
1493 sch->q.qlen = 0; in qfq_reset_qdisc()
1498 struct qfq_sched *q = qdisc_priv(sch); in qfq_destroy_qdisc() local
1503 tcf_destroy_chain(&q->filter_list); in qfq_destroy_qdisc()
1505 for (i = 0; i < q->clhash.hashsize; i++) { in qfq_destroy_qdisc()
1506 hlist_for_each_entry_safe(cl, next, &q->clhash.hash[i], in qfq_destroy_qdisc()
1511 qdisc_class_hash_destroy(&q->clhash); in qfq_destroy_qdisc()