[master] 9c2f867 Protect oc->exp_flags with EXP->mtx

Poul-Henning Kamp phk at FreeBSD.org
Wed Feb 3 23:45:28 CET 2016


commit 9c2f8677401ef6e1de7552ff40105888bcce9a53
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Wed Feb 3 14:26:09 2016 +0000

    Protect oc->exp_flags with EXP->mtx

diff --git a/bin/varnishd/cache/cache_expire.c b/bin/varnishd/cache/cache_expire.c
index cd3aab0..89b8294 100644
--- a/bin/varnishd/cache/cache_expire.c
+++ b/bin/varnishd/cache/cache_expire.c
@@ -137,12 +137,13 @@ EXP_When(const struct exp *e)
  */
 
 static void
-exp_mail_it(struct objcore *oc)
+exp_mail_it(struct objcore *oc, uint8_t cmds)
 {
 	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
 
 	AN(isnan(oc->last_lru));
 	Lck_Lock(&exphdl->mtx);
+	oc->exp_flags |= cmds;
 	if (oc->flags & OC_F_DYING)
 		VSTAILQ_INSERT_HEAD(&exphdl->inbox, oc, exp_list);
 	else
@@ -175,13 +176,12 @@ EXP_Inject(struct worker *wrk, struct objcore *oc, struct lru *lru)
 	Lck_Lock(&lru->mtx);
 	lru->n_objcore++;
 	oc->last_lru = NAN;
-	oc->exp_flags |= OC_EF_INSERT | OC_EF_EXP;
-	oc->timer_when = EXP_When(&oc->exp);
 	Lck_Unlock(&lru->mtx);
 
-	exp_event(wrk, oc, EXP_INJECT);
+	oc->timer_when = EXP_When(&oc->exp);
 
-	exp_mail_it(oc);
+	exp_event(wrk, oc, EXP_INJECT);
+	exp_mail_it(oc, OC_EF_INSERT | OC_EF_EXP);
 }
 
 /*--------------------------------------------------------------------
@@ -211,13 +211,10 @@ EXP_Insert(struct worker *wrk, struct objcore *oc)
 	Lck_Lock(&lru->mtx);
 	lru->n_objcore++;
 	oc->last_lru = NAN;
-	oc->exp_flags |= OC_EF_INSERT | OC_EF_EXP;
-	oc->exp_flags |= OC_EF_MOVE;
 	Lck_Unlock(&lru->mtx);
 
 	exp_event(wrk, oc, EXP_INSERT);
-
-	exp_mail_it(oc);
+	exp_mail_it(oc, OC_EF_INSERT | OC_EF_EXP | OC_EF_MOVE);
 }
 
 /*--------------------------------------------------------------------
@@ -255,18 +252,16 @@ EXP_Rearm(struct objcore *oc, double now, double ttl, double grace, double keep)
 	CHECK_OBJ_NOTNULL(lru, LRU_MAGIC);
 
 	Lck_Lock(&lru->mtx);
-
 	if (isnan(oc->last_lru)) {
 		oc = NULL;
 	} else {
 		oc->last_lru = NAN;
-		oc->exp_flags |= OC_EF_MOVE;
 		VTAILQ_REMOVE(&lru->lru_head, oc, lru_list);
 	}
 	Lck_Unlock(&lru->mtx);
 
 	if (oc != NULL)
-		exp_mail_it(oc);
+		exp_mail_it(oc, OC_EF_MOVE);
 }
 
 /*--------------------------------------------------------------------
@@ -309,7 +304,7 @@ EXP_NukeOne(struct worker *wrk, struct lru *lru)
 	/* XXX: We could grab and return one storage segment to our caller */
 	ObjSlim(wrk, oc);
 
-	exp_mail_it(oc);
+	exp_mail_it(oc, 0);
 
 	VSLb(wrk->vsl, SLT_ExpKill, "LRU x=%u", ObjGetXID(wrk, oc));
 	(void)HSH_DerefObjCore(wrk, &oc);
@@ -375,10 +370,13 @@ exp_inbox(struct exp_priv *ep, struct objcore *oc, double now)
 	CHECK_OBJ_NOTNULL(lru, LRU_MAGIC);
 
 	/* Evacuate our action-flags, and put it back on the LRU list */
-	Lck_Lock(&lru->mtx);
+	Lck_Lock(&ep->mtx);
 	flags = oc->exp_flags;
-	AN(isnan(oc->last_lru));
 	oc->exp_flags &= ~(OC_EF_INSERT | OC_EF_MOVE);
+	Lck_Unlock(&ep->mtx);
+
+	Lck_Lock(&lru->mtx);
+	AN(isnan(oc->last_lru));
 	oc->last_lru = now;
 	if (!(oc->flags & OC_F_DYING)) {
 		VTAILQ_INSERT_TAIL(&lru->lru_head, oc, lru_list);
@@ -433,6 +431,7 @@ exp_inbox(struct exp_priv *ep, struct objcore *oc, double now)
 static double
 exp_expire(struct exp_priv *ep, double now)
 {
+
 	struct lru *lru;
 	struct objcore *oc;
 
@@ -450,12 +449,13 @@ exp_expire(struct exp_priv *ep, double now)
 
 	VSC_C_main->n_expired++;
 
+	if (!(oc->flags & OC_F_DYING))
+		ObjKill(oc);
+
 	lru = ObjGetLRU(oc);
 	CHECK_OBJ_NOTNULL(lru, LRU_MAGIC);
 	Lck_Lock(&lru->mtx);
 
-	if (!(oc->flags & OC_F_DYING))
-		ObjKill(oc);
 	if (isnan(oc->last_lru)) {
 		oc = NULL;
 	} else {



More information about the varnish-commit mailing list