public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
From: Ammar Yasser <aerosound161@gmail.com>
To: passt-dev@passt.top
Cc: eperezma@redhat.com, Ammar Yasser <aerosound161@gmail.com>
Subject: [RFC v3 4/8] virtio: Define the pasta vhost interface
Date: Sun,  2 Aug 2026 13:21:51 +0000	[thread overview]
Message-ID: <20260802132155.870796-5-aerosound161@gmail.com> (raw)
In-Reply-To: <20260802132155.870796-1-aerosound161@gmail.com>

- Include the ioctls needed in opening, initializing and registering
  queues and fds with vhost-net
- Create the vq_state type which represents from pasta's perspective our
  state of virtqueue processing
- Define the structures that will represent the actual descriptor
  queues: vring_desc (the actual descriptor chain), vring_used_all (used
  ring for each queue), vring_avail_all (available ring for each queue),
  vhost_memory (the structure that carries the shape of the memory
  region as it should be shared with the kernel)
- Increase PKT_BUF_BYTES by 1536 because the byte array that carries
  the frames needs to also account for virtio_net_hdr_mrg_rxbuf header
  sizes per each frame.
- Define the signatures of functions that will be used in setting up the
  virtqueues with the kernel (set_vring_for_queue, setup_memory_table,
  setup_vhost_net, setup_eventfds).
- Define the signature of rx_descriptor_handoff, which will be used to
  mark descriptors as available again to the driver, and vhost_kick so
  we can notify the driver of our updates

Signed-off-by: Ammar Yasser <aerosound161@gmail.com>
---
 passt.h  |  2 +-
 virtio.h | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 77 insertions(+), 1 deletion(-)

diff --git a/passt.h b/passt.h
index c729316..88a1b03 100644
--- a/passt.h
+++ b/passt.h
@@ -36,7 +36,7 @@ union epoll_ref;
 	((uint8_t [ETH_ALEN]){0x9a, 0x55, 0x9a, 0x55, 0x9a, 0x55})
 
 /* Large enough for ~128 maximum size frames */
-#define PKT_BUF_BYTES		(8UL << 20)
+#define PKT_BUF_BYTES		((8UL << 20) + 1536)	/* 128 * sizeof(virtio_net_hdr_mrg_rxbuf) */
 
 extern char pkt_buf		[PKT_BUF_BYTES];
 
diff --git a/virtio.h b/virtio.h
index 8f2ae06..2d1eef1 100644
--- a/virtio.h
+++ b/virtio.h
@@ -9,14 +9,82 @@
 #ifndef VIRTIO_H
 #define VIRTIO_H
 
+#include <assert.h>
 #include <stdbool.h>
+#include <stddef.h>
 #include <linux/vhost_types.h>
 
+struct ctx;
+
 /* Maximum size of a virtqueue */
 #define VIRTQUEUE_MAX_SIZE 1024
 
 #define VNET_HLEN	(sizeof(struct virtio_net_hdr_mrg_rxbuf))
 
+/* Keep in sync with PKT_BUF_BYTES in passt.h */
+#define PKT_BUF_BYTES		((8UL << 20) + 1536)	/* 128 * sizeof(virtio_net_hdr_mrg_rxbuf) */
+
+#define VHOST_NDESCS (PKT_BUF_BYTES / 65520)
+static_assert(!(VHOST_NDESCS & (VHOST_NDESCS - 1)),
+			 "Number of vhost descs must be a power of two by standard");
+
+
+#define VIRTQUEUE_MAX_SIZE 1024
+
+#define VHOST_VIRTIO         0xAF
+#define VHOST_GET_FEATURES   _IOR(VHOST_VIRTIO, 0x00, __u64)
+#define VHOST_SET_FEATURES   _IOW(VHOST_VIRTIO, 0x00, __u64)
+#define VHOST_SET_OWNER	     _IO(VHOST_VIRTIO, 0x01)
+#define VHOST_SET_MEM_TABLE  _IOW(VHOST_VIRTIO, 0x03, struct vhost_memory)
+#define VHOST_SET_VRING_NUM  _IOW(VHOST_VIRTIO, 0x10, struct vhost_vring_state)
+#define VHOST_SET_VRING_ADDR _IOW(VHOST_VIRTIO, 0x11, struct vhost_vring_addr)
+#define VHOST_SET_VRING_KICK _IOW(VHOST_VIRTIO, 0x20, struct vhost_vring_file)
+#define VHOST_SET_VRING_CALL _IOW(VHOST_VIRTIO, 0x21, struct vhost_vring_file)
+#define VHOST_SET_VRING_ERR  _IOW(VHOST_VIRTIO, 0x22, struct vhost_vring_file)
+#define VHOST_SET_BACKEND_FEATURES _IOW(VHOST_VIRTIO, 0x25, __u64)
+#define VHOST_NET_SET_BACKEND _IOW(VHOST_VIRTIO, 0x30, struct vhost_vring_file)
+
+/**
+ * struct vq_state - Per-virtqueue local descriptor tracking
+ * @num_free:		Number of descriptors ready to be announced
+ *			to the kernel as available via rx_descriptor_handoff()
+ * @last_used_idx:	Number of used-ring entries consumed so far;
+ *			lagging read cursor vs. vring_used->idx (the
+ *			kernel's write cursor)
+ */
+extern struct vq_state {
+	uint16_t num_free;
+	uint16_t last_used_idx;
+	uint16_t next_free;
+} vqs[2];
+
+
+extern struct vring_desc vring_desc[2][VHOST_NDESCS];
+union vring_avail_u {
+	struct vring_avail avail;
+	char buf[offsetof(struct vring_avail, ring[VHOST_NDESCS])];
+};
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wpedantic"
+extern union vring_avail_u vring_avail_all[2];
+#pragma GCC diagnostic pop
+
+union vring_used_u {
+	struct vring_used used;
+	char buf[offsetof(struct vring_used, ring[VHOST_NDESCS])];
+};
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wpedantic"
+extern union vring_used_u vring_used_all[2];
+#pragma GCC diagnostic pop
+
+#define N_VHOST_REGIONS 12
+union vhost_memory_u {
+	struct vhost_memory mem;
+	char buf[offsetof(struct vhost_memory, regions[N_VHOST_REGIONS])];
+};
+extern union vhost_memory_u vhost_memory;
+
 /**
  * struct vu_ring - Virtqueue rings
  * @num:		Size of the queue
@@ -147,6 +215,7 @@ struct vu_virtq_element {
 	struct iovec *out_sg;
 };
 
+void vu_queue_notify(const struct vu_dev *dev, struct vu_virtq *vq);
 /**
  * has_feature() - Check a feature bit in a features set
  * @features:	Features set
@@ -199,4 +268,11 @@ void vu_queue_fill(const struct vu_dev *vdev, struct vu_virtq *vq,
 		   unsigned int idx);
 void vu_queue_flush(const struct vu_dev *vdev, struct vu_virtq *vq,
 		    unsigned int count);
+void set_vring_for_queue(struct ctx *c, int queue_idx, int tap_fd);
+int setup_memory_table(struct ctx *c);
+void setup_vhost_net(struct ctx *c);
+void setup_eventfds(struct ctx *c, int queue_idx);
+void rx_descriptor_handoff(struct ctx *c);
+void vhost_kick(struct vring_used *used, int kick_fd);
+
 #endif /* VIRTIO_H */
-- 
2.34.1


  parent reply	other threads:[~2026-08-02 13:23 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-02 13:21 [RFC v3 0/8] Add vhost-net kernel support to pasta Ammar Yasser
2026-08-02 13:21 ` [RFC v3 1/8] tap: Move the tap_hdr file to a separate file Ammar Yasser
2026-08-02 13:21 ` [RFC v3 2/8] udp,tcp: Make protocol specific buffers public Ammar Yasser
2026-08-02 13:21 ` [RFC v3 3/8] conf: Add context fields, epoll types and the --vhost flag to pasta Ammar Yasser
2026-08-02 13:21 ` Ammar Yasser [this message]
2026-08-02 13:21 ` [RFC v3 5/8] virtio: Implement the pasta vhost functions Ammar Yasser
2026-08-02 13:21 ` [RFC v3 6/8] virtio: Implement pasta vhost acceleration guest->pasta path Ammar Yasser
2026-08-02 13:21 ` [RFC v3 7/8] pasta: Implement pasta vhost TX (pasta->guest) prerequisites Ammar Yasser
2026-08-02 13:21 ` [RFC v3 8/8] tap: Implement pasta vhost TX Ammar Yasser

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260802132155.870796-5-aerosound161@gmail.com \
    --to=aerosound161@gmail.com \
    --cc=eperezma@redhat.com \
    --cc=passt-dev@passt.top \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://passt.top/passt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).