Cleanup if allocuvm fails to alloc. Add a test.
This commit is contained in:
parent
5048762c7e
commit
dd645ef119
3 changed files with 40 additions and 3 deletions
4
README
4
README
|
@ -20,8 +20,8 @@ The following people made contributions:
|
||||||
Cliff Frey (MP)
|
Cliff Frey (MP)
|
||||||
Xiao Yu (MP)
|
Xiao Yu (MP)
|
||||||
|
|
||||||
In addition, we are grateful for the patches submitted by Greg Price,
|
In addition, we are grateful for the patches contributed by Greg
|
||||||
Yandong Mao, and Hitoshi Mitake.
|
Price, Yandong Mao, and Hitoshi Mitake.
|
||||||
|
|
||||||
The code in the files that constitute xv6 is
|
The code in the files that constitute xv6 is
|
||||||
Copyright 2006-2007 Frans Kaashoek, Robert Morris, and Russ Cox.
|
Copyright 2006-2007 Frans Kaashoek, Robert Morris, and Russ Cox.
|
||||||
|
|
36
usertests.c
36
usertests.c
|
@ -324,6 +324,7 @@ mem(void)
|
||||||
void *m1, *m2;
|
void *m1, *m2;
|
||||||
int pid, ppid;
|
int pid, ppid;
|
||||||
|
|
||||||
|
printf(1, "mem test\n");
|
||||||
ppid = getpid();
|
ppid = getpid();
|
||||||
if((pid = fork()) == 0){
|
if((pid = fork()) == 0){
|
||||||
m1 = 0;
|
m1 = 0;
|
||||||
|
@ -1332,6 +1333,41 @@ sbrktest(void)
|
||||||
wait();
|
wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if we run the system out of memory, does it clean up the last
|
||||||
|
// failed allocation?
|
||||||
|
sbrk(-(sbrk(0) - oldbrk));
|
||||||
|
int pids[32];
|
||||||
|
int fds[2];
|
||||||
|
if(pipe(fds) != 0){
|
||||||
|
printf(1, "pipe() failed\n");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
for (i = 0; i < sizeof(pids)/sizeof(pids[0]); i++){
|
||||||
|
if ((pids[i] = fork()) == 0) {
|
||||||
|
// allocate the full 640K
|
||||||
|
sbrk((640 * 1024) - (uint)sbrk(0));
|
||||||
|
write(fds[1], "x", 1);
|
||||||
|
// sit around until killed
|
||||||
|
while (1) sleep(1000);
|
||||||
|
}
|
||||||
|
char scratch;
|
||||||
|
if (pids[i] != -1)
|
||||||
|
read(fds[0], &scratch, 1);
|
||||||
|
}
|
||||||
|
// if those failed allocations freed up the pages they did allocate,
|
||||||
|
// we'll be able to allocate here
|
||||||
|
c = sbrk(4096);
|
||||||
|
for (i = 0; i < sizeof(pids)/sizeof(pids[0]); i++){
|
||||||
|
if (pids[i] == -1)
|
||||||
|
continue;
|
||||||
|
kill(pids[i]);
|
||||||
|
wait();
|
||||||
|
}
|
||||||
|
if (c == (char*)0xffffffff) {
|
||||||
|
printf(stdout, "failed sbrk leaked memory\n");
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
if(sbrk(0) > oldbrk)
|
if(sbrk(0) > oldbrk)
|
||||||
sbrk(-(sbrk(0) - oldbrk));
|
sbrk(-(sbrk(0) - oldbrk));
|
||||||
|
|
||||||
|
|
3
vm.c
3
vm.c
|
@ -195,7 +195,8 @@ allocuvm(pde_t *pgdir, char *addr, uint sz)
|
||||||
if(pte == 0 || (*pte & PTE_P) == 0){
|
if(pte == 0 || (*pte & PTE_P) == 0){
|
||||||
char *mem = kalloc();
|
char *mem = kalloc();
|
||||||
if(mem == 0){
|
if(mem == 0){
|
||||||
// XXX clean up?
|
cprintf("allocuvm out of memory\n");
|
||||||
|
deallocuvm(pgdir, addr, sz);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
memset(mem, 0, PGSIZE);
|
memset(mem, 0, PGSIZE);
|
||||||
|
|
Loading…
Reference in a new issue