diff options
author | Paolo Valente <paolo.valente@unimore.it> | 2013-03-05 09:04:58 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-03-06 08:47:05 +0100 |
commit | 624b85fb96206879c8146abdba071222bbd25259 (patch) | |
tree | e6fbd60c1cea8682333422ae797fd9ff83f83ce6 /net/sched/sch_qfq.c | |
parent | pkt_sched: sch_qfq: properly cap timestamps in charge_actual_service (diff) | |
download | linux-624b85fb96206879c8146abdba071222bbd25259.tar.xz linux-624b85fb96206879c8146abdba071222bbd25259.zip |
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>
Diffstat (limited to 'net/sched/sch_qfq.c')
-rw-r--r-- | net/sched/sch_qfq.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/net/sched/sch_qfq.c b/net/sched/sch_qfq.c index 489edd929932..39d85cc0db26 100644 --- a/net/sched/sch_qfq.c +++ b/net/sched/sch_qfq.c @@ -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); } |