summaryrefslogtreecommitdiff
path: root/sys/src/9/port/devsegment.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2017-06-20 21:53:45 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2017-06-20 21:53:45 +0200
commit2723c9fc775c6366011f6915d3ea1aab085a92fe (patch)
tree5393b31ac24378af22754601d8beeaabca586fe6 /sys/src/9/port/devsegment.c
parentfb165d6a54e46712036ec1cf4332905b94c1f97b (diff)
kernel: add support for sticky segments (cached, preallocated, never paged)
Diffstat (limited to 'sys/src/9/port/devsegment.c')
-rw-r--r--sys/src/9/port/devsegment.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/sys/src/9/port/devsegment.c b/sys/src/9/port/devsegment.c
index f1221b9cc..baa39846e 100644
--- a/sys/src/9/port/devsegment.c
+++ b/sys/src/9/port/devsegment.c
@@ -284,6 +284,8 @@ segmentread(Chan *c, void *a, long n, vlong voff)
if((g->s->type&SG_TYPE) == SG_FIXED)
snprint(buf, sizeof(buf), "va %#p %#p fixed %#p\n", g->s->base, g->s->top-g->s->base,
g->s->map[0]->pages[0]->pa);
+ else if((g->s->type&SG_TYPE) == SG_STICKY)
+ snprint(buf, sizeof(buf), "va %#p %#p sticky\n", g->s->base, g->s->top-g->s->base);
else
snprint(buf, sizeof(buf), "va %#p %#p\n", g->s->base, g->s->top-g->s->base);
return readstr(voff, a, n, buf);
@@ -331,6 +333,20 @@ segmentwrite(Chan *c, void *a, long n, vlong voff)
if(!iseve())
error(Eperm);
g->s = fixedseg(va, len/BY2PG);
+ } else if(cb->nf >= 4 && strcmp(cb->f[3], "sticky") == 0){
+ Segment *s;
+
+ if(!iseve())
+ error(Eperm);
+ s = newseg(SG_STICKY, va, len/BY2PG);
+ if(waserror()){
+ putseg(s);
+ nexterror();
+ }
+ for(; va < s->top; va += BY2PG)
+ segpage(s, newpage(1, nil, va));
+ poperror();
+ g->s = s;
} else
g->s = newseg(SG_SHARED, va, len/BY2PG);
} else