[5.2] 8376094 Umap and free all segments on VSM_Destroy()
PÃ¥l Hermunn Johansen
hermunn at varnish-software.com
Fri Sep 15 11:17:20 UTC 2017
commit 83760941c88e85472a28fa5fcfca43ee903fde02
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Tue Sep 12 06:34:00 2017 +0000
Umap and free all segments on VSM_Destroy()
Fixes #2416
diff --git a/lib/libvarnishapi/vsm.c b/lib/libvarnishapi/vsm.c
index 9d3ed85..2b8c7e6 100644
--- a/lib/libvarnishapi/vsm.c
+++ b/lib/libvarnishapi/vsm.c
@@ -147,6 +147,44 @@ vsm_diag(struct vsm *vd, const char *fmt, ...)
/*--------------------------------------------------------------------*/
+static void
+vsm_unmapseg(struct vsm_seg *vg)
+{
+ size_t sz, ps, len;
+
+ CHECK_OBJ_NOTNULL(vg, VSM_SEG_MAGIC);
+
+ AN(vg->b);
+ AN(vg->e);
+ sz = strtoul(vg->av[2], NULL, 10);
+ assert(sz > 0);
+ ps = getpagesize();
+ len = RUP2(sz, ps);
+ AZ(munmap(vg->b, len));
+ vg->b = vg->e = NULL;
+}
+
+/*--------------------------------------------------------------------*/
+
+static void
+vsm_delseg(struct vsm_seg *vg)
+{
+
+ CHECK_OBJ_NOTNULL(vg, VSM_SEG_MAGIC);
+
+ if (vg->b != NULL)
+ vsm_unmapseg(vg);
+
+ if (vg->stale)
+ VTAILQ_REMOVE(&vg->set->stale, vg, list);
+ else
+ VTAILQ_REMOVE(&vg->set->segs, vg, list);
+ VAV_Free(vg->av);
+ FREE_OBJ(vg);
+}
+
+/*--------------------------------------------------------------------*/
+
static struct vsm_set *
vsm_newset(const char *dirname)
{
@@ -173,7 +211,10 @@ vsm_delset(struct vsm_set **p)
closefd(&vs->fd);
if (vs->dfd >= 0)
closefd(&vs->dfd);
- // XXX: delete segments
+ while (!VTAILQ_EMPTY(&vs->stale))
+ vsm_delseg(VTAILQ_FIRST(&vs->stale));
+ while (!VTAILQ_EMPTY(&vs->segs))
+ vsm_delseg(VTAILQ_FIRST(&vs->segs));
FREE_OBJ(vs);
}
@@ -243,11 +284,13 @@ VSM_Destroy(struct vsm **vdp)
TAKE_OBJ_NOTNULL(vd, vdp, VSM_MAGIC);
VSM_ResetError(vd);
- free(vd->dname);
- vsm_delset(&vd->mgt);
- vsm_delset(&vd->child);
+ REPLACE(vd->dname, NULL);
+ if (vd->diag != NULL)
+ VSB_destroy(&vd->diag);
if (vd->dfd >= 0)
closefd(&vd->dfd);
+ vsm_delset(&vd->mgt);
+ vsm_delset(&vd->child);
FREE_OBJ(vd);
}
@@ -699,7 +742,6 @@ int
VSM_Unmap(struct vsm *vd, struct vsm_fantom *vf)
{
struct vsm_seg *vg;
- size_t sz, ps, len;
CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
AN(vd->attached);
@@ -714,19 +756,9 @@ VSM_Unmap(struct vsm *vd, struct vsm_fantom *vf)
vf->e = NULL;
if (vg->refs > 0)
return(0);
- AN(vg->b);
- AN(vg->e);
- sz = strtoul(vg->av[2], NULL, 10);
- assert(sz > 0);
- ps = getpagesize();
- len = RUP2(sz, ps);
- AZ(munmap(vg->b, len));
- vg->b = vg->e = NULL;
- if (vg->stale) {
- VTAILQ_REMOVE(&vg->set->stale, vg, list);
- VAV_Free(vg->av);
- FREE_OBJ(vg);
- }
+ vsm_unmapseg(vg);
+ if (vg->stale)
+ vsm_delseg(vg);
return (0);
}
More information about the varnish-commit
mailing list