diff options
| author | Jason Gunthorpe <jgg@nvidia.com> | 2023-08-15 10:01:26 -0300 | 
|---|---|---|
| committer | Jason Gunthorpe <jgg@nvidia.com> | 2023-08-15 10:01:26 -0300 | 
| commit | a35762dd14adb952442e487d8dad4bb50b614b2b (patch) | |
| tree | 4d21de11837f293860db8abbea8db161f1018edb /drivers/net/xen-netback/netback.c | |
| parent | 23a1b46f15d57583927742738579363f179942b1 (diff) | |
| parent | 2ccdd1b13c591d306f0401d98dedc4bdcd02b421 (diff) | |
Merge tag 'v6.5-rc6' into iommufd for-next
Required for following patches.
Resolve merge conflict by using the hunk from the for-next branch and
shifting the iommufd_object_deref_user() into iommufd_hw_pagetable_put()
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Diffstat (limited to 'drivers/net/xen-netback/netback.c')
| -rw-r--r-- | drivers/net/xen-netback/netback.c | 15 | 
1 files changed, 10 insertions, 5 deletions
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index c8d20cddf658..88f760a7cbc3 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c @@ -396,7 +396,7 @@ static void xenvif_get_requests(struct xenvif_queue *queue,  	struct gnttab_map_grant_ref *gop = queue->tx_map_ops + *map_ops;  	struct xen_netif_tx_request *txp = first; -	nr_slots = shinfo->nr_frags + 1; +	nr_slots = shinfo->nr_frags + frag_overflow + 1;  	copy_count(skb) = 0;  	XENVIF_TX_CB(skb)->split_mask = 0; @@ -462,8 +462,8 @@ static void xenvif_get_requests(struct xenvif_queue *queue,  		}  	} -	for (shinfo->nr_frags = 0; shinfo->nr_frags < nr_slots; -	     shinfo->nr_frags++, gop++) { +	for (shinfo->nr_frags = 0; nr_slots > 0 && shinfo->nr_frags < MAX_SKB_FRAGS; +	     shinfo->nr_frags++, gop++, nr_slots--) {  		index = pending_index(queue->pending_cons++);  		pending_idx = queue->pending_ring[index];  		xenvif_tx_create_map_op(queue, pending_idx, txp, @@ -476,12 +476,12 @@ static void xenvif_get_requests(struct xenvif_queue *queue,  			txp++;  	} -	if (frag_overflow) { +	if (nr_slots > 0) {  		shinfo = skb_shinfo(nskb);  		frags = shinfo->frags; -		for (shinfo->nr_frags = 0; shinfo->nr_frags < frag_overflow; +		for (shinfo->nr_frags = 0; shinfo->nr_frags < nr_slots;  		     shinfo->nr_frags++, txp++, gop++) {  			index = pending_index(queue->pending_cons++);  			pending_idx = queue->pending_ring[index]; @@ -492,6 +492,11 @@ static void xenvif_get_requests(struct xenvif_queue *queue,  		}  		skb_shinfo(skb)->frag_list = nskb; +	} else if (nskb) { +		/* A frag_list skb was allocated but it is no longer needed +		 * because enough slots were converted to copy ops above. +		 */ +		kfree_skb(nskb);  	}  	(*copy_ops) = cop - queue->tx_copy_ops;  | 
