[master] d4d7b385e Give struct worker a private stash for things vmods should not frob.

Poul-Henning Kamp phk at FreeBSD.org
Wed May 5 08:07:06 UTC 2021


commit d4d7b385ef61f64cfcdfc5389a6437641d5317b6
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Wed May 5 08:06:06 2021 +0000

    Give struct worker a private stash for things vmods should not frob.

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index d5b7f458e..7c7e0a15e 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -87,23 +87,24 @@ enum {
 
 /*--------------------------------------------------------------------*/
 
-struct VSC_lck;
-struct VSC_main;
-struct VSC_main_wrk;
 struct ban;
 struct ban_proto;
 struct cli;
 struct http_conn;
+struct listen_sock;
 struct mempool;
 struct objcore;
 struct objhead;
 struct pool;
+struct req_step;
 struct sess;
 struct transport;
-struct worker;
-struct listen_sock;
 struct vcf;
-struct req_step;
+struct VSC_lck;
+struct VSC_main;
+struct VSC_main_wrk;
+struct worker;
+struct worker_priv;
 
 #define DIGEST_LEN		32
 
@@ -182,13 +183,6 @@ struct vsl_log {
 
 /*--------------------------------------------------------------------*/
 
-struct vxid_pool {
-	uint32_t		next;
-	uint32_t		count;
-};
-
-/*--------------------------------------------------------------------*/
-
 VRBT_HEAD(vrt_privs, vrt_priv);
 
 /* Worker pool stuff -------------------------------------------------*/
@@ -229,17 +223,15 @@ enum task_prio {
 struct worker {
 	unsigned		magic;
 #define WORKER_MAGIC		0x6391adcf
+	int			strangelove;
+	struct worker_priv	*wpriv;
 	struct pool		*pool;
-	struct objhead		*nobjhead;
-	struct objcore		*nobjcore;
-	void			*nhashpriv;
 	struct VSC_main_wrk	*stats;
 	struct vsl_log		*vsl;		// borrowed from req/bo
 
 	struct pool_task	task[1];
 
 	vtim_real		lastused;
-	int			strangelove;
 
 	struct v1l		*v1l;
 
@@ -249,8 +241,6 @@ struct worker {
 
 	struct ws		aws[1];
 
-	struct vxid_pool	vxid_pool;
-
 	unsigned		cur_method;
 	unsigned		seen_methods;
 	unsigned		handling;
@@ -658,7 +648,7 @@ extern const char H__Reason[];
 
 /* cache_main.c */
 #define VXID(u) ((u) & VSL_IDENTMASK)
-uint32_t VXID_Get(struct worker *, uint32_t marker);
+uint32_t VXID_Get(const struct worker *, uint32_t marker);
 extern pthread_key_t witness_key;
 
 /* cache_lck.c */
diff --git a/bin/varnishd/cache/cache_busyobj.c b/bin/varnishd/cache/cache_busyobj.c
index 5e07ccd46..c6c85120e 100644
--- a/bin/varnishd/cache/cache_busyobj.c
+++ b/bin/varnishd/cache/cache_busyobj.c
@@ -82,7 +82,7 @@ vbo_Free(struct busyobj **bop)
 }
 
 struct busyobj *
-VBO_GetBusyObj(struct worker *wrk, const struct req *req)
+VBO_GetBusyObj(const struct worker *wrk, const struct req *req)
 {
 	struct busyobj *bo;
 	uint16_t nhttp;
diff --git a/bin/varnishd/cache/cache_hash.c b/bin/varnishd/cache/cache_hash.c
index d94ec2ad5..2855c71e9 100644
--- a/bin/varnishd/cache/cache_hash.c
+++ b/bin/varnishd/cache/cache_hash.c
@@ -115,15 +115,15 @@ hsh_prealloc(struct worker *wrk)
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 
-	if (wrk->nobjcore == NULL)
-		wrk->nobjcore = ObjNew(wrk);
-	CHECK_OBJ_NOTNULL(wrk->nobjcore, OBJCORE_MAGIC);
+	if (wrk->wpriv->nobjcore == NULL)
+		wrk->wpriv->nobjcore = ObjNew(wrk);
+	CHECK_OBJ_NOTNULL(wrk->wpriv->nobjcore, OBJCORE_MAGIC);
 
-	if (wrk->nobjhead == NULL) {
-		wrk->nobjhead = hsh_newobjhead();
+	if (wrk->wpriv->nobjhead == NULL) {
+		wrk->wpriv->nobjhead = hsh_newobjhead();
 		wrk->stats->n_objecthead++;
 	}
-	CHECK_OBJ_NOTNULL(wrk->nobjhead, OBJHEAD_MAGIC);
+	CHECK_OBJ_NOTNULL(wrk->wpriv->nobjhead, OBJHEAD_MAGIC);
 
 	if (hash->prep != NULL)
 		hash->prep(wrk);
@@ -151,23 +151,26 @@ HSH_Private(const struct worker *wrk)
 }
 
 /*---------------------------------------------------------------------*/
+
 void
-HSH_Cleanup(struct worker *wrk)
+HSH_Cleanup(const struct worker *wrk)
 {
 
-	if (wrk->nobjcore != NULL)
-		ObjDestroy(wrk, &wrk->nobjcore);
-
-	if (wrk->nobjhead != NULL) {
-		Lck_Delete(&wrk->nobjhead->mtx);
-		FREE_OBJ(wrk->nobjhead);
-		wrk->nobjhead = NULL;
+	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+	CHECK_OBJ_NOTNULL(wrk->wpriv, WORKER_PRIV_MAGIC);
+	if (wrk->wpriv->nobjcore != NULL)
+		ObjDestroy(wrk, &wrk->wpriv->nobjcore);
+
+	if (wrk->wpriv->nobjhead != NULL) {
+		Lck_Delete(&wrk->wpriv->nobjhead->mtx);
+		FREE_OBJ(wrk->wpriv->nobjhead);
+		wrk->wpriv->nobjhead = NULL;
 		wrk->stats->n_objecthead--;
 	}
-	if (wrk->nhashpriv != NULL) {
+	if (wrk->wpriv->nhashpriv != NULL) {
 		/* XXX: If needed, add slinger method for this */
-		free(wrk->nhashpriv);
-		wrk->nhashpriv = NULL;
+		free(wrk->wpriv->nhashpriv);
+		wrk->wpriv->nhashpriv = NULL;
 	}
 }
 
@@ -285,6 +288,7 @@ HSH_Insert(struct worker *wrk, const void *digest, struct objcore *oc,
 	struct rush rush;
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+	CHECK_OBJ_NOTNULL(wrk->wpriv, WORKER_PRIV_MAGIC);
 	AN(digest);
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
 	AN(ban);
@@ -295,8 +299,8 @@ HSH_Insert(struct worker *wrk, const void *digest, struct objcore *oc,
 
 	hsh_prealloc(wrk);
 
-	AN(wrk->nobjhead);
-	oh = hash->lookup(wrk, digest, &wrk->nobjhead);
+	AN(wrk->wpriv->nobjhead);
+	oh = hash->lookup(wrk, digest, &wrk->wpriv->nobjhead);
 	CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC);
 	Lck_AssertHeld(&oh->mtx);
 	assert(oh->refcnt > 0);
@@ -329,15 +333,17 @@ HSH_Insert(struct worker *wrk, const void *digest, struct objcore *oc,
  */
 
 static struct objcore *
-hsh_insert_busyobj(struct worker *wrk, struct objhead *oh)
+hsh_insert_busyobj(const struct worker *wrk, struct objhead *oh)
 {
 	struct objcore *oc;
 
+	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+	CHECK_OBJ_NOTNULL(wrk->wpriv, WORKER_PRIV_MAGIC);
 	CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC);
 	Lck_AssertHeld(&oh->mtx);
 
-	oc = wrk->nobjcore;
-	wrk->nobjcore = NULL;
+	oc = wrk->wpriv->nobjcore;
+	wrk->wpriv->nobjcore = NULL;
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
 
 	AN(oc->flags & OC_F_BUSY);
@@ -372,6 +378,7 @@ HSH_Lookup(struct req *req, struct objcore **ocp, struct objcore **bocp)
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
 	wrk = req->wrk;
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+	CHECK_OBJ_NOTNULL(wrk->wpriv, WORKER_PRIV_MAGIC);
 	CHECK_OBJ_NOTNULL(req->http, HTTP_MAGIC);
 	CHECK_OBJ_ORNULL(req->vcf, VCF_MAGIC);
 	AN(hash);
@@ -390,8 +397,8 @@ HSH_Lookup(struct req *req, struct objcore **ocp, struct objcore **bocp)
 		Lck_Lock(&oh->mtx);
 		req->hash_objhead = NULL;
 	} else {
-		AN(wrk->nobjhead);
-		oh = hash->lookup(wrk, req->digest, &wrk->nobjhead);
+		AN(wrk->wpriv->nobjhead);
+		oh = hash->lookup(wrk, req->digest, &wrk->wpriv->nobjhead);
 	}
 
 	CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC);
diff --git a/bin/varnishd/cache/cache_main.c b/bin/varnishd/cache/cache_main.c
index 1581f950d..a60e8a584 100644
--- a/bin/varnishd/cache/cache_main.c
+++ b/bin/varnishd/cache/cache_main.c
@@ -166,12 +166,13 @@ static uint32_t vxid_chunk = 32768;
 static struct lock vxid_lock;
 
 uint32_t
-VXID_Get(struct worker *wrk, uint32_t mask)
+VXID_Get(const struct worker *wrk, uint32_t mask)
 {
 	struct vxid_pool *v;
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
-	v = &wrk->vxid_pool;
+	CHECK_OBJ_NOTNULL(wrk->wpriv, WORKER_PRIV_MAGIC);
+	v = wrk->wpriv->vxid_pool;
 	AZ(VXID(mask));
 	do {
 		if (v->count == 0) {
diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index 24eac15dc..7857b2f6b 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -1138,7 +1138,8 @@ CNT_Request(struct req *req)
 		 * pointers still pointing to the things we expect.
 		 */
 		CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
-		CHECK_OBJ_ORNULL(wrk->nobjhead, OBJHEAD_MAGIC);
+		CHECK_OBJ_NOTNULL(wrk->wpriv, WORKER_PRIV_MAGIC);
+		CHECK_OBJ_ORNULL(wrk->wpriv->nobjhead, OBJHEAD_MAGIC);
 		CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
 
 		AN(req->req_step);
@@ -1147,7 +1148,7 @@ CNT_Request(struct req *req)
 		if (DO_DEBUG(DBG_REQ_STATE))
 			cnt_diag(req, req->req_step->name);
 		nxt = req->req_step->func(wrk, req);
-		CHECK_OBJ_ORNULL(wrk->nobjhead, OBJHEAD_MAGIC);
+		CHECK_OBJ_ORNULL(wrk->wpriv->nobjhead, OBJHEAD_MAGIC);
 	}
 	wrk->vsl = NULL;
 	if (nxt == REQ_FSM_DONE) {
diff --git a/bin/varnishd/cache/cache_varnishd.h b/bin/varnishd/cache/cache_varnishd.h
index f2e28b2a6..c9ccaabaf 100644
--- a/bin/varnishd/cache/cache_varnishd.h
+++ b/bin/varnishd/cache/cache_varnishd.h
@@ -65,6 +65,24 @@ struct req_step {
 extern const struct req_step R_STP_TRANSPORT[1];
 extern const struct req_step R_STP_RECV[1];
 
+struct vxid_pool {
+	uint32_t		next;
+	uint32_t		count;
+};
+
+/*--------------------------------------------------------------------
+ * Private part of worker threads
+ */
+
+struct worker_priv {
+	unsigned		magic;
+#define WORKER_PRIV_MAGIC	0x3047db99
+	struct objhead		*nobjhead;
+	struct objcore		*nobjcore;
+	void			*nhashpriv;
+	struct vxid_pool	vxid_pool[1];
+};
+
 /*--------------------------------------------------------------------
  * HTTP Protocol connection structure
  *
@@ -158,7 +176,7 @@ void BAN_RefBan(struct objcore *oc, struct ban *);
 vtim_real BAN_Time(const struct ban *ban);
 
 /* cache_busyobj.c */
-struct busyobj *VBO_GetBusyObj(struct worker *, const struct req *);
+struct busyobj *VBO_GetBusyObj(const struct worker *, const struct req *);
 void VBO_ReleaseBusyObj(struct worker *wrk, struct busyobj **busyobj);
 
 /* cache_director.c */
diff --git a/bin/varnishd/cache/cache_wrk.c b/bin/varnishd/cache/cache_wrk.c
index fcdab5d6f..a6962accb 100644
--- a/bin/varnishd/cache/cache_wrk.c
+++ b/bin/varnishd/cache/cache_wrk.c
@@ -87,6 +87,7 @@ wrk_bgthread(void *arg)
 {
 	struct bgthread *bt;
 	struct worker wrk;
+	struct worker_priv wpriv[1];
 	struct VSC_main_wrk ds;
 	void *r;
 
@@ -94,6 +95,8 @@ wrk_bgthread(void *arg)
 	THR_SetName(bt->name);
 	THR_Init();
 	INIT_OBJ(&wrk, WORKER_MAGIC);
+	INIT_OBJ(wpriv, WORKER_PRIV_MAGIC);
+	wrk.wpriv = wpriv;
 	memset(&ds, 0, sizeof ds);
 	wrk.stats = &ds;
 
@@ -128,6 +131,7 @@ WRK_Thread(struct pool *qp, size_t stacksize, unsigned thread_workspace)
 	struct worker *w, ww;
 	struct VSC_main_wrk ds;
 	unsigned char ws[thread_workspace];
+	struct worker_priv wpriv[1];
 
 	AN(qp);
 	AN(stacksize);
@@ -136,6 +140,8 @@ WRK_Thread(struct pool *qp, size_t stacksize, unsigned thread_workspace)
 	THR_SetName("cache-worker");
 	w = &ww;
 	INIT_OBJ(w, WORKER_MAGIC);
+	INIT_OBJ(wpriv, WORKER_PRIV_MAGIC);
+	w->wpriv = wpriv;
 	w->lastused = NAN;
 	memset(&ds, 0, sizeof ds);
 	w->stats = &ds;
diff --git a/bin/varnishd/hash/hash_critbit.c b/bin/varnishd/hash/hash_critbit.c
index 3d17a8451..c516a530c 100644
--- a/bin/varnishd/hash/hash_critbit.c
+++ b/bin/varnishd/hash/hash_critbit.c
@@ -192,8 +192,8 @@ hcb_crit_bit(const uint8_t *digest, const struct objhead *oh2, struct hcb_y *y)
  */
 
 static struct objhead *
-hcb_insert(struct worker *wrk, struct hcb_root *root, const uint8_t *digest,
-    struct objhead **noh)
+hcb_insert(const struct worker *wrk, struct hcb_root *root,
+    const uint8_t *digest, struct objhead **noh)
 {
 	volatile uintptr_t *p;
 	uintptr_t pp;
@@ -242,8 +242,8 @@ hcb_insert(struct worker *wrk, struct hcb_root *root, const uint8_t *digest,
 
 	/* Insert */
 
-	CAST_OBJ_NOTNULL(y2, wrk->nhashpriv, HCB_Y_MAGIC);
-	wrk->nhashpriv = NULL;
+	CAST_OBJ_NOTNULL(y2, wrk->wpriv->nhashpriv, HCB_Y_MAGIC);
+	wrk->wpriv->nhashpriv = NULL;
 	(void)hcb_crit_bit(digest, oh2, y2);
 	s2 = (digest[y2->ptr] & y2->bitmask) != 0;
 	assert(s2 < 2);
@@ -405,7 +405,7 @@ hcb_lookup(struct worker *wrk, const void *digest, struct objhead **noh)
 
 	while (1) {
 		/* No luck, try with lock held, so we can modify tree */
-		CAST_OBJ_NOTNULL(y, wrk->nhashpriv, HCB_Y_MAGIC);
+		CAST_OBJ_NOTNULL(y, wrk->wpriv->nhashpriv, HCB_Y_MAGIC);
 		Lck_Lock(&hcb_mtx);
 		VSC_C_main->hcb_lock++;
 		oh = hcb_insert(wrk, &hcb_root, digest, noh);
@@ -440,10 +440,10 @@ hcb_prep(struct worker *wrk)
 {
 	struct hcb_y *y;
 
-	if (wrk->nhashpriv == NULL) {
+	if (wrk->wpriv->nhashpriv == NULL) {
 		ALLOC_OBJ(y, HCB_Y_MAGIC);
 		AN(y);
-		wrk->nhashpriv = y;
+		wrk->wpriv->nhashpriv = y;
 	}
 }
 
diff --git a/bin/varnishd/hash/hash_slinger.h b/bin/varnishd/hash/hash_slinger.h
index 66d4c2639..a1a9c0e82 100644
--- a/bin/varnishd/hash/hash_slinger.h
+++ b/bin/varnishd/hash/hash_slinger.h
@@ -66,7 +66,7 @@ void HSH_config(const char *);
 
 /* cache_hash.c */
 void HSH_Init(const struct hash_slinger *);
-void HSH_Cleanup(struct worker *);
+void HSH_Cleanup(const struct worker *);
 
 extern const struct hash_slinger hsl_slinger;
 extern const struct hash_slinger hcl_slinger;


More information about the varnish-commit mailing list