• Shaul Triebitz's avatar
    iwlwifi: pcie: avoid empty free RB queue · 868a1e86
    Shaul Triebitz authored
    If all free RB queues are empty, the driver will never restock the
    free RB queue.  That's because the restocking happens in the Rx flow,
    and if the free queue is empty there will be no Rx.
    
    Although there's a background worker (a.k.a. allocator) allocating
    memory for RBs so that the Rx handler can restock them, the worker may
    run only after the free queue has become empty (and then it is too
    late for restocking as explained above).
    
    There is a solution for that called 'emergency': If the number of used
    RB's reaches half the amount of all RB's, the Rx handler will not wait
    for the allocator but immediately allocate memory for the used RB's
    and restock the free queue.
    
    But, since the used RB's is per queue, it may happen that the used
    RB's are spread between the queues such that the emergency check will
    fail for each of the queues
    (and still run out of RBs, causing the above symptom).
    
    To fix it, move to emergency mode if the sum of *all* used RBs (for
    all Rx queues) reaches half the amount of all RB's
    Signed-off-by: default avatarShaul Triebitz <shaul.triebitz@intel.com>
    Signed-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
    868a1e86
rx.c 62.9 KB