From nobody Thu Oct 2 04:50:30 2025 Received: from unimail.uni-dortmund.de (mx1.hrz.uni-dortmund.de [129.217.128.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D81C028725A; Mon, 22 Sep 2025 22:17:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=129.217.128.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758579433; cv=none; b=j1kqb5+COdeUliU6+DtZ5FG0uB/+akI1goC1mahu504zR+c1Vvavxoia/7JFRszeDACK8zL0nk9CVmmHPkSGJiJ9M5K7unQtaMmbrX7va9XzIdVrlaSAg3C4z0smgV4qzSVmgxaxCcrYclj1e6JFhkvscWyj5ojo7TppU4FpjAY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758579433; c=relaxed/simple; bh=aRqxQBtjU6+rvyZVBu/BLGv3XNOiqN63EK6zK9acjS0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rBaQix8ihIQArSdvYqui2BJx16TQ/WZZ2xsH0UsW0td4Ks9wVLfGsnDpzr7YUBM1AyoHz5b1mN/hlUBbSb0dpavRFYqZBAJjY9dbSLcezmo5GqOhPoK7AaiX925+fChUCWLbKZhrYkTCSvhk2O2Z00Pzd10hZZ+es+0gtbOBiFw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=tu-dortmund.de; spf=pass smtp.mailfrom=tu-dortmund.de; dkim=pass (1024-bit key) header.d=tu-dortmund.de header.i=@tu-dortmund.de header.b=E/J15dFW; arc=none smtp.client-ip=129.217.128.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=tu-dortmund.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tu-dortmund.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=tu-dortmund.de header.i=@tu-dortmund.de header.b="E/J15dFW" Received: from simon-Latitude-5450.fritz.box (p5dc88066.dip0.t-ipconnect.de [93.200.128.102]) (authenticated bits=0) by unimail.uni-dortmund.de (8.18.1.10/8.18.1.10) with ESMTPSA id 58MMH4en003919 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Tue, 23 Sep 2025 00:17:07 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tu-dortmund.de; s=unimail; t=1758579428; bh=aRqxQBtjU6+rvyZVBu/BLGv3XNOiqN63EK6zK9acjS0=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=E/J15dFWROga6n6cRlsCwaio02tipl9T9AO72hyiym+6rD/r5r/8GSfOgNGuW6ELT AgKtZOskiEA60dIKWuJbLWQXKLmxDoNWzYZOd/g7pOb4z5qAMm6KzJez933H95/Omu lB6pA6lnN4xHhrHLuz5BiOhVFHhflQYpehDH8c/A= From: Simon Schippers To: willemdebruijn.kernel@gmail.com, jasowang@redhat.com, mst@redhat.com, eperezma@redhat.com, stephen@networkplumber.org, leiyang@redhat.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, virtualization@lists.linux.dev, kvm@vger.kernel.org Cc: Simon Schippers , Tim Gebauer Subject: [PATCH net-next v5 8/8] vhost_net: Replace rx_ring with calls of TUN/TAP wrappers Date: Tue, 23 Sep 2025 00:15:53 +0200 Message-ID: <20250922221553.47802-9-simon.schippers@tu-dortmund.de> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250922221553.47802-1-simon.schippers@tu-dortmund.de> References: <20250922221553.47802-1-simon.schippers@tu-dortmund.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Instead of the rx_ring, the virtqueue saves the interface type TUN, TAP (or IF_NONE) to call TUN/TAP wrappers. Co-developed-by: Tim Gebauer Signed-off-by: Tim Gebauer Signed-off-by: Simon Schippers --- drivers/vhost/net.c | 90 +++++++++++++++++++++++++++++---------------- 1 file changed, 58 insertions(+), 32 deletions(-) diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index c6508fe0d5c8..6be17b53cc6c 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c @@ -127,10 +127,10 @@ struct vhost_net_virtqueue { /* Reference counting for outstanding ubufs. * Protected by vq mutex. Writers must also take device mutex. */ struct vhost_net_ubuf_ref *ubufs; - struct ptr_ring *rx_ring; struct vhost_net_buf rxq; /* Batched XDP buffs */ struct xdp_buff *xdp; + enum if_type {IF_NONE =3D 0, TUN, TAP} type; }; =20 struct vhost_net { @@ -176,24 +176,54 @@ static void *vhost_net_buf_consume(struct vhost_net_b= uf *rxq) return ret; } =20 -static int vhost_net_buf_produce(struct vhost_net_virtqueue *nvq) +static int vhost_net_buf_produce(struct vhost_net_virtqueue *nvq, + struct sock *sk) { + struct file *file =3D sk->sk_socket->file; struct vhost_net_buf *rxq =3D &nvq->rxq; =20 rxq->head =3D 0; - rxq->tail =3D ptr_ring_consume_batched(nvq->rx_ring, rxq->queue, - VHOST_NET_BATCH); + + switch (nvq->type) { + case TUN: + rxq->tail =3D tun_ring_consume_batched(file, + rxq->queue, VHOST_NET_BATCH); + break; + case TAP: + rxq->tail =3D tap_ring_consume_batched(file, + rxq->queue, VHOST_NET_BATCH); + break; + case IF_NONE: + WARN_ON_ONCE(); + } + return rxq->tail; } =20 -static void vhost_net_buf_unproduce(struct vhost_net_virtqueue *nvq) +static void vhost_net_buf_unproduce(struct vhost_net_virtqueue *nvq, + struct socket *sk) { struct vhost_net_buf *rxq =3D &nvq->rxq; - - if (nvq->rx_ring && !vhost_net_buf_is_empty(rxq)) { - ptr_ring_unconsume(nvq->rx_ring, rxq->queue + rxq->head, - vhost_net_buf_get_size(rxq), - tun_ptr_free); + struct file *file; + + if (sk && !vhost_net_buf_is_empty(rxq)) { + file =3D sk->file; + switch (nvq->type) { + case TUN: + tun_ring_unconsume(file, + rxq->queue + rxq->head, + vhost_net_buf_get_size(rxq), + tun_ptr_free); + break; + case TAP: + tap_ring_unconsume(file, + rxq->queue + rxq->head, + vhost_net_buf_get_size(rxq), + tun_ptr_free); + break; + case IF_NONE: + return; + } rxq->head =3D rxq->tail =3D 0; } } @@ -209,14 +239,15 @@ static int vhost_net_buf_peek_len(void *ptr) return __skb_array_len_with_tag(ptr); } =20 -static int vhost_net_buf_peek(struct vhost_net_virtqueue *nvq) +static int vhost_net_buf_peek(struct vhost_net_virtqueue *nvq, + struct sock *sk) { struct vhost_net_buf *rxq =3D &nvq->rxq; =20 if (!vhost_net_buf_is_empty(rxq)) goto out; =20 - if (!vhost_net_buf_produce(nvq)) + if (!vhost_net_buf_produce(nvq, sk)) return 0; =20 out: @@ -998,8 +1029,8 @@ static int peek_head_len(struct vhost_net_virtqueue *r= vq, struct sock *sk) int len =3D 0; unsigned long flags; =20 - if (rvq->rx_ring) - return vhost_net_buf_peek(rvq); + if (rvq->type) + return vhost_net_buf_peek(rvq, sk); =20 spin_lock_irqsave(&sk->sk_receive_queue.lock, flags); head =3D skb_peek(&sk->sk_receive_queue); @@ -1207,7 +1238,7 @@ static void handle_rx(struct vhost_net *net) goto out; } busyloop_intr =3D false; - if (nvq->rx_ring) + if (nvq->type) msg.msg_control =3D vhost_net_buf_consume(&nvq->rxq); /* On overrun, truncate and discard */ if (unlikely(headcount > UIO_MAXIOV)) { @@ -1363,7 +1394,7 @@ static int vhost_net_open(struct inode *inode, struct= file *f) n->vqs[i].batched_xdp =3D 0; n->vqs[i].vhost_hlen =3D 0; n->vqs[i].sock_hlen =3D 0; - n->vqs[i].rx_ring =3D NULL; + n->vqs[i].type =3D IF_NONE; vhost_net_buf_init(&n->vqs[i].rxq); } vhost_dev_init(dev, vqs, VHOST_NET_VQ_MAX, @@ -1393,8 +1424,8 @@ static struct socket *vhost_net_stop_vq(struct vhost_= net *n, sock =3D vhost_vq_get_backend(vq); vhost_net_disable_vq(n, vq); vhost_vq_set_backend(vq, NULL); - vhost_net_buf_unproduce(nvq); - nvq->rx_ring =3D NULL; + vhost_net_buf_unproduce(nvq, sock); + nvq->type =3D IF_NONE; mutex_unlock(&vq->mutex); return sock; } @@ -1474,18 +1505,13 @@ static struct socket *get_raw_socket(int fd) return ERR_PTR(r); } =20 -static struct ptr_ring *get_tap_ptr_ring(struct file *file) +static enum if_type get_if_type(struct file *file) { - struct ptr_ring *ring; - ring =3D tun_get_tx_ring(file); - if (!IS_ERR(ring)) - goto out; - ring =3D tap_get_ptr_ring(file); - if (!IS_ERR(ring)) - goto out; - ring =3D NULL; -out: - return ring; + if (is_tap_file(file)) + return TAP; + if (is_tun_file(file)) + return TUN; + return IF_NONE; } =20 static struct socket *get_tap_socket(int fd) @@ -1567,7 +1593,7 @@ static long vhost_net_set_backend(struct vhost_net *n= , unsigned index, int fd) =20 vhost_net_disable_vq(n, vq); vhost_vq_set_backend(vq, sock); - vhost_net_buf_unproduce(nvq); + vhost_net_buf_unproduce(nvq, sock); r =3D vhost_vq_init_access(vq); if (r) goto err_used; @@ -1576,9 +1602,9 @@ static long vhost_net_set_backend(struct vhost_net *n= , unsigned index, int fd) goto err_used; if (index =3D=3D VHOST_NET_VQ_RX) { if (sock) - nvq->rx_ring =3D get_tap_ptr_ring(sock->file); + nvq->type =3D get_if_type(sock->file); else - nvq->rx_ring =3D NULL; + nvq->type =3D IF_NONE; } =20 oldubufs =3D nvq->ubufs; --=20 2.43.0