pkt_sched: sch_qfq: fix the update of eligible-group sets
Between two invocations of make_eligible, the system virtual time may happen to grow enough that, in its binary representation, a bit with higher order than 31 flips. This happens especially with TSO/GSO. Before this fix, the mask used in make_eligible was computed as (1UL<<index_of_last_flipped_bit)-1, whose value is well defined on a 64-bit architecture, because index_of_flipped_bit <= 63, but is in general undefined on a 32-bit architecture if index_of_flipped_bit > 31. The fix just replaces 1UL with 1ULL. Signed-off-by: Paolo Valente <paolo.valente@unimore.it> Reviewed-by: Fabio Checconi <fchecconi@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
9b99b7e90b
commit
624b85fb96
|
@ -821,7 +821,7 @@ static void qfq_make_eligible(struct qfq_sched *q)
|
|||
unsigned long old_vslot = q->oldV >> q->min_slot_shift;
|
||||
|
||||
if (vslot != old_vslot) {
|
||||
unsigned long mask = (1UL << fls(vslot ^ old_vslot)) - 1;
|
||||
unsigned long mask = (1ULL << fls(vslot ^ old_vslot)) - 1;
|
||||
qfq_move_groups(q, mask, IR, ER);
|
||||
qfq_move_groups(q, mask, IB, EB);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue