Commit 4d313f2b authored by Jason Wang's avatar Jason Wang Committed by Jakub Kicinski
Browse files

tun: remove unnecessary tun_xdp_hdr structure



With f95f0f95("net, xdp: Introduce xdp_init_buff utility routine"),
buffer length could be stored as frame size so there's no need to have
a dedicated tun_xdp_hdr structure. We can simply store virtio net
header instead.

Acked-by: default avatarWillem de Bruijn <willemb@google.com>
Signed-off-by: default avatarJason Wang <jasowang@redhat.com>
Link: https://patch.msgid.link/20250701010352.74515-1-jasowang@redhat.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 285c895f
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -1044,9 +1044,8 @@ static const struct file_operations tap_fops = {

static int tap_get_user_xdp(struct tap_queue *q, struct xdp_buff *xdp)
{
	struct tun_xdp_hdr *hdr = xdp->data_hard_start;
	struct virtio_net_hdr *gso = &hdr->gso;
	int buflen = hdr->buflen;
	struct virtio_net_hdr *gso = xdp->data_hard_start;
	int buflen = xdp->frame_sz;
	int vnet_hdr_len = 0;
	struct tap_dev *tap;
	struct sk_buff *skb;
+2 −3
Original line number Diff line number Diff line
@@ -2356,13 +2356,12 @@ static int tun_xdp_one(struct tun_struct *tun,
		       struct tun_page *tpage)
{
	unsigned int datasize = xdp->data_end - xdp->data;
	struct tun_xdp_hdr *hdr = xdp->data_hard_start;
	struct virtio_net_hdr *gso = &hdr->gso;
	struct virtio_net_hdr *gso = xdp->data_hard_start;
	struct bpf_prog *xdp_prog;
	struct sk_buff *skb = NULL;
	struct sk_buff_head *queue;
	u32 rxhash = 0, act;
	int buflen = hdr->buflen;
	int buflen = xdp->frame_sz;
	int metasize = 0;
	int ret = 0;
	bool skb_xdp = false;
+2 −6
Original line number Diff line number Diff line
@@ -668,7 +668,6 @@ static int vhost_net_build_xdp(struct vhost_net_virtqueue *nvq,
	struct socket *sock = vhost_vq_get_backend(vq);
	struct virtio_net_hdr *gso;
	struct xdp_buff *xdp = &nvq->xdp[nvq->batched_xdp];
	struct tun_xdp_hdr *hdr;
	size_t len = iov_iter_count(from);
	int headroom = vhost_sock_xdp(sock) ? XDP_PACKET_HEADROOM : 0;
	int buflen = SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
@@ -691,15 +690,13 @@ static int vhost_net_build_xdp(struct vhost_net_virtqueue *nvq,
	if (unlikely(!buf))
		return -ENOMEM;

	copied = copy_from_iter(buf + offsetof(struct tun_xdp_hdr, gso),
				sock_hlen, from);
	copied = copy_from_iter(buf, sock_hlen, from);
	if (copied != sock_hlen) {
		ret = -EFAULT;
		goto err;
	}

	hdr = buf;
	gso = &hdr->gso;
	gso = buf;

	if (!sock_hlen)
		memset(buf, 0, pad);
@@ -727,7 +724,6 @@ static int vhost_net_build_xdp(struct vhost_net_virtqueue *nvq,

	xdp_init_buff(xdp, buflen, NULL);
	xdp_prepare_buff(xdp, buf, pad, len, true);
	hdr->buflen = buflen;

	++nvq->batched_xdp;

+0 −5
Original line number Diff line number Diff line
@@ -19,11 +19,6 @@ struct tun_msg_ctl {
	void *ptr;
};

struct tun_xdp_hdr {
	int buflen;
	struct virtio_net_hdr gso;
};

#if defined(CONFIG_TUN) || defined(CONFIG_TUN_MODULE)
struct socket *tun_get_socket(struct file *);
struct ptr_ring *tun_get_tx_ring(struct file *file);