• Zhu Yi's avatar
    iwlwifi: use paged Rx · 2f301227
    Zhu Yi authored
    
    
    This switches the iwlwifi driver to use paged skb from linear skb for Rx
    buffer. So that it relieves some Rx buffer allocation pressure for the
    memory subsystem. Currently iwlwifi (4K for 3945) requests 8K bytes for
    Rx buffer. Due to the trailing skb_shared_info in the skb->data,
    alloc_skb() will do the next order allocation, which is 16K bytes. This
    is suboptimal and more likely to fail when the system is under memory
    usage pressure. Switching to paged Rx skb lets us allocate the RXB
    directly by alloc_pages(), so that only order 1 allocation is required.
    
    It also adjusts the area spin_lock (with IRQ disabled) protected in the
    tasklet because tasklet guarentees to run only on one CPU and the new
    unprotected code can be preempted by the IRQ handler. This saves us from
    spawning another workqueue to make skb_linearize/__pskb_pull_tail happy
    (which cannot be called in hard irq context).
    
    Finally, mac80211 doesn't support paged Rx yet. So we linearize the skb
    for all the management frames and software decryption or defragmentation
    required data frames before handed to mac80211. For all the other frames,
    we __pskb_pull_tail 64 bytes in the linear area of the skb for mac80211
    to handle them properly.
    Signed-off-by: default avatarZhu Yi <yi.zhu@intel.com>
    Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
    2f301227
iwl-core.c 87.4 KB