ref: f7c60230669e8e00bc794f07726070d577d5aa3f
parent: b7089d66ad5a26a2b39c1c1e17a4761cd1670728
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Feb 23 09:08:33 EST 2020
devswap: dont assume Proc* structures returned from proctab() are continuous
--- a/sys/src/9/port/devswap.c
+++ b/sys/src/9/port/devswap.c
@@ -155,16 +155,14 @@
static void
pager(void*)
{
- int i;
+ Proc *p;
Segment *s;
- Proc *p, *ep;
+ int x, i;
- p = proctab(0);
- ep = &p[conf.nproc];
-
while(waserror())
;
+ x = -1;
for(;;){
up->psstate = "Reclaim";
if(reclaim()){
@@ -185,11 +183,12 @@
i = ageclock;
do {
- if(++p >= ep){
+ if(++x >= conf.nproc){
if(++ageclock == i)
goto Killbig;
- p = proctab(0);
+ x = 0;
}
+ p = proctab(x);
} while(p->state == Dead || p->noswap || !canqlock(&p->seglock));
up->psstate = "Pageout";
for(i = 0; i < NSEG; i++) {
@@ -266,25 +265,24 @@
static int
canflush(Proc *p, Segment *s)
{
- int i;
- Proc *ep;
+ int x, i;
if(incref(s) == 2) /* Easy if we are the only user */
return canpage(p);
- /* Now we must do hardwork to ensure all processes which have tlb
+ /*
+ * Now we must do hardwork to ensure all processes which have tlb
* entries for this segment will be flushed if we succeed in paging it out
*/
- p = proctab(0);
- ep = &p[conf.nproc];
- while(p < ep) {
- if(p->state != Dead) {
- for(i = 0; i < NSEG; i++)
- if(p->seg[i] == s)
- if(!canpage(p))
- return 0;
+ for(x = 0; x < conf.nproc; x++){
+ p = proctab(x);
+ if(p->state == Dead)
+ continue;
+ for(i = 0; i < NSEG; i++){
+ if(p->seg[i] == s)
+ if(!canpage(p))
+ return 0;
}
- p++;
}
return 1;
}