• Jacob Keller's avatar
    i40e/i40evf: use cmpxchg64 when updating private flags in ethtool · 841c950d
    Jacob Keller authored
    When a user gives an invalid command to change a private flag which is
    not supported, either because it is read-only, or the device is not
    capable of the feature, we simply ignore the request.
    
    A naive solution would simply be to report error codes when one of the
    flags was not supported. However, this causes problems because it makes
    the operation not atomic. If a user requests multiple private flags
    together at once we could end up changing one before failing at the
    second flag.
    
    We can do a bit better if we instead update a temporary copy of the
    flags variable in the loop, and then copy it into place after. If we
    aren't careful this has the pitfall of potentially silently overwriting
    any changes caused by other threads.
    
    Avoid this by using cmpxchg64 which will compare and swap the flags
    variable only if it currently matched the old value. We'll report
    -EAGAIN in the (hopefully rare!) case where the cmpxchg64 fails.
    
    This ensures that we can properly report when flags are not supported in
    an atomic fashion without the risk of overwriting other threads changes.
    Signed-off-by: default avatarJacob Keller <jacob.e.keller@intel.com>
    Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
    Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
    841c950d
i40evf_ethtool.c 23.4 KB