Commit c32325b8 authored by Jakub Kicinski's avatar Jakub Kicinski Committed by David S. Miller
Browse files

virtio-net: realign page_to_skb() after merges



We ended up merging two versions of the same patch set:

commit 8fb7da9e ("virtio_net: get build_skb() buf by data ptr")
commit 5c37711d ("virtio-net: fix for unable to handle page fault for address")

into net, and

commit 7bf64460 ("virtio-net: get build_skb() buf by data ptr")
commit 6c66c147 ("virtio-net: fix for unable to handle page fault for address")

into net-next. Redo the merge from commit 12628565 ("Merge
ra.kernel.org:/pub/scm/linux/kernel/git/netdev/net"), so that
the most recent code remains.

Acked-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
Acked-by: default avatarJason Wang <jasowang@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent dc1a8079
Loading
Loading
Loading
Loading
+8 −19
Original line number Diff line number Diff line
@@ -380,7 +380,7 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi,
				   struct page *page, unsigned int offset,
				   unsigned int len, unsigned int truesize,
				   bool hdr_valid, unsigned int metasize,
				   bool whole_page)
				   unsigned int headroom)
{
	struct sk_buff *skb;
	struct virtio_net_hdr_mrg_rxbuf *hdr;
@@ -398,28 +398,16 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi,
	else
		hdr_padded_len = sizeof(struct padded_vnet_hdr);

	/* If whole_page, there is an offset between the beginning of the
	/* If headroom is not 0, there is an offset between the beginning of the
	 * data and the allocated space, otherwise the data and the allocated
	 * space are aligned.
	 *
	 * Buffers with headroom use PAGE_SIZE as alloc size, see
	 * add_recvbuf_mergeable() + get_mergeable_buf_len()
	 */
	if (whole_page) {
		/* Buffers with whole_page use PAGE_SIZE as alloc size,
		 * see add_recvbuf_mergeable() + get_mergeable_buf_len()
		 */
		truesize = PAGE_SIZE;

		/* page maybe head page, so we should get the buf by p, not the
		 * page
		 */
		tailroom = truesize - len - offset_in_page(p);
		buf = (char *)((unsigned long)p & PAGE_MASK);
	} else {
		tailroom = truesize - len;
		buf = p;
	}
	truesize = headroom ? PAGE_SIZE : truesize;
	tailroom = truesize - len - headroom;
	buf = p - headroom;

	len -= hdr_len;
	offset += hdr_padded_len;
@@ -978,7 +966,8 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
				put_page(page);
				head_skb = page_to_skb(vi, rq, xdp_page, offset,
						       len, PAGE_SIZE, false,
						       metasize, true);
						       metasize,
						       VIRTIO_XDP_HEADROOM);
				return head_skb;
			}
			break;
@@ -1029,7 +1018,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
	rcu_read_unlock();

	head_skb = page_to_skb(vi, rq, page, offset, len, truesize, !xdp_prog,
			       metasize, !!headroom);
			       metasize, headroom);
	curr_skb = head_skb;

	if (unlikely(!curr_skb))