• Shani Michaelli's avatar
    net/mlx4_en: Protect MAC address modification with the state_lock mutex · fe1ff29d
    Shani Michaelli authored
    This Patches solves an issue that could raise when modifying the
    device's MAC. It occurs due to a simultaneous access to priv->mac_hash
    from two contexts. The buggy scenario described below:
    Context 1: copy the new mac address to the dev->dev_addr field.
    Context 2: mlx4_en_do_uc_filter removes prev_mac entry from the mac_hash
               db since it is not in dev->uc and not equal to dev->dev_addr.
    Context 1: mlx4_en_do_set_mac() calls mlx4_en_replace_mac() to replace
               prev_mac with dev_addr but it fails to update the mac_hash db
               since it no longer contains prev_mac, therefore it returns
               with an error.
    
    The fix is to prevent mlx4_en_do_uc_filter from being executed by both
    of the context 1 calls described above, This is done by putting them
    both under the mdev->state_lock lock, it will solve this issue since
    mlx4_en_do_uc_filter is already protected by the mdev->state_lock.
    Reviewed-by: default avatarEyal Perry <eyalpe@mellanox.com>
    Signed-off-by: default avatarShani Michaeli <shanim@mellanox.com>
    Signed-off-by: default avatarAmir Vadai <amirv@mellanox.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    fe1ff29d
en_netdev.c 69.5 KB