bmips: check NAPI context when refilling rx SKB
Check if we're in NAPI context when refilling rx. Normally we're almost always running in NAPI context. Dispatch to napi_alloc_frag() directly instead of relying on netdev_alloc_frag() which does the same but with the overhead of local_bh_disable/enable. Signed-off-by: Sieng Piaw Liew <liew.s.piaw@gmail.com> [improve code format] Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
This commit is contained in:
		 Sieng Piaw Liew
					Sieng Piaw Liew
				
			
				
					committed by
					
						 Álvaro Fernández Rojas
						Álvaro Fernández Rojas
					
				
			
			
				
	
			
			
			 Álvaro Fernández Rojas
						Álvaro Fernández Rojas
					
				
			
						parent
						
							71ef4ec47c
						
					
				
				
					commit
					a332b8cc9c
				
			| @@ -256,7 +256,7 @@ static inline void dmas_writel(struct bcm6368_enetsw *priv, u32 val, | |||||||
| /* | /* | ||||||
|  * refill rx queue |  * refill rx queue | ||||||
|  */ |  */ | ||||||
| static int bcm6368_enetsw_refill_rx(struct net_device *dev) | static int bcm6368_enetsw_refill_rx(struct net_device *dev, bool napi_mode) | ||||||
| { | { | ||||||
| 	struct bcm6368_enetsw *priv = netdev_priv(dev); | 	struct bcm6368_enetsw *priv = netdev_priv(dev); | ||||||
|  |  | ||||||
| @@ -269,8 +269,12 @@ static int bcm6368_enetsw_refill_rx(struct net_device *dev) | |||||||
| 		desc = &priv->rx_desc_cpu[desc_idx]; | 		desc = &priv->rx_desc_cpu[desc_idx]; | ||||||
|  |  | ||||||
| 		if (!priv->rx_buf[desc_idx]) { | 		if (!priv->rx_buf[desc_idx]) { | ||||||
| 			unsigned char *buf = | 			unsigned char *buf; | ||||||
| 				netdev_alloc_frag(priv->rx_frag_size); |  | ||||||
|  | 			if (likely(napi_mode)) | ||||||
|  | 				buf = napi_alloc_frag(priv->rx_frag_size); | ||||||
|  | 			else | ||||||
|  | 				buf = netdev_alloc_frag(priv->rx_frag_size); | ||||||
|  |  | ||||||
| 			if (unlikely(!buf)) | 			if (unlikely(!buf)) | ||||||
| 				break; | 				break; | ||||||
| @@ -319,7 +323,7 @@ static void bcm6368_enetsw_refill_rx_timer(struct timer_list *t) | |||||||
| 	struct net_device *dev = priv->net_dev; | 	struct net_device *dev = priv->net_dev; | ||||||
|  |  | ||||||
| 	spin_lock(&priv->rx_lock); | 	spin_lock(&priv->rx_lock); | ||||||
| 	bcm6368_enetsw_refill_rx(dev); | 	bcm6368_enetsw_refill_rx(dev, false); | ||||||
| 	spin_unlock(&priv->rx_lock); | 	spin_unlock(&priv->rx_lock); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -419,7 +423,7 @@ static int bcm6368_enetsw_receive_queue(struct net_device *dev, int budget) | |||||||
| 	} while (--budget > 0); | 	} while (--budget > 0); | ||||||
|  |  | ||||||
| 	if (processed || !priv->rx_desc_count) { | 	if (processed || !priv->rx_desc_count) { | ||||||
| 		bcm6368_enetsw_refill_rx(dev); | 		bcm6368_enetsw_refill_rx(dev, true); | ||||||
|  |  | ||||||
| 		/* kick rx dma */ | 		/* kick rx dma */ | ||||||
| 		dmac_writel(priv, priv->dma_chan_en_mask, | 		dmac_writel(priv, priv->dma_chan_en_mask, | ||||||
| @@ -725,7 +729,7 @@ static int bcm6368_enetsw_open(struct net_device *dev) | |||||||
| 	dma_writel(priv, DMA_BUFALLOC_FORCE_MASK | 0, | 	dma_writel(priv, DMA_BUFALLOC_FORCE_MASK | 0, | ||||||
| 		   DMA_BUFALLOC_REG(priv->rx_chan)); | 		   DMA_BUFALLOC_REG(priv->rx_chan)); | ||||||
|  |  | ||||||
| 	if (bcm6368_enetsw_refill_rx(dev)) { | 	if (bcm6368_enetsw_refill_rx(dev, false)) { | ||||||
| 		dev_err(kdev, "cannot allocate rx buffer queue\n"); | 		dev_err(kdev, "cannot allocate rx buffer queue\n"); | ||||||
| 		ret = -ENOMEM; | 		ret = -ENOMEM; | ||||||
| 		goto out; | 		goto out; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user