[master] 0b6966d Teach VSMAPI about non-zero offsets
Poul-Henning Kamp
phk at FreeBSD.org
Mon Jan 8 23:19:08 UTC 2018
commit 0b6966d3b5b939e5b2069874e2c5403a2b83b9b6
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Mon Jan 8 19:48:54 2018 +0000
Teach VSMAPI about non-zero offsets
diff --git a/lib/libvarnishapi/vsm.c b/lib/libvarnishapi/vsm.c
index 4169a23..9842874 100644
--- a/lib/libvarnishapi/vsm.c
+++ b/lib/libvarnishapi/vsm.c
@@ -82,9 +82,10 @@ struct vsm_seg {
struct vsm_set *set;
char **av;
int refs;
+ void *s;
+ size_t sz;
void *b;
void *e;
- size_t sz;
uintptr_t serial;
};
@@ -150,18 +151,14 @@ 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[3], NULL, 10);
- assert(sz > 0);
- ps = getpagesize();
- len = RUP2(sz, ps);
- AZ(munmap(vg->b, len));
- vg->b = vg->e = NULL;
+ AZ(munmap(vg->s, vg->sz));
+ vg->s = vg->b = vg->e = NULL;
+ vg->sz = 0;
}
/*--------------------------------------------------------------------*/
@@ -475,7 +472,6 @@ vsm_refresh_set2(struct vsm *vd, struct vsm_set *vs, struct vsb *vsb)
VAV_Free(av);
break;
}
- xxxassert(!strcmp(av[2], "0"));
if (vg == NULL) {
ALLOC_OBJ(vg2, VSM_SEG_MAGIC);
@@ -692,7 +688,7 @@ int
VSM_Map(struct vsm *vd, struct vsm_fantom *vf)
{
struct vsm_seg *vg;
- size_t sz, ps, len;
+ size_t of, off, sz, ps, len;
struct vsb *vsb;
int fd;
@@ -716,10 +712,14 @@ VSM_Map(struct vsm *vd, struct vsm_fantom *vf)
return (0);
}
+ ps = getpagesize();
+ of = strtoul(vg->av[2], NULL, 10);
+ assert(of >= 0);
+ off = RDN2(of, ps);
+
sz = strtoul(vg->av[3], NULL, 10);
assert(sz > 0);
- ps = getpagesize();
- len = RUP2(sz, ps);
+ len = RUP2(of + sz, ps);
vsb = VSB_new_auto();
AN(vsb);
@@ -732,17 +732,18 @@ VSM_Map(struct vsm *vd, struct vsm_fantom *vf)
return (vsm_diag(vd, "Could not open segment"));
}
- vg->b = (void*)mmap(NULL, len,
+ vg->s = (void*)mmap(NULL, len,
PROT_READ,
MAP_HASSEMAPHORE | MAP_NOSYNC | MAP_SHARED,
- fd, 0);
+ fd, off);
VSB_destroy(&vsb);
-
closefd(&fd);
- if (vg->b == MAP_FAILED)
+ if (vg->s == MAP_FAILED)
return (vsm_diag(vd, "Could not mmap segment"));
+
+ vg->b = (char*)(vg->s) + of;
vg->e = (char *)vg->b + sz;
vg->sz = len;
More information about the varnish-commit
mailing list