• Marcin Wojtas's avatar
    net: mvpp2: replace TX coalescing interrupts with hrtimer · edc660fa
    Marcin Wojtas authored
    The PP2 controller is capable of per-CPU TX processing, which means there are
    per-CPU banked register sets and queues. Current version of the driver supports
    TX packet coalescing - once on given CPU sent packets amount reaches a threshold
    value, an IRQ occurs. However, there is a single interrupt line responsible for
    CPU0/1 TX and RX events (the latter is not per-CPU, the hardware does not
    support RSS).
    
    When the top-half executes the interrupt cause is not known. This is why in
    NAPI poll function, along with RX processing, IRQ cause register on both
    CPU's is accessed in order to determine on which of them the TX coalescing
    threshold might have been reached. Thus the egress processing and releasing the
    buffers is able to take place on the corresponding CPU. Hitherto approach lead
    to an illegal usage of on_each_cpu function in softirq context.
    
    The problem is solved by resigning from TX coalescing interrupts and separating
    egress finalization from NAPI processing. For that purpose a method of using
    hrtimer is introduced. In main transmit function (mvpp2_tx) buffers are released
    once a software coalescing threshold is reached. In case not all the data is
    processed a timer is set on this CPU - in its interrupt context a tasklet is
    scheduled in which all queues are processed. At once only one timer per-CPU can
    be running, which is controlled by a dedicated flag.
    
    This commit removes TX processing from NAPI polling function, disables hardware
    coalescing and enables hrtimer with tasklet, using new per-CPU port structure
    (mvpp2_port_pcpu).
    Signed-off-by: default avatarMarcin Wojtas <mw@semihalf.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    edc660fa
mvpp2.c 180 KB