linux: mvebu: backport mvneta XDP support fixes
This patch backports additional fixes for XDP support in the mvneta driver. These changes are found upstream as commits: b37fa92e20ef2 net: mvneta: fix build skb for bm capable devices f383b2950070c net: mvneta: rely on page_pool_recycle_direct in mvneta_run_xdp 79572c98c554d mvneta driver disallow XDP program on hardware buffer management 44efc78d0e464 net: mvneta: fix XDP support if sw bm is used as fallback Signed-off-by: Jakov Petrina <jakov.petrina@sartura.hr>
This commit is contained in:
		 Jakov Petrina
					Jakov Petrina
				
			
				
					committed by
					
						 Luka Perkov
						Luka Perkov
					
				
			
			
				
	
			
			
			 Luka Perkov
						Luka Perkov
					
				
			
						parent
						
							76f9aa6f4b
						
					
				
				
					commit
					3dbb658d26
				
			| @@ -0,0 +1,41 @@ | |||||||
|  | From b37fa92e20ef28aada852cbf03b368d29a20478c Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Lorenzo Bianconi <lorenzo@kernel.org> | ||||||
|  | Date: Thu, 14 Nov 2019 01:25:55 +0200 | ||||||
|  | Subject: [PATCH] net: mvneta: fix build skb for bm capable devices | ||||||
|  |  | ||||||
|  | Fix build_skb for bm capable devices when they fall-back using swbm path | ||||||
|  | (e.g. when bm properties are configured in device tree but | ||||||
|  | CONFIG_MVNETA_BM_ENABLE is not set). In this case rx_offset_correction is | ||||||
|  | overwritten so we need to use it building skb instead of | ||||||
|  | MVNETA_SKB_HEADROOM directly | ||||||
|  |  | ||||||
|  | Fixes: 8dc9a0888f4c ("net: mvneta: rely on build_skb in mvneta_rx_swbm poll routine") | ||||||
|  | Fixes: 0db51da7a8e9 ("net: mvneta: add basic XDP support") | ||||||
|  | Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> | ||||||
|  | Reported-by: Andrew Lunn <andrew@lunn.ch> | ||||||
|  | Tested-by: Andrew Lunn <andrew@lunn.ch> | ||||||
|  | Signed-off-by: David S. Miller <davem@davemloft.net> | ||||||
|  | --- | ||||||
|  |  drivers/net/ethernet/marvell/mvneta.c | 4 ++-- | ||||||
|  |  1 file changed, 2 insertions(+), 2 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/ethernet/marvell/mvneta.c | ||||||
|  | +++ b/drivers/net/ethernet/marvell/mvneta.c | ||||||
|  | @@ -2165,7 +2165,7 @@ mvneta_swbm_rx_frame(struct mvneta_port | ||||||
|  |  	prefetch(data); | ||||||
|  |   | ||||||
|  |  	xdp->data_hard_start = data; | ||||||
|  | -	xdp->data = data + MVNETA_SKB_HEADROOM + MVNETA_MH_SIZE; | ||||||
|  | +	xdp->data = data + pp->rx_offset_correction + MVNETA_MH_SIZE; | ||||||
|  |  	xdp->data_end = xdp->data + data_len; | ||||||
|  |  	xdp_set_data_meta_invalid(xdp); | ||||||
|  |   | ||||||
|  | @@ -2230,7 +2230,7 @@ mvneta_swbm_add_rx_fragment(struct mvnet | ||||||
|  |  		/* refill descriptor with new buffer later */ | ||||||
|  |  		skb_add_rx_frag(rxq->skb, | ||||||
|  |  				skb_shinfo(rxq->skb)->nr_frags, | ||||||
|  | -				page, MVNETA_SKB_HEADROOM, data_len, | ||||||
|  | +				page, pp->rx_offset_correction, data_len, | ||||||
|  |  				PAGE_SIZE); | ||||||
|  |  	} | ||||||
|  |  	page_pool_release_page(rxq->page_pool, page); | ||||||
| @@ -0,0 +1,39 @@ | |||||||
|  | From f383b2950070ce4f34e74db94f70bb565b746e97 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Lorenzo Bianconi <lorenzo@kernel.org> | ||||||
|  | Date: Wed, 20 Nov 2019 16:54:17 +0200 | ||||||
|  | Subject: [PATCH] net: mvneta: rely on page_pool_recycle_direct in | ||||||
|  |  mvneta_run_xdp | ||||||
|  |  | ||||||
|  | Rely on page_pool_recycle_direct and not on xdp_return_buff in | ||||||
|  | mvneta_run_xdp. This is a preliminary patch to limit the dma sync len | ||||||
|  | to the one strictly necessary | ||||||
|  |  | ||||||
|  | Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> | ||||||
|  | Acked-by: Jesper Dangaard Brouer <brouer@redhat.com> | ||||||
|  | Signed-off-by: David S. Miller <davem@davemloft.net> | ||||||
|  | --- | ||||||
|  |  drivers/net/ethernet/marvell/mvneta.c | 6 ++++-- | ||||||
|  |  1 file changed, 4 insertions(+), 2 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/ethernet/marvell/mvneta.c | ||||||
|  | +++ b/drivers/net/ethernet/marvell/mvneta.c | ||||||
|  | @@ -2108,7 +2108,8 @@ mvneta_run_xdp(struct mvneta_port *pp, s | ||||||
|  |  		err = xdp_do_redirect(pp->dev, xdp, prog); | ||||||
|  |  		if (err) { | ||||||
|  |  			ret = MVNETA_XDP_DROPPED; | ||||||
|  | -			xdp_return_buff(xdp); | ||||||
|  | +			page_pool_recycle_direct(rxq->page_pool, | ||||||
|  | +						 virt_to_head_page(xdp->data)); | ||||||
|  |  		} else { | ||||||
|  |  			ret = MVNETA_XDP_REDIR; | ||||||
|  |  		} | ||||||
|  | @@ -2117,7 +2118,8 @@ mvneta_run_xdp(struct mvneta_port *pp, s | ||||||
|  |  	case XDP_TX: | ||||||
|  |  		ret = mvneta_xdp_xmit_back(pp, xdp); | ||||||
|  |  		if (ret != MVNETA_XDP_TX) | ||||||
|  | -			xdp_return_buff(xdp); | ||||||
|  | +			page_pool_recycle_direct(rxq->page_pool, | ||||||
|  | +						 virt_to_head_page(xdp->data)); | ||||||
|  |  		break; | ||||||
|  |  	default: | ||||||
|  |  		bpf_warn_invalid_xdp_action(act); | ||||||
| @@ -0,0 +1,53 @@ | |||||||
|  | From 79572c98c554dcdb080bca547c871a51716dcdf8 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Sven Auhagen <sven.auhagen@voleatech.de> | ||||||
|  | Date: Sat, 25 Jan 2020 08:07:03 +0000 | ||||||
|  | Subject: [PATCH] mvneta driver disallow XDP program on hardware buffer | ||||||
|  |  management | ||||||
|  |  | ||||||
|  | Recently XDP Support was added to the mvneta driver | ||||||
|  | for software buffer management only. | ||||||
|  | It is still possible to attach an XDP program if | ||||||
|  | hardware buffer management is used. | ||||||
|  | It is not doing anything at that point. | ||||||
|  |  | ||||||
|  | The patch disallows attaching XDP programs to mvneta | ||||||
|  | if hardware buffer management is used. | ||||||
|  |  | ||||||
|  | I am sorry about that. It is my first submission and I am having | ||||||
|  | some troubles with the format of my emails. | ||||||
|  |  | ||||||
|  | v4 -> v5: | ||||||
|  | - Remove extra tabs | ||||||
|  |  | ||||||
|  | v3 -> v4: | ||||||
|  | - Please ignore v3 I accidentally submitted | ||||||
|  |   my other patch with git-send-mail and v4 is correct | ||||||
|  |  | ||||||
|  | v2 -> v3: | ||||||
|  | - My mailserver corrupted the patch | ||||||
|  |   resubmission with git-send-email | ||||||
|  |  | ||||||
|  | v1 -> v2: | ||||||
|  | - Fixing the patches indentation | ||||||
|  |  | ||||||
|  | Signed-off-by: Sven Auhagen <sven.auhagen@voleatech.de> | ||||||
|  | Signed-off-by: David S. Miller <davem@davemloft.net> | ||||||
|  | --- | ||||||
|  |  drivers/net/ethernet/marvell/mvneta.c | 6 ++++++ | ||||||
|  |  1 file changed, 6 insertions(+) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/ethernet/marvell/mvneta.c | ||||||
|  | +++ b/drivers/net/ethernet/marvell/mvneta.c | ||||||
|  | @@ -4231,6 +4231,12 @@ static int mvneta_xdp_setup(struct net_d | ||||||
|  |  		return -EOPNOTSUPP; | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | +	if (pp->bm_priv) { | ||||||
|  | +		NL_SET_ERR_MSG_MOD(extack, | ||||||
|  | +				   "Hardware Buffer Management not supported on XDP"); | ||||||
|  | +		return -EOPNOTSUPP; | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  |  	need_update = !!pp->xdp_prog != !!prog; | ||||||
|  |  	if (running && need_update) | ||||||
|  |  		mvneta_stop(dev); | ||||||
| @@ -0,0 +1,67 @@ | |||||||
|  | From 44efc78d0e464ce70b45b165c005f8bedc17952e Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Lorenzo Bianconi <lorenzo@kernel.org> | ||||||
|  | Date: Wed, 29 Jan 2020 12:50:53 +0100 | ||||||
|  | Subject: [PATCH] net: mvneta: fix XDP support if sw bm is used as fallback | ||||||
|  |  | ||||||
|  | In order to fix XDP support if sw buffer management is used as fallback | ||||||
|  | for hw bm devices, define MVNETA_SKB_HEADROOM as maximum between | ||||||
|  | XDP_PACKET_HEADROOM and NET_SKB_PAD and let the hw aligns the IP header | ||||||
|  | to 4-byte boundary. | ||||||
|  | Fix rx_offset_correction initialization if mvneta_bm_port_init fails in | ||||||
|  | mvneta_resume routine | ||||||
|  |  | ||||||
|  | Fixes: 0db51da7a8e9 ("net: mvneta: add basic XDP support") | ||||||
|  | Tested-by: Sven Auhagen <sven.auhagen@voleatech.de> | ||||||
|  | Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> | ||||||
|  | Signed-off-by: David S. Miller <davem@davemloft.net> | ||||||
|  | --- | ||||||
|  |  drivers/net/ethernet/marvell/mvneta.c | 10 +++++++--- | ||||||
|  |  1 file changed, 7 insertions(+), 3 deletions(-) | ||||||
|  |  | ||||||
|  | --- a/drivers/net/ethernet/marvell/mvneta.c | ||||||
|  | +++ b/drivers/net/ethernet/marvell/mvneta.c | ||||||
|  | @@ -324,8 +324,7 @@ | ||||||
|  |  	      ETH_HLEN + ETH_FCS_LEN,			     \ | ||||||
|  |  	      cache_line_size()) | ||||||
|  |   | ||||||
|  | -#define MVNETA_SKB_HEADROOM	(max(XDP_PACKET_HEADROOM, NET_SKB_PAD) + \ | ||||||
|  | -				 NET_IP_ALIGN) | ||||||
|  | +#define MVNETA_SKB_HEADROOM	max(XDP_PACKET_HEADROOM, NET_SKB_PAD) | ||||||
|  |  #define MVNETA_SKB_PAD	(SKB_DATA_ALIGN(sizeof(struct skb_shared_info) + \ | ||||||
|  |  			 MVNETA_SKB_HEADROOM)) | ||||||
|  |  #define MVNETA_SKB_SIZE(len)	(SKB_DATA_ALIGN(len) + MVNETA_SKB_PAD) | ||||||
|  | @@ -1172,6 +1171,7 @@ bm_mtu_err: | ||||||
|  |  	mvneta_bm_pool_destroy(pp->bm_priv, pp->pool_short, 1 << pp->id); | ||||||
|  |   | ||||||
|  |  	pp->bm_priv = NULL; | ||||||
|  | +	pp->rx_offset_correction = MVNETA_SKB_HEADROOM; | ||||||
|  |  	mvreg_write(pp, MVNETA_ACC_MODE, MVNETA_ACC_MODE_EXT1); | ||||||
|  |  	netdev_info(pp->dev, "fail to update MTU, fall back to software BM\n"); | ||||||
|  |  } | ||||||
|  | @@ -4954,7 +4954,6 @@ static int mvneta_probe(struct platform_ | ||||||
|  |  	SET_NETDEV_DEV(dev, &pdev->dev); | ||||||
|  |   | ||||||
|  |  	pp->id = global_port_id++; | ||||||
|  | -	pp->rx_offset_correction = MVNETA_SKB_HEADROOM; | ||||||
|  |   | ||||||
|  |  	/* Obtain access to BM resources if enabled and already initialized */ | ||||||
|  |  	bm_node = of_parse_phandle(dn, "buffer-manager", 0); | ||||||
|  | @@ -4979,6 +4978,10 @@ static int mvneta_probe(struct platform_ | ||||||
|  |  	} | ||||||
|  |  	of_node_put(bm_node); | ||||||
|  |   | ||||||
|  | +	/* sw buffer management */ | ||||||
|  | +	if (!pp->bm_priv) | ||||||
|  | +		pp->rx_offset_correction = MVNETA_SKB_HEADROOM; | ||||||
|  | + | ||||||
|  |  	err = mvneta_init(&pdev->dev, pp); | ||||||
|  |  	if (err < 0) | ||||||
|  |  		goto err_netdev; | ||||||
|  | @@ -5136,6 +5139,7 @@ static int mvneta_resume(struct device * | ||||||
|  |  		err = mvneta_bm_port_init(pdev, pp); | ||||||
|  |  		if (err < 0) { | ||||||
|  |  			dev_info(&pdev->dev, "use SW buffer management\n"); | ||||||
|  | +			pp->rx_offset_correction = MVNETA_SKB_HEADROOM; | ||||||
|  |  			pp->bm_priv = NULL; | ||||||
|  |  		} | ||||||
|  |  	} | ||||||
		Reference in New Issue
	
	Block a user