• Anssi Hannula's avatar
    net: macb: add missing barriers when reading descriptors · 6e0af298
    Anssi Hannula authored
    When reading buffer descriptors on RX or on TX completion, an
    RX_USED/TX_USED bit is checked first to ensure that the descriptors have
    been populated, i.e. the ownership has been transferred. However, there
    are no memory barriers to ensure that the data protected by the
    RX_USED/TX_USED bit is up-to-date with respect to that bit.
    
    Specifically:
    
    - TX timestamp descriptors may be loaded before ctrl is loaded for the
      TX_USED check, which is racy as the descriptors may be updated between
      the loads, causing old timestamp descriptor data to be used.
    
    - RX ctrl may be loaded before addr is loaded for the RX_USED check,
      which is racy as a new frame may be written between the loads, causing
      old ctrl descriptor data to be used.
      This issue exists for both macb_rx() and gem_rx() variants.
    
    Fix the races by adding DMA read memory barriers on those paths and
    reordering the reads in macb_rx().
    
    I have not observed any actual problems in practice caused by these
    being missing, though.
    
    Tested on a ZynqMP based system.
    
    Fixes: 89e5785f ("[PATCH] Atmel MACB ethernet driver")
    Signed-off-by: default avatarAnssi Hannula <anssi.hannula@bitwise.fi>
    Cc: Nicolas Ferre <nicolas.ferre@microchip.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    6e0af298
macb_ptp.c 13.6 KB