From 8dc71a257d80d1e2f56cd7f931ca389fbb727b5c Mon Sep 17 00:00:00 2001 From: Robert Morris Date: Thu, 13 Aug 2020 10:22:07 -0400 Subject: [PATCH] handle another out-of-memory in fork(). the policy here is not consistent, since other calls (e.g. exec()) panic on out of memory. --- kernel/proc.c | 2 ++ kernel/vm.c | 3 ++- 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); } } }