Lines Matching refs:grp
102 * grp->index is the index of the group; and grp->slot_shift
152 struct qfq_group *grp;
303 if (agg->grp == NULL) {
306 agg->grp = &q->groups[i];
751 * First compute eligibility comparing grp->S, q->V,
754 static int qfq_calc_state(struct qfq_sched *q, const struct qfq_group *grp)
757 unsigned int state = qfq_gt(grp->S, q->V);
758 unsigned long mask = mask_from(q->bitmaps[ER], grp->index);
763 if (qfq_gt(grp->F, next->F))
884 static void qfq_slot_insert(struct qfq_group *grp, struct qfq_aggregate *agg,
887 u64 slot = (roundedS - grp->S) >> grp->slot_shift;
891 u64 deltaS = roundedS - grp->S -
892 ((u64)(QFQ_MAX_SLOTS - 2)<<grp->slot_shift);
898 i = (grp->front + slot) % QFQ_MAX_SLOTS;
900 hlist_add_head(&agg->next, &grp->slots[i]);
901 __set_bit(slot, &grp->full_slots);
905 static struct qfq_aggregate *qfq_slot_head(struct qfq_group *grp)
907 return hlist_entry(grp->slots[grp->front].first,
914 static void qfq_front_slot_remove(struct qfq_group *grp)
916 struct qfq_aggregate *agg = qfq_slot_head(grp);
920 if (hlist_empty(&grp->slots[grp->front]))
921 __clear_bit(0, &grp->full_slots);
929 static struct qfq_aggregate *qfq_slot_scan(struct qfq_group *grp)
933 pr_debug("qfq slot_scan: grp %u full %#lx\n",
934 grp->index, grp->full_slots);
936 if (grp->full_slots == 0)
939 i = __ffs(grp->full_slots); /* zero based */
941 grp->front = (grp->front + i) % QFQ_MAX_SLOTS;
942 grp->full_slots >>= i;
945 return qfq_slot_head(grp);
957 static void qfq_slot_rotate(struct qfq_group *grp, u64 roundedS)
959 unsigned int i = (grp->S - roundedS) >> grp->slot_shift;
961 grp->full_slots <<= i;
962 grp->front = (grp->front - i) % QFQ_MAX_SLOTS;
967 struct qfq_group *grp;
973 grp = qfq_ffs(q, ineligible);
974 if (qfq_gt(grp->S, q->V))
975 q->V = grp->S;
1048 int slot_shift = agg->grp->slot_shift;
1055 mask = mask_from(q->bitmaps[ER], agg->grp->index);
1176 struct qfq_group *grp;
1186 grp = qfq_ffs(q, q->bitmaps[ER]);
1187 old_F = grp->F;
1189 agg = qfq_slot_head(grp);
1192 qfq_front_slot_remove(grp);
1194 new_front_agg = qfq_slot_scan(grp);
1197 __clear_bit(grp->index, &q->bitmaps[ER]);
1200 grp->slot_shift);
1203 if (grp->S == roundedS)
1205 grp->S = roundedS;
1206 grp->F = roundedS + (2ULL << grp->slot_shift);
1207 __clear_bit(grp->index, &q->bitmaps[ER]);
1208 s = qfq_calc_state(q, grp);
1209 __set_bit(grp->index, &q->bitmaps[s]);
1212 qfq_unblock_groups(q, grp->index, old_F);
1292 struct qfq_group *grp = agg->grp;
1296 roundedS = qfq_round_down(agg->S, grp->slot_shift);
1300 * If agg->S >= grp->S we don't need to adjust the
1302 * Otherwise grp->S is decreasing, we must make room
1307 if (grp->full_slots) {
1308 if (!qfq_gt(grp->S, agg->S))
1312 qfq_slot_rotate(grp, roundedS);
1314 __clear_bit(grp->index, &q->bitmaps[IR]);
1315 __clear_bit(grp->index, &q->bitmaps[IB]);
1320 grp->S = roundedS;
1321 grp->F = roundedS + (2ULL << grp->slot_shift);
1322 s = qfq_calc_state(q, grp);
1323 __set_bit(grp->index, &q->bitmaps[s]);
1332 qfq_slot_insert(grp, agg, roundedS);
1351 static void qfq_slot_remove(struct qfq_sched *q, struct qfq_group *grp,
1357 roundedS = qfq_round_down(agg->S, grp->slot_shift);
1358 offset = (roundedS - grp->S) >> grp->slot_shift;
1360 i = (grp->front + offset) % QFQ_MAX_SLOTS;
1363 if (hlist_empty(&grp->slots[i]))
1364 __clear_bit(offset, &grp->full_slots);
1376 struct qfq_group *grp = agg->grp;
1388 qfq_slot_remove(q, grp, agg);
1390 if (!grp->full_slots) {
1391 __clear_bit(grp->index, &q->bitmaps[IR]);
1392 __clear_bit(grp->index, &q->bitmaps[EB]);
1393 __clear_bit(grp->index, &q->bitmaps[IB]);
1395 if (test_bit(grp->index, &q->bitmaps[ER]) &&
1396 !(q->bitmaps[ER] & ~((1UL << grp->index) - 1))) {
1397 mask = q->bitmaps[ER] & ((1UL << grp->index) - 1);
1405 __clear_bit(grp->index, &q->bitmaps[ER]);
1406 } else if (hlist_empty(&grp->slots[grp->front])) {
1407 agg = qfq_slot_scan(grp);
1408 roundedS = qfq_round_down(agg->S, grp->slot_shift);
1409 if (grp->S != roundedS) {
1410 __clear_bit(grp->index, &q->bitmaps[ER]);
1411 __clear_bit(grp->index, &q->bitmaps[IR]);
1412 __clear_bit(grp->index, &q->bitmaps[EB]);
1413 __clear_bit(grp->index, &q->bitmaps[IB]);
1414 grp->S = roundedS;
1415 grp->F = roundedS + (2ULL << grp->slot_shift);
1416 s = qfq_calc_state(q, grp);
1417 __set_bit(grp->index, &q->bitmaps[s]);
1434 struct qfq_group *grp;
1457 grp = &q->groups[i];
1458 grp->index = i;
1459 grp->slot_shift = q->min_slot_shift + i;
1461 INIT_HLIST_HEAD(&grp->slots[j]);