• David Vrabel's avatar
    xen-netfront: use napi_complete() correctly to prevent Rx stalling · 6a6dc08f
    David Vrabel authored
    After d75b1ade (net: less interrupt
    masking in NAPI) the napi instance is removed from the per-cpu list
    prior to calling the n->poll(), and is only requeued if all of the
    budget was used.  This inadvertently broke netfront because netfront
    does not use NAPI correctly.
    
    If netfront had not used all of its budget it would do a final check
    for any Rx responses and avoid calling napi_complete() if there were
    more responses.  It would still return under budget so it would never
    be rescheduled.  The final check would also not re-enable the Rx
    interrupt.
    
    Additionally, xenvif_poll() would also call napi_complete() /after/
    enabling the interrupt.  This resulted in a race between the
    napi_complete() and the napi_schedule() in the interrupt handler.  The
    use of local_irq_save/restore() avoided by race iff the handler is
    running on the same CPU but not if it was running on a different CPU.
    
    Fix both of these by always calling napi_compete() if the budget was
    not all used, and then calling napi_schedule() if the final checks
    says there's more work.
    Signed-off-by: default avatarDavid Vrabel <david.vrabel@citrix.com>
    Cc: Eric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    6a6dc08f
xen-netfront.c 54.9 KB