• Paolo Valente's avatar
    pkt_sched: sch_qfq: prevent budget from wrapping around after a dequeue · a0143efa
    Paolo Valente authored
    Aggregate budgets are computed so as to guarantee that, after an
    aggregate has been selected for service, that aggregate has enough
    budget to serve at least one maximum-size packet for the classes it
    contains. For this reason, after a new aggregate has been selected
    for service, its next packet is immediately dequeued, without any
    further control.
    
    The maximum packet size for a class, lmax, can be changed through
    qfq_change_class(). In case the user sets lmax to a lower value than
    the the size of some of the still-to-arrive packets, QFQ+ will
    automatically push up lmax as it enqueues these packets.  This
    automatic push up is likely to happen with TSO/GSO.
    
    In any case, if lmax is assigned a lower value than the size of some
    of the packets already enqueued for the class, then the following
    problem may occur: the size of the next packet to dequeue for the
    class may happen to be larger than lmax, after the aggregate to which
    the class belongs has been just selected for service. In this case,
    even the budget of the aggregate, which is an unsigned value, may be
    lower than the size of the next packet to dequeue. After dequeueing
    this packet and subtracting its size from the budget, the latter would
    wrap around.
    
    This fix prevents the budget from wrapping around after any packet
    dequeue.
    Signed-off-by: default avatarPaolo Valente <paolo.valente@unimore.it>
    Reviewed-by: default avatarFabio Checconi <fchecconi@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    a0143efa
sch_qfq.c 41.2 KB