Lines Matching refs:grp
102 * grp->index is the index of the group; and grp->slot_shift
150 struct qfq_group *grp;
301 if (agg->grp == NULL) {
304 agg->grp = &q->groups[i];
746 * First compute eligibility comparing grp->S, q->V,
749 static int qfq_calc_state(struct qfq_sched *q, const struct qfq_group *grp)
752 unsigned int state = qfq_gt(grp->S, q->V);
753 unsigned long mask = mask_from(q->bitmaps[ER], grp->index);
758 if (qfq_gt(grp->F, next->F))
879 static void qfq_slot_insert(struct qfq_group *grp, struct qfq_aggregate *agg,
882 u64 slot = (roundedS - grp->S) >> grp->slot_shift;
886 u64 deltaS = roundedS - grp->S -
887 ((u64)(QFQ_MAX_SLOTS - 2)<<grp->slot_shift);
893 i = (grp->front + slot) % QFQ_MAX_SLOTS;
895 hlist_add_head(&agg->next, &grp->slots[i]);
896 __set_bit(slot, &grp->full_slots);
900 static struct qfq_aggregate *qfq_slot_head(struct qfq_group *grp)
902 return hlist_entry(grp->slots[grp->front].first,
909 static void qfq_front_slot_remove(struct qfq_group *grp)
911 struct qfq_aggregate *agg = qfq_slot_head(grp);
915 if (hlist_empty(&grp->slots[grp->front]))
916 __clear_bit(0, &grp->full_slots);
924 static struct qfq_aggregate *qfq_slot_scan(struct qfq_group *grp)
928 pr_debug("qfq slot_scan: grp %u full %#lx\n",
929 grp->index, grp->full_slots);
931 if (grp->full_slots == 0)
934 i = __ffs(grp->full_slots); /* zero based */
936 grp->front = (grp->front + i) % QFQ_MAX_SLOTS;
937 grp->full_slots >>= i;
940 return qfq_slot_head(grp);
952 static void qfq_slot_rotate(struct qfq_group *grp, u64 roundedS)
954 unsigned int i = (grp->S - roundedS) >> grp->slot_shift;
956 grp->full_slots <<= i;
957 grp->front = (grp->front - i) % QFQ_MAX_SLOTS;
962 struct qfq_group *grp;
968 grp = qfq_ffs(q, ineligible);
969 if (qfq_gt(grp->S, q->V))
970 q->V = grp->S;
1043 int slot_shift = agg->grp->slot_shift;
1050 mask = mask_from(q->bitmaps[ER], agg->grp->index);
1171 struct qfq_group *grp;
1181 grp = qfq_ffs(q, q->bitmaps[ER]);
1182 old_F = grp->F;
1184 agg = qfq_slot_head(grp);
1187 qfq_front_slot_remove(grp);
1189 new_front_agg = qfq_slot_scan(grp);
1192 __clear_bit(grp->index, &q->bitmaps[ER]);
1195 grp->slot_shift);
1198 if (grp->S == roundedS)
1200 grp->S = roundedS;
1201 grp->F = roundedS + (2ULL << grp->slot_shift);
1202 __clear_bit(grp->index, &q->bitmaps[ER]);
1203 s = qfq_calc_state(q, grp);
1204 __set_bit(grp->index, &q->bitmaps[s]);
1207 qfq_unblock_groups(q, grp->index, old_F);
1286 struct qfq_group *grp = agg->grp;
1290 roundedS = qfq_round_down(agg->S, grp->slot_shift);
1294 * If agg->S >= grp->S we don't need to adjust the
1296 * Otherwise grp->S is decreasing, we must make room
1301 if (grp->full_slots) {
1302 if (!qfq_gt(grp->S, agg->S))
1306 qfq_slot_rotate(grp, roundedS);
1308 __clear_bit(grp->index, &q->bitmaps[IR]);
1309 __clear_bit(grp->index, &q->bitmaps[IB]);
1314 grp->S = roundedS;
1315 grp->F = roundedS + (2ULL << grp->slot_shift);
1316 s = qfq_calc_state(q, grp);
1317 __set_bit(grp->index, &q->bitmaps[s]);
1326 qfq_slot_insert(grp, agg, roundedS);
1345 static void qfq_slot_remove(struct qfq_sched *q, struct qfq_group *grp,
1351 roundedS = qfq_round_down(agg->S, grp->slot_shift);
1352 offset = (roundedS - grp->S) >> grp->slot_shift;
1354 i = (grp->front + offset) % QFQ_MAX_SLOTS;
1357 if (hlist_empty(&grp->slots[i]))
1358 __clear_bit(offset, &grp->full_slots);
1370 struct qfq_group *grp = agg->grp;
1382 qfq_slot_remove(q, grp, agg);
1384 if (!grp->full_slots) {
1385 __clear_bit(grp->index, &q->bitmaps[IR]);
1386 __clear_bit(grp->index, &q->bitmaps[EB]);
1387 __clear_bit(grp->index, &q->bitmaps[IB]);
1389 if (test_bit(grp->index, &q->bitmaps[ER]) &&
1390 !(q->bitmaps[ER] & ~((1UL << grp->index) - 1))) {
1391 mask = q->bitmaps[ER] & ((1UL << grp->index) - 1);
1399 __clear_bit(grp->index, &q->bitmaps[ER]);
1400 } else if (hlist_empty(&grp->slots[grp->front])) {
1401 agg = qfq_slot_scan(grp);
1402 roundedS = qfq_round_down(agg->S, grp->slot_shift);
1403 if (grp->S != roundedS) {
1404 __clear_bit(grp->index, &q->bitmaps[ER]);
1405 __clear_bit(grp->index, &q->bitmaps[IR]);
1406 __clear_bit(grp->index, &q->bitmaps[EB]);
1407 __clear_bit(grp->index, &q->bitmaps[IB]);
1408 grp->S = roundedS;
1409 grp->F = roundedS + (2ULL << grp->slot_shift);
1410 s = qfq_calc_state(q, grp);
1411 __set_bit(grp->index, &q->bitmaps[s]);
1428 struct qfq_group *grp;
1451 grp = &q->groups[i];
1452 grp->index = i;
1453 grp->slot_shift = q->min_slot_shift + i;
1455 INIT_HLIST_HEAD(&grp->slots[j]);