• Krzysztof Kazimierczak's avatar
    ice: need_wakeup flag might not be set for Tx · 682dfedc
    Krzysztof Kazimierczak authored
    This is a port of i40e commit 70563957 ("i40e: need_wakeup flag might
    not be set for Tx").
    
    Quoting the original commit message:
    
    "The need_wakeup flag for Tx might not be set for AF_XDP sockets that
    are only used to send packets. This happens if there is at least one
    outstanding packet that has not been completed by the hardware and we
    get that corresponding completion (which will not generate an interrupt
    since interrupts are disabled in the napi poll loop) between the time we
    stopped processing the Tx completions and interrupts are enabled again.
    In this case, the need_wakeup flag will have been cleared at the end of
    the Tx completion processing as we believe we will get an interrupt from
    the outstanding completion at a later point in time. But if this
    completion interrupt occurs before interrupts are enable, we lose it and
    should at that point really have set the need_wakeup flag since there
    are no more outstanding completions that can generate an interrupt to
    continue the processing. When this happens, user space will see a Tx
    queue need_wakeup of 0 and skip issuing a syscall, which means will
    never get into the Tx processing again and we have a deadlock."
    
    As a result, packet processing stops. This patch introduces a fix for
    this issue, by always setting the need_wakeup flag at the end of an
    interrupt processing. This ensures that the deadlock will not happen.
    Signed-off-by: default avatarKrzysztof Kazimierczak <krzysztof.kazimierczak@intel.com>
    Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
    Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
    682dfedc
ice_xsk.c 20.9 KB