Lines Matching full:grp

174  * grp->index is the index of the group; and grp->slot_shift
215 struct qfq_group *grp; member
324 cl->grp = &q->groups[i]; in qfq_new_queue()
355 * First compute eligibility comparing grp->S, q->V,
359 qfq_calc_state(struct qfq_sched *q, struct qfq_group *grp) in qfq_calc_state() argument
362 unsigned int state = qfq_gt(grp->S, q->V); in qfq_calc_state()
363 unsigned long mask = mask_from(q->bitmaps[ER], grp->index); in qfq_calc_state()
368 if (qfq_gt(grp->F, next->F)) in qfq_calc_state()
434 * roundedS is always cl->S rounded on grp->slot_shift bits.
437 qfq_slot_insert(struct qfq_group *grp, struct qfq_class *cl, uint64_t roundedS) in qfq_slot_insert() argument
439 uint64_t slot = (roundedS - grp->S) >> grp->slot_shift; in qfq_slot_insert()
440 unsigned int i = (grp->front + slot) % QFQ_MAX_SLOTS; in qfq_slot_insert()
442 cl->next = grp->slots[i]; in qfq_slot_insert()
443 grp->slots[i] = cl; in qfq_slot_insert()
444 __set_bit(slot, &grp->full_slots); in qfq_slot_insert()
451 qfq_front_slot_remove(struct qfq_group *grp) in qfq_front_slot_remove() argument
453 struct qfq_class **h = &grp->slots[grp->front]; in qfq_front_slot_remove()
457 __clear_bit(0, &grp->full_slots); in qfq_front_slot_remove()
466 qfq_slot_scan(struct qfq_group *grp) in qfq_slot_scan() argument
470 ND("grp %d full %x", grp->index, grp->full_slots); in qfq_slot_scan()
471 if (!grp->full_slots) in qfq_slot_scan()
474 i = ffs(grp->full_slots) - 1; // zero-based in qfq_slot_scan()
476 grp->front = (grp->front + i) % QFQ_MAX_SLOTS; in qfq_slot_scan()
477 grp->full_slots >>= i; in qfq_slot_scan()
480 return grp->slots[grp->front]; in qfq_slot_scan()
493 qfq_slot_rotate(struct qfq_sched *q, struct qfq_group *grp, uint64_t roundedS) in qfq_slot_rotate() argument
495 unsigned int i = (grp->S - roundedS) >> grp->slot_shift; in qfq_slot_rotate()
498 grp->full_slots <<= i; in qfq_slot_rotate()
499 grp->front = (grp->front - i) % QFQ_MAX_SLOTS; in qfq_slot_rotate()
510 struct qfq_group *grp; in qfq_update_eligible() local
511 grp = qfq_ffs(q, ineligible); in qfq_update_eligible()
512 if (qfq_gt(grp->S, q->V)) in qfq_update_eligible()
513 q->V = grp->S; in qfq_update_eligible()
523 qfq_update_class(struct qfq_sched *q, struct qfq_group *grp, in qfq_update_class() argument
530 qfq_front_slot_remove(grp); in qfq_update_class()
537 roundedS = qfq_round_down(cl->S, grp->slot_shift); in qfq_update_class()
538 if (roundedS == grp->S) in qfq_update_class()
541 qfq_front_slot_remove(grp); in qfq_update_class()
542 qfq_slot_insert(grp, cl, roundedS); in qfq_update_class()
551 struct qfq_group *grp; in qfq_dequeue() local
563 grp = qfq_ffs(q, q->bitmaps[ER]); in qfq_dequeue()
565 cl = grp->slots[grp->front]; in qfq_dequeue()
578 if (qfq_update_class(q, grp, cl)) { in qfq_dequeue()
579 uint64_t old_F = grp->F; in qfq_dequeue()
580 cl = qfq_slot_scan(grp); in qfq_dequeue()
582 __clear_bit(grp->index, &q->bitmaps[ER]); in qfq_dequeue()
583 // grp->S = grp->F + 1; // XXX debugging only in qfq_dequeue()
585 uint64_t roundedS = qfq_round_down(cl->S, grp->slot_shift); in qfq_dequeue()
588 if (grp->S == roundedS) in qfq_dequeue()
590 grp->S = roundedS; in qfq_dequeue()
591 grp->F = roundedS + (2ULL << grp->slot_shift); in qfq_dequeue()
593 __clear_bit(grp->index, &q->bitmaps[ER]); in qfq_dequeue()
594 s = qfq_calc_state(q, grp); in qfq_dequeue()
595 __set_bit(grp->index, &q->bitmaps[s]); in qfq_dequeue()
598 qfq_unblock_groups(q, grp->index, old_F); in qfq_dequeue()
627 int slot_shift = cl->grp->slot_shift; in qfq_update_start()
634 mask = mask_from(q->bitmaps[ER], cl->grp->index); in qfq_update_start()
656 struct qfq_group *grp; in qfq_enqueue() local
662 DX(4, "len %d flow %p inv_w 0x%x grp %d", m->m_pkthdr.len, in qfq_enqueue()
663 _q, cl->inv_w, cl->grp->index); in qfq_enqueue()
673 grp = cl->grp; in qfq_enqueue()
677 roundedS = qfq_round_down(cl->S, grp->slot_shift); in qfq_enqueue()
681 * If cl->S >= grp->S we don't need to adjust the in qfq_enqueue()
683 * Otherwise grp->S is decreasing, we must make room in qfq_enqueue()
688 if (grp->full_slots) { in qfq_enqueue()
689 if (!qfq_gt(grp->S, cl->S)) in qfq_enqueue()
692 qfq_slot_rotate(q, grp, roundedS); in qfq_enqueue()
694 __clear_bit(grp->index, &q->bitmaps[IR]); in qfq_enqueue()
695 __clear_bit(grp->index, &q->bitmaps[IB]); in qfq_enqueue()
699 grp->S = roundedS; in qfq_enqueue()
700 grp->F = roundedS + (2ULL << grp->slot_shift); // i.e. 2\sigma_i in qfq_enqueue()
701 s = qfq_calc_state(q, grp); in qfq_enqueue()
702 __set_bit(grp->index, &q->bitmaps[s]); in qfq_enqueue()
706 qfq_slot_insert(grp, cl, roundedS); in qfq_enqueue()
713 qfq_slot_remove(struct qfq_sched *q, struct qfq_group *grp,
719 roundedS = qfq_round_down(cl->S, grp->slot_shift);
720 offset = (roundedS - grp->S) >> grp->slot_shift;
721 i = (grp->front + offset) % QFQ_MAX_SLOTS;
725 pprev = &grp->slots[i];
732 if (!grp->slots[i])
733 __clear_bit(offset, &grp->full_slots);
748 struct qfq_group *grp = &q->groups[cl->index];
754 qfq_slot_remove(q, grp, cl, pprev);
756 if (!grp->full_slots) {
761 __clear_bit(grp->index, &q->bitmaps[IR]);
762 __clear_bit(grp->index, &q->bitmaps[EB]);
763 __clear_bit(grp->index, &q->bitmaps[IB]);
765 if (test_bit(grp->index, &q->bitmaps[ER]) &&
766 !(q->bitmaps[ER] & ~((1UL << grp->index) - 1))) {
767 mask = q->bitmaps[ER] & ((1UL << grp->index) - 1);
775 __clear_bit(grp->index, &q->bitmaps[ER]);
776 } else if (!grp->slots[grp->front]) {
777 cl = qfq_slot_scan(grp);
778 roundedS = qfq_round_down(cl->S, grp->slot_shift);
779 if (grp->S != roundedS) {
780 __clear_bit(grp->index, &q->bitmaps[ER]);
781 __clear_bit(grp->index, &q->bitmaps[IR]);
782 __clear_bit(grp->index, &q->bitmaps[EB]);
783 __clear_bit(grp->index, &q->bitmaps[IB]);
784 grp->S = roundedS;
785 grp->F = roundedS + (2ULL << grp->slot_shift);
786 s = qfq_calc_state(q, grp);
787 __set_bit(grp->index, &q->bitmaps[s]);
810 struct qfq_group *grp; in qfq_new_sched() local
814 grp = &q->groups[i]; in qfq_new_sched()
815 grp->index = i; in qfq_new_sched()
816 grp->slot_shift = QFQ_MTU_SHIFT + FRAC_BITS - in qfq_new_sched()