• Ira Snyder's avatar
    carma-fpga: fix race between data dumping and DMA callback · 6c15d7af
    Ira Snyder authored
    When the system is under heavy load, we occasionally saw a problem where
    the system would get a legitimate interrupt when they should be
    disabled.
    
    This was caused by the data_dma_cb() DMA callback unconditionally
    re-enabling FPGA interrupts even when data dumping is disabled. When
    data dumping was re-enabled, the irq handler would fire while a DMA was
    in progress. The "BUG_ON(priv->inflight != NULL);" during the second
    invocation of the DMA callback caused the system to crash.
    
    To fix the issue, the priv->enabled boolean is moved under the
    protection of the priv->lock spinlock. The DMA callback checks the
    boolean to know whether to re-enable FPGA interrupts before it returns.
    
    Now that it is fixed, the driver keeps FPGA interrupts disabled when it
    expects that they are disabled, fixing the bug.
    Signed-off-by: default avatarIra W. Snyder <iws@ovro.caltech.edu>
    Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
    6c15d7af
carma-fpga.c 36.7 KB