diff options
| author | Robert Morris <rtm@csail.mit.edu> | 2020-08-13 10:22:07 -0400 | 
|---|---|---|
| committer | Robert Morris <rtm@csail.mit.edu> | 2020-08-13 10:22:07 -0400 | 
| commit | adee82c3e7334a09996c0fe9cc75d9a80abc81c8 (patch) | |
| tree | b29e38cd1aab2cb526dd657ba23d636a93401580 | |
| parent | 4c22c54480f020c36de120ce868912c022e48113 (diff) | |
| download | xv6-labs-adee82c3e7334a09996c0fe9cc75d9a80abc81c8.tar.gz xv6-labs-adee82c3e7334a09996c0fe9cc75d9a80abc81c8.tar.bz2 xv6-labs-adee82c3e7334a09996c0fe9cc75d9a80abc81c8.zip | |
handle another out-of-memory in fork(). the policy here is not consistent,
since other calls (e.g. exec()) panic on out of memory.
| -rw-r--r-- | kernel/proc.c | 2 | ||||
| -rw-r--r-- | kernel/vm.c | 3 | ||||
| -rw-r--r-- | user/usertests.c | 8 | 
3 files changed, 10 insertions, 3 deletions
| diff --git a/kernel/proc.c b/kernel/proc.c index 2811142..56314e5 100644 --- a/kernel/proc.c +++ b/kernel/proc.c @@ -161,6 +161,8 @@ proc_pagetable(struct proc *p)    // An empty page table.    pagetable = uvmcreate(); +  if(pagetable == 0) +    return 0;    // map the trampoline code (for system call return)    // at the highest user virtual address. diff --git a/kernel/vm.c b/kernel/vm.c index 92a5ff7..2f3789f 100644 --- a/kernel/vm.c +++ b/kernel/vm.c @@ -195,13 +195,14 @@ uvmunmap(pagetable_t pagetable, uint64 va, uint64 npages, int do_free)  }  // create an empty user page table. +// returns 0 if out of memory.  pagetable_t  uvmcreate()  {    pagetable_t pagetable;    pagetable = (pagetable_t) kalloc();    if(pagetable == 0) -    panic("uvmcreate: out of memory"); +    return 0;    memset(pagetable, 0, PGSIZE);    return pagetable;  } diff --git a/user/usertests.c b/user/usertests.c index dfe0039..cc88555 100644 --- a/user/usertests.c +++ b/user/usertests.c @@ -2507,6 +2507,8 @@ main(int argc, char *argv[])    if(argc == 2 && strcmp(argv[1], "-c") == 0){      continuous = 1; +  } else if(argc == 2 && strcmp(argv[1], "-C") == 0){ +    continuous = 2;    } else if(argc == 2 && argv[1][0] != '-'){      justone = argv[1];    } else if(argc > 1){ @@ -2589,12 +2591,14 @@ main(int argc, char *argv[])        }        if(fail){          printf("SOME TESTS FAILED\n"); -        exit(1); +        if(continuous != 2) +          exit(1);        }        int free1 = countfree();        if(free1 < free0){          printf("FAILED -- lost some free pages\n"); -        exit(1); +        if(continuous != 2) +          exit(1);        }      }    } | 
