Commit 53d5fa9b authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'virtio_net-build_skb-fixes'



Xuan Zhuo says:

====================
virtio-net: fix for build_skb()

The logic of this piece is really messy. Fortunately, my refactored patch can be
completed with a small amount of testing.
====================

Acked-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents dd9082f4 8fb7da9e
Loading
Loading
Loading
Loading
+8 −12
Original line number Diff line number Diff line
@@ -401,18 +401,13 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi,
	/* 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 (headroom) {
		/* Buffers with headroom use PAGE_SIZE as alloc size,
		 * see add_recvbuf_mergeable() + get_mergeable_buf_len()
		 */
		truesize = PAGE_SIZE;
		tailroom = truesize - len - offset;
		buf = page_address(page);
	} 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;
@@ -958,7 +953,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, headroom);
						       metasize,
						       VIRTIO_XDP_HEADROOM);
				return head_skb;
			}
			break;