• Sukadev Bhattiprolu's avatar
    ibmvnic: delay complete() · 6b278c0c
    Sukadev Bhattiprolu authored
    If we get CRQ_INIT, we set errno to -EIO and first call complete() to
    notify the waiter. Then we try to schedule a FAILOVER reset. If this
    occurs while adapter is in PROBING state, ibmvnic_reset() changes the
    error code to EAGAIN and returns without scheduling the FAILOVER. The
    purpose of setting error code to EAGAIN is to ask the waiter to retry.
    
    But due to the earlier complete() call, the waiter may already have seen
    the -EIO response and decided not to retry. This can cause intermittent
    failures when bringing up ibmvnic adapters during boot, specially in
    in kexec/kdump kernels.
    
    Defer the complete() call until after scheduling the reset.
    
    Also streamline the error code to EAGAIN. Don't see why we need EIO
    sometimes. All 3 callers of ibmvnic_reset_init() can handle EAGAIN.
    
    Fixes: 17c87058 ("ibmvnic: Return error code if init interrupted by transport event")
    Reported-by: default avatarVaishnavi Bhat <vaish123@in.ibm.com>
    Signed-off-by: default avatarSukadev Bhattiprolu <sukadev@linux.ibm.com>
    Reviewed-by: default avatarDany Madden <drt@linux.ibm.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    6b278c0c
ibmvnic.c 156 KB