[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