diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2017-06-20 21:53:45 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2017-06-20 21:53:45 +0200 |
commit | 2723c9fc775c6366011f6915d3ea1aab085a92fe (patch) | |
tree | 5393b31ac24378af22754601d8beeaabca586fe6 /sys/src/9/port/devsegment.c | |
parent | fb165d6a54e46712036ec1cf4332905b94c1f97b (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.c | 16 |
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 |