Skip to content
  • David S. Miller's avatar
    [NET]: Add NAPI_STATE_DISABLE. · a0a46196
    David S. Miller authored
    
    
    Create a bit to signal that a napi_disable() is in progress.
    
    This sets up infrastructure such that net_rx_action() can generically
    break out of the ->poll() loop on a NAPI context that has a pending
    napi_disable() yet is being bombed with packets (and thus would
    otherwise poll endlessly and not allow the napi_disable() to finish).
    
    Now, what napi_disable() does is first set the NAPI_STATE_DISABLE bit
    (to indicate that a disable is pending), then it polls for the
    NAPI_STATE_SCHED bit, and once the NAPI_STATE_SCHED bit is acquired
    the NAPI_STATE_DISABLE bit is cleared.  Here, the test_and_set_bit()
    provides the necessary memory barrier between the various bitops.
    
    napi_schedule_prep() now tests for a pending disable as it's first
    action and won't try to obtain the NAPI_STATE_SCHED bit if a disable
    is pending.
    
    As a result, we can remove the netif_running() check in
    netif_rx_schedule_prep() because the NAPI disable pending state serves
    this purpose.  And, it does so in a NAPI centric manner which is what
    we really want.
    
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    a0a46196