[master] 667e023 Encapsulate the "storage object" identifier which stevedores get to play with.

Poul-Henning Kamp phk at FreeBSD.org
Thu Aug 21 22:08:38 CEST 2014


commit 667e02387aafee489226053bf28eb77f2002a495
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Thu Aug 21 20:08:05 2014 +0000

    Encapsulate the "storage object" identifier which stevedores get
    to play with.

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 4939941..474a04f 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -364,33 +364,43 @@ struct storage {
 	unsigned		space;
 };
 
-/* Object core structure ---------------------------------------------
- * Objects have sideways references in the binary heap and the LRU list
- * and we want to avoid paging in a lot of objects just to move them up
- * or down the binheap or to move a unrelated object on the LRU list.
- * To avoid this we use a proxy object, objcore, to hold the relevant
- * housekeeping fields parts of an object.
+/* Stored object -----------------------------------------------------
+ * Pointer to a stored object, and the methods it supports
  */
 
+struct storeobj {
+	unsigned		magic;
+#define STOREOBJ_MAGIC		0x6faed850
+	const struct stevedore	*stevedore;
+	void			*priv;
+	uintptr_t		priv2;
+};
+
 typedef struct object *getobj_f(struct dstat *ds, struct objcore *oc);
 typedef void updatemeta_f(struct objcore *oc, struct dstat *);
 typedef void freeobj_f(struct dstat *ds, struct objcore *oc);
 typedef struct lru *getlru_f(const struct objcore *oc);
 
-struct objcore_methods {
+struct storeobj_methods {
 	getobj_f	*getobj;
 	updatemeta_f	*updatemeta;
 	freeobj_f	*freeobj;
 	getlru_f	*getlru;
 };
 
+/* Object core structure ---------------------------------------------
+ * Objects have sideways references in the binary heap and the LRU list
+ * and we want to avoid paging in a lot of objects just to move them up
+ * or down the binheap or to move a unrelated object on the LRU list.
+ * To avoid this we use a proxy object, objcore, to hold the relevant
+ * housekeeping fields parts of an object.
+ */
+
 struct objcore {
 	unsigned		magic;
 #define OBJCORE_MAGIC		0x4d301302
 	int			refcnt;
-	const struct stevedore	*stevedore;
-	void			*priv;
-	uintptr_t		priv2;
+	struct storeobj		stobj[1];
 	struct objhead		*objhead;
 	struct busyobj		*busyobj;
 	double			timer_when;
diff --git a/bin/varnishd/cache/cache_hash.c b/bin/varnishd/cache/cache_hash.c
index 4e3fc67..753a646 100644
--- a/bin/varnishd/cache/cache_hash.c
+++ b/bin/varnishd/cache/cache_hash.c
@@ -627,7 +627,7 @@ HSH_Fail(struct objcore *oc)
 	 * will not consider this oc, or an object hung of the oc
 	 * so that it can consider it.
 	 */
-	assert((oc->flags & OC_F_BUSY) || (oc->stevedore != NULL));
+	assert((oc->flags & OC_F_BUSY) || (oc->stobj->stevedore != NULL));
 
 	Lck_Lock(&oh->mtx);
 	oc->flags |= OC_F_FAILED;
@@ -666,7 +666,7 @@ HSH_Unbusy(struct dstat *ds, struct objcore *oc)
 	oh = oc->objhead;
 	CHECK_OBJ(oh, OBJHEAD_MAGIC);
 
-	AN(oc->stevedore);
+	AN(oc->stobj->stevedore);
 	AN(oc->flags & OC_F_BUSY);
 	assert(oh->refcnt > 0);
 
@@ -768,7 +768,7 @@ HSH_DerefObjCore(struct dstat *ds, struct objcore **ocp)
 	BAN_DestroyObj(oc);
 	AZ(oc->ban);
 
-	if (oc->stevedore != NULL)
+	if (oc->stobj->stevedore != NULL)
 		ObjFreeObj(oc, ds);
 	FREE_OBJ(oc);
 
diff --git a/bin/varnishd/cache/cache_obj.c b/bin/varnishd/cache/cache_obj.c
index a1b2296..ee3cf14 100644
--- a/bin/varnishd/cache/cache_obj.c
+++ b/bin/varnishd/cache/cache_obj.c
@@ -47,20 +47,20 @@
 #include "storage/storage.h"
 #include "hash/hash_slinger.h"
 
-static const struct objcore_methods *
+static const struct storeobj_methods *
 obj_getmethods(const struct objcore *oc)
 {
 
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
-	CHECK_OBJ_NOTNULL(oc->stevedore, STEVEDORE_MAGIC);
-	AN(oc->stevedore->methods);
-	return (oc->stevedore->methods);
+	CHECK_OBJ_NOTNULL(oc->stobj->stevedore, STEVEDORE_MAGIC);
+	AN(oc->stobj->stevedore->methods);
+	return (oc->stobj->stevedore->methods);
 }
 
 static struct object *
 obj_getobj(struct objcore *oc, struct dstat *ds)
 {
-	const struct objcore_methods *m = obj_getmethods(oc);
+	const struct storeobj_methods *m = obj_getmethods(oc);
 
 	AN(ds);
 	AN(m->getobj);
@@ -285,7 +285,7 @@ ObjTrimStore(struct objcore *oc, struct dstat *ds)
 
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
 	AN(ds);
-	stv = oc->stevedore;
+	stv = oc->stobj->stevedore;
 	CHECK_OBJ_NOTNULL(stv, STEVEDORE_MAGIC);
 	o = obj_getobj(oc, ds);
 	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
@@ -329,7 +329,7 @@ ObjSlim(struct objcore *oc, struct dstat *ds)
 void
 ObjUpdateMeta(struct objcore *oc, struct dstat *ds)
 {
-	const struct objcore_methods *m = obj_getmethods(oc);
+	const struct storeobj_methods *m = obj_getmethods(oc);
 
 	if (m->updatemeta != NULL)
 		m->updatemeta(oc, ds);
@@ -338,7 +338,7 @@ ObjUpdateMeta(struct objcore *oc, struct dstat *ds)
 void
 ObjFreeObj(struct objcore *oc, struct dstat *ds)
 {
-	const struct objcore_methods *m = obj_getmethods(oc);
+	const struct storeobj_methods *m = obj_getmethods(oc);
 
 	AN(ds);
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
@@ -349,7 +349,7 @@ ObjFreeObj(struct objcore *oc, struct dstat *ds)
 struct lru *
 ObjGetLRU(const struct objcore *oc)
 {
-	const struct objcore_methods *m = obj_getmethods(oc);
+	const struct storeobj_methods *m = obj_getmethods(oc);
 
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
 	AN(m->getlru);
diff --git a/bin/varnishd/cache/cache_panic.c b/bin/varnishd/cache/cache_panic.c
index 4a1c880..9d0330f 100644
--- a/bin/varnishd/cache/cache_panic.c
+++ b/bin/varnishd/cache/cache_panic.c
@@ -240,11 +240,11 @@ pan_objcore(const char *typ, const struct objcore *oc)
 	VSB_printf(pan_vsp, "    refcnt = %d\n", oc->refcnt);
 	VSB_printf(pan_vsp, "    flags = 0x%x\n", oc->flags);
 	VSB_printf(pan_vsp, "    objhead = %p\n", oc->objhead);
-	VSB_printf(pan_vsp, "    stevedore = %p", oc->stevedore);
-	if (oc->stevedore != NULL) {
-		VSB_printf(pan_vsp, " (%s", oc->stevedore->name);
-		if (strlen(oc->stevedore->ident))
-			VSB_printf(pan_vsp, " %s", oc->stevedore->ident);
+	VSB_printf(pan_vsp, "    stevedore = %p", oc->stobj->stevedore);
+	if (oc->stobj->stevedore != NULL) {
+		VSB_printf(pan_vsp, " (%s", oc->stobj->stevedore->name);
+		if (strlen(oc->stobj->stevedore->ident))
+			VSB_printf(pan_vsp, " %s", oc->stobj->stevedore->ident);
 		VSB_printf(pan_vsp, ")");
 	}
 	VSB_printf(pan_vsp, "\n");
diff --git a/bin/varnishd/storage/stevedore.c b/bin/varnishd/storage/stevedore.c
index 360d7b6..8c5981c 100644
--- a/bin/varnishd/storage/stevedore.c
+++ b/bin/varnishd/storage/stevedore.c
@@ -54,9 +54,9 @@ default_oc_getobj(struct dstat *ds, struct objcore *oc)
 	struct object *o;
 
 	(void)ds;
-	if (oc->priv == NULL)
+	if (oc->stobj->priv == NULL)
 		return (NULL);
-	CAST_OBJ_NOTNULL(o, oc->priv, OBJECT_MAGIC);
+	CAST_OBJ_NOTNULL(o, oc->stobj->priv, OBJECT_MAGIC);
 	return (o);
 }
 
@@ -68,9 +68,9 @@ default_oc_freeobj(struct dstat *ds, struct objcore *oc)
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
 	AN(ds);
 	ObjSlim(oc, ds);
-	CAST_OBJ_NOTNULL(o, oc->priv, OBJECT_MAGIC);
-	oc->priv = NULL;
-	oc->stevedore = NULL;
+	CAST_OBJ_NOTNULL(o, oc->stobj->priv, OBJECT_MAGIC);
+	oc->stobj->priv = NULL;
+	oc->stobj->stevedore = NULL;
 	o->magic = 0;
 
 	STV_free(o->objstore);
@@ -83,11 +83,11 @@ default_oc_getlru(const struct objcore *oc)
 {
 	struct stevedore *stv;
 
-	CAST_OBJ_NOTNULL(stv, (void *)oc->priv2, STEVEDORE_MAGIC);
+	CAST_OBJ_NOTNULL(stv, (void *)oc->stobj->priv2, STEVEDORE_MAGIC);
 	return (stv->lru);
 }
 
-const struct objcore_methods default_oc_methods = {
+const struct storeobj_methods default_oc_methods = {
 	.getobj = default_oc_getobj,
 	.freeobj = default_oc_freeobj,
 	.getlru = default_oc_getlru,
@@ -231,11 +231,11 @@ STV_MkObject(struct stevedore *stv, struct busyobj *bo,
 
 	o->objcore = bo->fetch_objcore;
 
-	o->objcore->stevedore = stv;
+	o->objcore->stobj->stevedore = stv;
 	o->body->stevedore = stv;
 	AN(stv->methods);
-	o->objcore->priv = o;
-	o->objcore->priv2 = (uintptr_t)stv;
+	o->objcore->stobj->priv = o;
+	o->objcore->stobj->priv2 = (uintptr_t)stv;
 	VSLb(bo->vsl, SLT_Storage, "%s %s", stv->name, stv->ident);
 	return (o);
 }
@@ -320,7 +320,7 @@ STV_NewObject(struct busyobj *bo, const char *hint, unsigned wsl)
 	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
 	CHECK_OBJ_NOTNULL(o->objstore, STORAGE_MAGIC);
 	CHECK_OBJ_NOTNULL(o->objcore, OBJCORE_MAGIC);
-	assert(o->objcore->stevedore == stv);
+	assert(o->objcore->stobj->stevedore == stv);
 	AN(stv->methods);
 	return (1);
 }
diff --git a/bin/varnishd/storage/storage.h b/bin/varnishd/storage/storage.h
index 29531b0..1f83998 100644
--- a/bin/varnishd/storage/storage.h
+++ b/bin/varnishd/storage/storage.h
@@ -60,7 +60,7 @@ typedef void storage_banexport_f(const struct stevedore *, const uint8_t *bans,
 
 extern storage_allocobj_f stv_default_allocobj;
 
-extern const struct objcore_methods default_oc_methods;
+extern const struct storeobj_methods default_oc_methods;
 
 /*--------------------------------------------------------------------*/
 
@@ -80,7 +80,7 @@ struct stevedore {
 	storage_baninfo_f	*baninfo;	/* --//-- */
 	storage_banexport_f	*banexport;	/* --//-- */
 
-	const struct objcore_methods
+	const struct storeobj_methods
 				*methods;
 
 	struct lru		*lru;
diff --git a/bin/varnishd/storage/storage_persistent.c b/bin/varnishd/storage/storage_persistent.c
index acc8f84..4ae0d2d 100644
--- a/bin/varnishd/storage/storage_persistent.c
+++ b/bin/varnishd/storage/storage_persistent.c
@@ -535,8 +535,8 @@ smp_allocobj(struct stevedore *stv, struct busyobj *bo,
 	ltot = st->len = st->space;
 
 	o = STV_MkObject(stv, bo, st->ptr, ltot, soc);
-	AN(bo->fetch_objcore->stevedore);
-	assert(bo->fetch_objcore->stevedore == stv);
+	AN(bo->fetch_objcore->stobj->stevedore);
+	assert(bo->fetch_objcore->stobj->stevedore == stv);
 	CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC);
 	o->objstore = st;
 	bo->stats->n_object++;
diff --git a/bin/varnishd/storage/storage_persistent.h b/bin/varnishd/storage/storage_persistent.h
index b35bd92..8dac5e2 100644
--- a/bin/varnishd/storage/storage_persistent.h
+++ b/bin/varnishd/storage/storage_persistent.h
@@ -309,7 +309,7 @@ void smp_new_seg(struct smp_sc *sc);
 void smp_close_seg(struct smp_sc *sc, struct smp_seg *sg);
 void smp_init_oc(struct objcore *oc, struct smp_seg *sg, unsigned objidx);
 void smp_save_segs(struct smp_sc *sc);
-extern const struct objcore_methods smp_oc_methods;
+extern const struct storeobj_methods smp_oc_methods;
 
 /* storage_persistent_subr.c */
 
diff --git a/bin/varnishd/storage/storage_persistent_silo.c b/bin/varnishd/storage/storage_persistent_silo.c
index 40b3dc3..4553185 100644
--- a/bin/varnishd/storage/storage_persistent_silo.c
+++ b/bin/varnishd/storage/storage_persistent_silo.c
@@ -160,9 +160,9 @@ smp_load_seg(struct worker *wrk, const struct smp_sc *sc,
 		ALLOC_OBJ(oc, OBJCORE_MAGIC);
 		AN(oc);
 		oc->flags &= ~OC_F_BUSY;
-		oc->stevedore = sc->parent;
+		oc->stobj->stevedore = sc->parent;
 		smp_init_oc(oc, sg, no);
-		oc->priv2 |= NEED_FIXUP;
+		oc->stobj->priv2 |= NEED_FIXUP;
 		oc->ban = BAN_RefBan(oc, so->ban, sc->tailban);
 		HSH_Insert(wrk, so->hash, oc);
 		oc->exp = so->exp;
@@ -398,14 +398,14 @@ smp_oc_getobj(struct dstat *ds, struct objcore *oc)
 	int bad;
 
 	/* Some calls are direct, but they should match anyway */
-	assert(oc->stevedore->methods->getobj == smp_oc_getobj);
+	assert(oc->stobj->stevedore->methods->getobj == smp_oc_getobj);
 
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
 	if (ds == NULL)
-		AZ(oc->priv2 & NEED_FIXUP);
+		AZ(oc->stobj->priv2 & NEED_FIXUP);
 
-	CAST_OBJ_NOTNULL(sg, oc->priv, SMP_SEG_MAGIC);
-	so = smp_find_so(sg, oc->priv2);
+	CAST_OBJ_NOTNULL(sg, oc->stobj->priv, SMP_SEG_MAGIC);
+	so = smp_find_so(sg, oc->stobj->priv2);
 
 	o = (void*)(sg->sc->base + so->ptr);
 	/*
@@ -421,13 +421,13 @@ smp_oc_getobj(struct dstat *ds, struct objcore *oc)
 	 * If this flag is not set, it will not be, and the lock is not
 	 * needed to test it.
 	 */
-	if (!(oc->priv2 & NEED_FIXUP))
+	if (!(oc->stobj->priv2 & NEED_FIXUP))
 		return (o);
 
 	AN(ds);
 	Lck_Lock(&sg->sc->mtx);
 	/* Check again, we might have raced. */
-	if (oc->priv2 & NEED_FIXUP) {
+	if (oc->stobj->priv2 & NEED_FIXUP) {
 		/* We trust caller to have a refcnt for us */
 		o->objcore = oc;
 
@@ -450,7 +450,7 @@ smp_oc_getobj(struct dstat *ds, struct objcore *oc)
 		sg->nfixed++;
 		ds->n_object++;
 		ds->n_vampireobject--;
-		oc->priv2 &= ~NEED_FIXUP;
+		oc->stobj->priv2 &= ~NEED_FIXUP;
 	}
 	Lck_Unlock(&sg->sc->mtx);
 	EXP_Rearm(oc, NAN, NAN, NAN, NAN);	// XXX: Shouldn't be needed
@@ -468,9 +468,9 @@ smp_oc_updatemeta(struct objcore *oc, struct dstat *ds)
 	o = smp_oc_getobj(ds, oc);
 	AN(o);
 
-	CAST_OBJ_NOTNULL(sg, oc->priv, SMP_SEG_MAGIC);
+	CAST_OBJ_NOTNULL(sg, oc->stobj->priv, SMP_SEG_MAGIC);
 	CHECK_OBJ_NOTNULL(sg->sc, SMP_SC_MAGIC);
-	so = smp_find_so(sg, oc->priv2);
+	so = smp_find_so(sg, oc->stobj->priv2);
 
 	if (sg == sg->sc->cur_seg) {
 		/* Lock necessary, we might race close_seg */
@@ -493,8 +493,8 @@ smp_oc_freeobj(struct dstat *ds, struct objcore *oc)
 	AN(ds);
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
 
-	CAST_OBJ_NOTNULL(sg, oc->priv, SMP_SEG_MAGIC);
-	so = smp_find_so(sg, oc->priv2);
+	CAST_OBJ_NOTNULL(sg, oc->stobj->priv, SMP_SEG_MAGIC);
+	so = smp_find_so(sg, oc->stobj->priv2);
 
 	Lck_Lock(&sg->sc->mtx);
 	EXP_Clr(&so->exp);
@@ -502,7 +502,7 @@ smp_oc_freeobj(struct dstat *ds, struct objcore *oc)
 
 	assert(sg->nobj > 0);
 	sg->nobj--;
-	if (oc->priv2 & NEED_FIXUP) {
+	if (oc->stobj->priv2 & NEED_FIXUP) {
 		ds->n_vampireobject--;
 	} else {
 		assert(sg->nfixed > 0);
@@ -522,11 +522,11 @@ smp_oc_getlru(const struct objcore *oc)
 {
 	struct smp_seg *sg;
 
-	CAST_OBJ_NOTNULL(sg, oc->priv, SMP_SEG_MAGIC);
+	CAST_OBJ_NOTNULL(sg, oc->stobj->priv, SMP_SEG_MAGIC);
 	return (sg->lru);
 }
 
-const struct objcore_methods smp_oc_methods = {
+const struct storeobj_methods smp_oc_methods = {
 	.getobj =		smp_oc_getobj,
 	.updatemeta =		smp_oc_updatemeta,
 	.freeobj =		smp_oc_freeobj,
@@ -540,6 +540,6 @@ smp_init_oc(struct objcore *oc, struct smp_seg *sg, unsigned objidx)
 {
 
 	AZ(objidx & NEED_FIXUP);
-	oc->priv = sg;
-	oc->priv2 = objidx;
+	oc->stobj->priv = sg;
+	oc->stobj->priv2 = objidx;
 }



More information about the varnish-commit mailing list