• Jacob Keller's avatar
    i40e: reset all VFs in parallel when rebuilding PF · e4b433f4
    Jacob Keller authored
    When there are a lot of active VFs, it can take multiple seconds to
    finish resetting all of them during certain flows., which can cause some
    VFs to fail to wait long enough for the reset to occur. The user might
    see messages like "Never saw reset" or "Reset never finished" and the VF
    driver will stop functioning properly.
    
    The naive solution would be to simply increase the wait timer. We can
    get much more clever. Notice that i40e_reset_vf is run in a serialized
    fashion, and includes lots of delays.
    
    There are two prominent delays which take most of the time. First, when
    we begin resetting VFs, we have multiple 10ms delays which accrue
    because we reset each VF in a serial fashion. These delays accumulate to
    almost 4 seconds when handling the maximum number of VFs (128).
    
    Secondly, there is a massive 50ms delay for each time we disable queues
    on a VSI. This delay is necessary to allow HW to finish disabling queues
    before we restore functionality. However, just like with the first case,
    we are paying the cost for each VF, rather than disabling all VFs and
    waiting once.
    
    Both of these can be fixed, but required some previous refactoring to
    handle the special case. First, we will need the
    i40e_vsi_wait_queues_disabled function which was previously DCB
    specific. Second, we will need to implement our own
    i40e_vsi_stop_rings_no_wait function which will handle the stopping of
    rings without the delays.
    
    Finally, implement an i40e_reset_all_vfs function, which will first
    start the reset of all VFs, and pay the wait cost all at once, rather
    than serially waiting for each VF before we start processing then next
    one. After the VF has been reset, we'll disable all the VF queues, and
    then wait for them to disable. Again, we'll organize the flow such that
    we pay the wait cost only once.
    
    Finally, after we've disabled queues we'll go ahead and begin restoring
    VF functionality. The result is reducing the wait time by a large factor
    and ensuring that VFs do not timeout when waiting in the VF driver.
    
    Change-ID: Ia6e8cf8d98131b78aec89db78afb8d905c9b12be
    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>
    e4b433f4
i40e_virtchnl_pf.c 89.7 KB