• Gregory Greenman's avatar
    iwlwifi: pcie: avoid restocks inside rx loop if not emergency · e0e168dc
    Gregory Greenman authored
    When trying to reach high Rx throughput of more than 500Mbps on
    a device with a relatively weak CPU (Atom x5-Z8500), CPU utilization
    may become a bottleneck. Analysis showed that we are looping in
    iwl_pcie_rx_handle for very long periods which led to starvation
    of other threads (iwl_pcie_rx_handle runs with _bh disabled).
    We were handling Rx and allocating new buffers and the new buffers
    were ready quickly enough to be available before we had finished
    handling all the buffers available in the hardware. As a
    consequence, we called iwl_pcie_rxq_restock to refill the hardware
    with the new buffers, and start again handling new buffers without
    exiting the function. Since we read the hardware pointer again when
    we goto restart, new buffers were handled immediately instead of
    exiting the function.
    
    This patch avoids refilling RBs inside rx handling loop, unless an
    emergency situation is reached. It also doesn't read the hardware
    pointer again unless we are in an emergency (unlikely) case.
    This significantly reduce the maximal time we spend in
    iwl_pcie_rx_handle with _bh disabled.
    Signed-off-by: default avatarGregory Greenman <gregory.greenman@intel.com>
    Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
    e0e168dc
rx.c 56.9 KB