• Markus Pargmann's avatar
    can: c_can: Speed up rx_poll function · 4ce78a83
    Markus Pargmann authored
    This patch speeds up the rx_poll function by reducing the number of
    register reads.
    
    Replace the 32bit register read by a 16bit register read. Currently
    the 32bit register read is implemented by using 2 16bit reads. This is
    inefficient as we only use the lower 16bit in rx_poll.
    
    The for loop reads the pending interrupts in every iteration. This
    leads up to 16 reads of pending interrupts. The patch introduces a new
    outer loop to read the pending interrupts as long as 'quota' is above 0.
    This reduces the total number of reads.
    
    The third change is to replace the for-loop by a ffs loop.
    
    Tested on AM335x. I removed all 'static' and 'inline' from c_can.c to
    see the timings for all functions. I used the function tracer with
    trace_stats.
    
    125kbit:
      Function                               Hit    Time            Avg             s^2
      --------                               ---    ----            ---             ---
      c_can_do_rx_poll                     63960    10168178 us     158.977 us      1493056 us
    With patch:
      c_can_do_rx_poll                     63941    3764057 us      58.867 us       776162.2 us
    
    1Mbit:
      Function                               Hit    Time            Avg             s^2
      --------                               ---    ----            ---             ---
      c_can_do_rx_poll                     69489    30049498 us     432.435 us      9271851 us
    With patch:
      c_can_do_rx_poll                    207109    24322185 us     117.436 us      171469047 us
    Signed-off-by: default avatarMarkus Pargmann <mpa@pengutronix.de>
    Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
    4ce78a83
c_can.c 34.5 KB