• Jacob Keller's avatar
    fm10k: don't loop while resetting VFs due to VFLR event · d876c158
    Jacob Keller authored
    We've always had a really weird looping construction for resetting VFs.
    We read the VFLRE register and reset the VF if the corresponding bit is
    set, which makes sense. However we loop continuously until we no longer
    have any bits left unset. At first this makes sense, as a sort of "keep
    trying until we succeed" concept.
    
    Unfortunately this causes a problem if we happen to surprise remove
    while this code is executing, because in this case we'll always read all
    1s for the VFLRE register. This results in a hard lockup on the CPU
    because the loop will never terminate.
    
    Because our own reset function will clear the VFLR event register
    always, (except when we've lost PCIe link obviously) there is no real
    reason to loop. In practice, we'll loop over once and find that no VFs
    are pending anymore.
    
    Lets just check once. Since we're clear the notification when we reset
    there's no benefit to the loop. Additionally, there shouldn't be a race
    as future VLFRE events should trigger an interrupt. Additionally, we
    didn't warn or do anything in the looped case anyways.
    Signed-off-by: default avatarJacob Keller <jacob.e.keller@intel.com>
    Tested-by: default avatarKrishneil Singh <krishneil.k.singh@intel.com>
    Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
    d876c158
fm10k_iov.c 14.1 KB