• N
    can: rcar_canfd: fix possible IRQ storm on high load · 8b25344f
    Nikita Yushchenko 提交于
    commit d4b890aec4bea7334ca2ca56fd3b12fb48a00cd1 upstream.
    
    We have observed rcar_canfd driver entering IRQ storm under high load,
    with following scenario:
    - rcar_canfd_global_interrupt() in entered due to Rx available,
    - napi_schedule_prep() is called, and sets NAPIF_STATE_SCHED in state
    - Rx fifo interrupts are masked,
    - rcar_canfd_global_interrupt() is entered again, this time due to
      error interrupt (e.g. due to overflow),
    - since scheduled napi poller has not yet executed, condition for calling
      napi_schedule_prep() from rcar_canfd_global_interrupt() remains true,
      thus napi_schedule_prep() gets called and sets NAPIF_STATE_MISSED flag
      in state,
    - later, napi poller function rcar_canfd_rx_poll() gets executed, and
      calls napi_complete_done(),
    - due to NAPIF_STATE_MISSED flag in state, this call does not clear
      NAPIF_STATE_SCHED flag from state,
    - on return from napi_complete_done(), rcar_canfd_rx_poll() unmasks Rx
      interrutps,
    - Rx interrupt happens, rcar_canfd_global_interrupt() gets called
      and calls napi_schedule_prep(),
    - since NAPIF_STATE_SCHED is set in state at this time, this call
      returns false,
    - due to that false return, rcar_canfd_global_interrupt() returns
      without masking Rx interrupt
    - and this results into IRQ storm: unmasked Rx interrupt happens again
      and again is misprocessed in the same way.
    
    This patch fixes that scenario by unmasking Rx interrupts only when
    napi_complete_done() returns true, which means it has cleared
    NAPIF_STATE_SCHED in state.
    
    Fixes: dd3bd23e ("can: rcar_canfd: Add Renesas R-Car CAN FD driver")
    Signed-off-by: NNikita Yushchenko <nikita.yoush@cogentembedded.com>
    Cc: linux-stable <stable@vger.kernel.org>
    Signed-off-by: NMarc Kleine-Budde <mkl@pengutronix.de>
    Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
    8b25344f
rcar_canfd.c 53.6 KB