Commit b51f4113 authored by Yunsheng Lin's avatar Yunsheng Lin Committed by David S. Miller
Browse files

net: introduce and use skb_frag_fill_page_desc()



Most users use __skb_frag_set_page()/skb_frag_off_set()/
skb_frag_size_set() to fill the page desc for a skb frag.

Introduce skb_frag_fill_page_desc() to do that.

net/bpf/test_run.c does not call skb_frag_off_set() to
set the offset, "copy_from_user(page_address(page), ...)"
and 'shinfo' being part of the 'data' kzalloced in
bpf_test_init() suggest that it is assuming offset to be
initialized as zero, so call skb_frag_fill_page_desc()
with offset being zero for this case.

Also, skb_frag_set_page() is not used anymore, so remove
it.

Signed-off-by: default avatarYunsheng Lin <linyunsheng@huawei.com>
Reviewed-by: default avatarLeon Romanovsky <leonro@nvidia.com>
Reviewed-by: default avatarSimon Horman <simon.horman@corigine.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 305c0418
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -532,10 +532,10 @@ static bool aq_add_rx_fragment(struct device *dev,
					      buff_->rxdata.pg_off,
					      buff_->len,
					      DMA_FROM_DEVICE);
		skb_frag_off_set(frag, buff_->rxdata.pg_off);
		skb_frag_size_set(frag, buff_->len);
		sinfo->xdp_frags_size += buff_->len;
		__skb_frag_set_page(frag, buff_->rxdata.page);
		skb_frag_fill_page_desc(frag, buff_->rxdata.page,
					buff_->rxdata.pg_off,
					buff_->len);

		buff_->is_cleaned = 1;

+2 −3
Original line number Diff line number Diff line
@@ -1085,9 +1085,8 @@ static u32 __bnxt_rx_agg_pages(struct bnxt *bp,
			    RX_AGG_CMP_LEN) >> RX_AGG_CMP_LEN_SHIFT;

		cons_rx_buf = &rxr->rx_agg_ring[cons];
		skb_frag_off_set(frag, cons_rx_buf->offset);
		skb_frag_size_set(frag, frag_len);
		__skb_frag_set_page(frag, cons_rx_buf->page);
		skb_frag_fill_page_desc(frag, cons_rx_buf->page,
					cons_rx_buf->offset, frag_len);
		shinfo->nr_frags = i + 1;
		__clear_bit(cons, rxr->rx_agg_bmap);

+2 −3
Original line number Diff line number Diff line
@@ -2184,9 +2184,8 @@ static void lro_add_page(struct adapter *adap, struct sge_qset *qs,
	len -= offset;

	rx_frag += nr_frags;
	__skb_frag_set_page(rx_frag, sd->pg_chunk.page);
	skb_frag_off_set(rx_frag, sd->pg_chunk.offset + offset);
	skb_frag_size_set(rx_frag, len);
	skb_frag_fill_page_desc(rx_frag, sd->pg_chunk.page,
				sd->pg_chunk.offset + offset, len);

	skb->len += len;
	skb->data_len += len;
+17 −15
Original line number Diff line number Diff line
@@ -2343,10 +2343,9 @@ static void skb_fill_rx_data(struct be_rx_obj *rxo, struct sk_buff *skb,
		hdr_len = ETH_HLEN;
		memcpy(skb->data, start, hdr_len);
		skb_shinfo(skb)->nr_frags = 1;
		skb_frag_set_page(skb, 0, page_info->page);
		skb_frag_off_set(&skb_shinfo(skb)->frags[0],
				 page_info->page_offset + hdr_len);
		skb_frag_size_set(&skb_shinfo(skb)->frags[0],
		skb_frag_fill_page_desc(&skb_shinfo(skb)->frags[0],
					page_info->page,
					page_info->page_offset + hdr_len,
					curr_frag_len - hdr_len);
		skb->data_len = curr_frag_len - hdr_len;
		skb->truesize += rx_frag_size;
@@ -2369,16 +2368,17 @@ static void skb_fill_rx_data(struct be_rx_obj *rxo, struct sk_buff *skb,
		if (page_info->page_offset == 0) {
			/* Fresh page */
			j++;
			skb_frag_set_page(skb, j, page_info->page);
			skb_frag_off_set(&skb_shinfo(skb)->frags[j],
					 page_info->page_offset);
			skb_frag_size_set(&skb_shinfo(skb)->frags[j], 0);
			skb_frag_fill_page_desc(&skb_shinfo(skb)->frags[j],
						page_info->page,
						page_info->page_offset,
						curr_frag_len);
			skb_shinfo(skb)->nr_frags++;
		} else {
			put_page(page_info->page);
			skb_frag_size_add(&skb_shinfo(skb)->frags[j],
					  curr_frag_len);
		}

		skb_frag_size_add(&skb_shinfo(skb)->frags[j], curr_frag_len);
		skb->len += curr_frag_len;
		skb->data_len += curr_frag_len;
		skb->truesize += rx_frag_size;
@@ -2451,14 +2451,16 @@ static void be_rx_compl_process_gro(struct be_rx_obj *rxo,
		if (i == 0 || page_info->page_offset == 0) {
			/* First frag or Fresh page */
			j++;
			skb_frag_set_page(skb, j, page_info->page);
			skb_frag_off_set(&skb_shinfo(skb)->frags[j],
					 page_info->page_offset);
			skb_frag_size_set(&skb_shinfo(skb)->frags[j], 0);
			skb_frag_fill_page_desc(&skb_shinfo(skb)->frags[j],
						page_info->page,
						page_info->page_offset,
						curr_frag_len);
		} else {
			put_page(page_info->page);
			skb_frag_size_add(&skb_shinfo(skb)->frags[j],
					  curr_frag_len);
		}
		skb_frag_size_add(&skb_shinfo(skb)->frags[j], curr_frag_len);

		skb->truesize += rx_frag_size;
		remaining -= curr_frag_len;
		memset(page_info, 0, sizeof(*page_info));
+2 −3
Original line number Diff line number Diff line
@@ -1445,9 +1445,8 @@ static void enetc_add_rx_buff_to_xdp(struct enetc_bdr *rx_ring, int i,
		xdp_buff_set_frag_pfmemalloc(xdp_buff);

	frag = &shinfo->frags[shinfo->nr_frags];
	skb_frag_off_set(frag, rx_swbd->page_offset);
	skb_frag_size_set(frag, size);
	__skb_frag_set_page(frag, rx_swbd->page);
	skb_frag_fill_page_desc(frag, rx_swbd->page, rx_swbd->page_offset,
				size);

	shinfo->nr_frags++;
}
Loading