• Shannon Nelson's avatar
    ionic: sync the filters in the work task · 969f8439
    Shannon Nelson authored
    In order to separate the atomic needs of __dev_uc_sync()
    and __dev_mc_sync() from the safe rx_mode handling, we need
    to have the ndo handler manipulate the driver's filter list,
    and later have the driver sync the filters to the firmware,
    outside of the atomic context.
    
    Here we put __dev_mc_sync() and __dev_uc_sync() back into the
    ndo callback to give them their netif_addr_lock context and
    have them update the driver's filter list, flagging changes
    that should be made to the device filter list.  Later, in the
    rx_mode handler, we read those hints and sync up the device's
    list as needed.
    
    It is possible for multiple add/delete requests to come from
    the stack before the rx_mode task processes the list, but the
    handling of the sync status flag should keep everything sorted
    correctly.  For example, if a delete of an existing filter is
    followed by another add before the rx_mode task is run, as can
    happen when going in and out of a bond, the add will cancel
    the delete and no actual changes will be sent to the device.
    
    We also add a check in the watchdog to see if there are any
    stray unsync'd filters, possibly left over from a filter
    overflow and waiting to get sync'd after some other filter
    gets removed to make room.
    Signed-off-by: default avatarShannon Nelson <snelson@pensando.io>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    969f8439
ionic_dev.c 17.8 KB