[master] 773fd2397 cache_range: Add VDPIO Support

Nils Goroll nils.goroll at uplex.de
Fri Jul 4 17:04:05 UTC 2025


commit 773fd239762b0c5236e23b0dea9b934be60d8b49
Author: Nils Goroll <nils.goroll at uplex.de>
Date:   Tue Mar 11 12:11:20 2025 +0100

    cache_range: Add VDPIO Support

diff --git a/bin/varnishd/cache/cache_range.c b/bin/varnishd/cache/cache_range.c
index 2a60fa03b..73e7cc1a4 100644
--- a/bin/varnishd/cache/cache_range.c
+++ b/bin/varnishd/cache/cache_range.c
@@ -233,11 +233,111 @@ vrg_range_init(VRT_CTX, struct vdp_ctx *vdc, void **priv)
 	return (1);
 }
 
+static int v_matchproto_(vdpio_init_f)
+vrg_range_io_upgrade(VRT_CTX, struct vdp_ctx *vdc, void **priv, int capacity)
+{
+
+	(void)ctx;
+	(void)vdc;
+	(void)priv;
+
+	return (capacity);
+}
+
+static int v_matchproto_(vdpio_lease_f)
+vrg_range_io_lease(struct vdp_ctx *vdc, struct vdp_entry *this, struct vscarab *out)
+{
+	struct vrg_priv *vrg_priv;
+	struct viov *v;
+	ssize_t l, ll;
+	int r;
+
+	CHECK_OBJ_NOTNULL(vdc, VDP_CTX_MAGIC);
+	CHECK_OBJ_NOTNULL(this, VDP_ENTRY_MAGIC);
+	VSCARAB_CHECK(out);
+
+	CAST_OBJ_NOTNULL(vrg_priv, this->priv, VRG_PRIV_MAGIC);
+
+	if (vrg_priv->range_off >= vrg_priv->range_high) {
+		out->flags |= VSCARAB_F_END;
+		return (0);
+	}
+	if (out->capacity == out->used)
+		return (0);
+
+	// ensure we do not pull more than we can return
+	VSCARAB_LOCAL(in, out->capacity - out->used);
+
+	while (vrg_priv->range_off < vrg_priv->range_low) {
+		r = vdpio_pull(vdc, this, in);
+		out->flags |= in->flags;
+		if (r <= 0)
+			return (r);
+		l = vrg_priv->range_low - vrg_priv->range_off;
+		VSCARAB_FOREACH(v, in) {
+			ll = vmin(l, (ssize_t)v->iov.iov_len);
+			v->iov.iov_base = (char *)v->iov.iov_base + ll;
+			v->iov.iov_len -= ll;
+			l -= ll;
+			if (l == 0)
+				break;
+		}
+		vrg_priv->range_off = vrg_priv->range_low - l;
+
+		vdpio_consolidate_vscarab(vdc, in);
+
+		if (l != 0)
+			AZ(in->used);
+		else
+			assert(vrg_priv->range_off == vrg_priv->range_low);
+	}
+
+	assert(vrg_priv->range_off >= vrg_priv->range_low);
+	assert(vrg_priv->range_off <= vrg_priv->range_high);
+
+	if (in->used == 0) {
+		r = vdpio_pull(vdc, this, in);
+		out->flags |= in->flags;
+		if (r <= 0)
+			return (r);
+	}
+
+	AN(in->used);
+
+	r = 0;
+	l = vrg_priv->range_high - vrg_priv->range_off;
+	VSCARAB_FOREACH(v, in) {
+		vrg_priv->range_off += (ssize_t)v->iov.iov_len;
+		ll = vmin(l, (ssize_t)v->iov.iov_len);
+		v->iov.iov_len = ll;
+		if (ll == 0)
+			vdpio_return_lease(vdc, v->lease);
+		else {
+			VSCARAB_ADD(out, *v);
+			l -= ll;
+			r++;
+		}
+	}
+	if (vrg_priv->range_off >= vrg_priv->range_high)
+		out->flags |= VSCARAB_F_END;
+	return (r);
+}
+
+static void v_matchproto_(vdpio_fini_f)
+vrg_range_io_fini(struct vdp_ctx *vdc, void **priv)
+{
+	AZ(vrg_range_fini(vdc, priv));
+}
+
 const struct vdp VDP_range = {
 	.name =		"range",
 	.init =		vrg_range_init,
 	.bytes =	vrg_range_bytes,
 	.fini =		vrg_range_fini,
+
+	.io_upgrade =	vrg_range_io_upgrade,
+	.io_lease =	vrg_range_io_lease,
+	.io_fini =	vrg_range_io_fini,
 };
 
 /*--------------------------------------------------------------------*/


More information about the varnish-commit mailing list