• Z
    iwlwifi: use GFP_KERNEL to allocate Rx SKB memory · f1bc4ac6
    Zhu Yi 提交于
    Previously we allocate Rx SKB with GFP_ATOMIC flag. This is because we need
    to hold a spinlock to protect the two rx_used and rx_free lists operation
    in the rxq.
    
    	spin_lock();
    	...
    	element = rxq->rx_used.next;
    	element->skb = alloc_skb(..., GFP_ATOMIC);
    	list_del(element);
    	list_add_tail(&element->list, &rxq->rx_free);
    	...
    	spin_unlock();
    
    After spliting the rx_used delete and rx_free insert into two operations,
    we don't require the skb allocation in an atomic context any more (the
    function itself is scheduled in a workqueue).
    
    	spin_lock();
    	...
    	element = rxq->rx_used.next;
    	list_del(element);
    	...
    	spin_unlock();
    	...
    	element->skb = alloc_skb(..., GFP_KERNEL);
    	...
    	spin_lock()
    	...
    	list_add_tail(&element->list, &rxq->rx_free);
    	...
    	spin_unlock();
    
    This patch should fix the "iwlagn: Can not allocate SKB buffers" warning
    we see recently.
    Signed-off-by: NZhu Yi <yi.zhu@intel.com>
    Acked-by: NTomas Winkler <tomas.winkler@intel.com>
    Cc: stable@kernel.org
    Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
    f1bc4ac6
iwl-rx.c 34.8 KB