[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