[master] 19cc1e4cc STV temp buffer API

Dridi Boukelmoune dridi.boukelmoune at gmail.com
Mon Aug 30 08:31:06 UTC 2021


commit 19cc1e4cca5b932299dd88b56e4a6b791eb6673e
Author: Martin Blix Grydeland <martin at varnish-software.com>
Date:   Tue Jun 22 11:48:49 2021 +0200

    STV temp buffer API
    
    This is an API for getting an arbitrary buffer through the
    stevedores. The stevedore in question may then deploy LRU nuking or other
    measures to control resource usage.

diff --git a/bin/varnishd/cache/cache_varnishd.h b/bin/varnishd/cache/cache_varnishd.h
index bf246677a..c3defbdce 100644
--- a/bin/varnishd/cache/cache_varnishd.h
+++ b/bin/varnishd/cache/cache_varnishd.h
@@ -553,6 +553,11 @@ void STV_BanExport(const uint8_t *banlist, unsigned len);
 int STV_NewObject(struct worker *, struct objcore *,
     const struct stevedore *, unsigned len);
 
+struct stv_buffer;
+struct stv_buffer *STV_AllocBuf(struct worker *wrk, const struct stevedore *stv,
+    size_t size);
+void STV_FreeBuf(struct worker *wrk, struct stv_buffer **pstvbuf);
+void *STV_GetBufPtr(struct stv_buffer *stvbuf, size_t *psize);
 
 #if WITH_PERSISTENT_STORAGE
 /* storage_persistent.c */
diff --git a/bin/varnishd/storage/stevedore.c b/bin/varnishd/storage/stevedore.c
index 9edf85774..498822b69 100644
--- a/bin/varnishd/storage/stevedore.c
+++ b/bin/varnishd/storage/stevedore.c
@@ -96,6 +96,74 @@ STV_NewObject(struct worker *wrk, struct objcore *oc,
 
 /*-------------------------------------------------------------------*/
 
+struct stv_buffer {
+	unsigned		magic;
+#define STV_BUFFER_MAGIC	0xf39cb6c2
+	const struct stevedore	*stv;
+	size_t			size;
+	uintptr_t		priv;
+};
+
+struct stv_buffer *
+STV_AllocBuf(struct worker *wrk, const struct stevedore *stv, size_t size)
+{
+	struct stv_buffer *stvbuf;
+	uint8_t *buf;
+	uintptr_t priv = 0;
+
+	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+	CHECK_OBJ_NOTNULL(stv, STEVEDORE_MAGIC);
+
+	if (size == 0)
+		return (NULL);
+	if (stv->allocbuf == NULL)
+		return (NULL);
+
+	buf = stv->allocbuf(wrk, stv, size + PRNDUP(sizeof *stvbuf), &priv);
+	if (buf == NULL)
+		return (NULL);
+
+	assert(PAOK(buf));
+	stvbuf = (void *)buf;
+	INIT_OBJ(stvbuf, STV_BUFFER_MAGIC);
+	stvbuf->stv = stv;
+	stvbuf->priv = priv;
+	stvbuf->size = size;
+
+	return (stvbuf);
+}
+
+void
+STV_FreeBuf(struct worker *wrk, struct stv_buffer **pstvbuf)
+{
+	struct stv_buffer *stvbuf;
+	const struct stevedore *stv;
+	uintptr_t priv;
+
+	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+	TAKE_OBJ_NOTNULL(stvbuf, pstvbuf, STV_BUFFER_MAGIC);
+	CHECK_OBJ_NOTNULL(stvbuf->stv, STEVEDORE_MAGIC);
+
+	stv = stvbuf->stv;
+	priv = stvbuf->priv;
+	CHECK_OBJ_NOTNULL(stv, STEVEDORE_MAGIC);
+	ZERO_OBJ(stvbuf, sizeof *stvbuf);
+
+	AN(stv->freebuf);
+	stv->freebuf(wrk, stv, priv);
+}
+
+void *
+STV_GetBufPtr(struct stv_buffer *stvbuf, size_t *psize)
+{
+	CHECK_OBJ_NOTNULL(stvbuf, STV_BUFFER_MAGIC);
+	if (psize)
+		*psize = stvbuf->size;
+	return (&stvbuf[1]);
+}
+
+/*-------------------------------------------------------------------*/
+
 void
 STV_open(void)
 {
diff --git a/bin/varnishd/storage/storage.h b/bin/varnishd/storage/storage.h
index c6cda8998..3ad4ecc55 100644
--- a/bin/varnishd/storage/storage.h
+++ b/bin/varnishd/storage/storage.h
@@ -75,6 +75,10 @@ typedef void storage_banexport_f(const struct stevedore *, const uint8_t *bans,
     unsigned len);
 typedef void storage_panic_f(struct vsb *vsb, const struct objcore *oc);
 
+typedef void *storage_allocbuf_f(struct worker *, const struct stevedore *,
+    size_t size, uintptr_t *ppriv);
+typedef void storage_freebuf_f(struct worker *, const struct stevedore *,
+    uintptr_t priv);
 
 typedef struct object *sml_getobj_f(struct worker *, struct objcore *);
 typedef struct storage *sml_alloc_f(const struct stevedore *, size_t size);
@@ -104,6 +108,8 @@ struct stevedore {
 	storage_baninfo_f	*baninfo;
 	storage_banexport_f	*banexport;
 	storage_panic_f		*panic;
+	storage_allocbuf_f	*allocbuf;
+	storage_freebuf_f	*freebuf;
 
 	/* Only if SML is used */
 	sml_alloc_f		*sml_alloc;


More information about the varnish-commit mailing list