kern/44950: SMP kernel crash in vm_page_free: freeing wired
page
Tor.Egge at cvsup.no.freebsd.org
Tor.Egge at cvsup.no.freebsd.org
Wed Aug 6 17:02:10 PDT 2003
> With an uptime of about 2 days I got today the first crash: stack trace is:
>
> (kgdb) where
> #0 0xc016e052 in dumpsys ()
> #1 0xc016de23 in boot ()
> #2 0xc016e27c in poweroff_wait ()
> #3 0xc02286ca in vm_page_free_toq ()
> #4 0xc02274bc in vm_object_collapse ()
> #5 0xc02266d0 in vm_object_deallocate ()
> #6 0xc0223b74 in vm_map_entry_delete ()
> #7 0xc0223d2d in vm_map_delete ()
> #8 0xc0223dba in vm_map_remove ()
>
> Someone has an idea other than turn off SMP ?
This problem can also occur without SMP if you use threaded
applications (linuxthreads port or linux emulation), aio or procfs.
The enclosed patch might help.
- Tor Egge
-------------- next part --------------
Index: sys/vm/vm_page.c
===================================================================
RCS file: /home/ncvs/src/sys/vm/vm_page.c,v
retrieving revision 1.147.2.18
diff -u -r1.147.2.18 vm_page.c
--- sys/vm/vm_page.c 10 Mar 2002 05:03:19 -0000 1.147.2.18
+++ sys/vm/vm_page.c 6 Aug 2003 23:09:58 -0000
@@ -1403,7 +1408,8 @@
{
int s;
- if ((m->flags & (PG_BUSY|PG_UNMANAGED)) || m->busy || m->wire_count) {
+ if ((m->flags & (PG_BUSY|PG_UNMANAGED)) || m->busy ||
+ m->hold_count || m->wire_count) {
printf("vm_page_cache: attempting to cache busy page\n");
return;
}
Index: sys/kern/sys_pipe.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/sys_pipe.c,v
retrieving revision 1.60.2.14
diff -u -r1.60.2.14 sys_pipe.c
--- sys/kern/sys_pipe.c 3 Aug 2003 13:04:57 -0000 1.60.2.14
+++ sys/kern/sys_pipe.c 6 Aug 2003 23:09:58 -0000
@@ -561,12 +561,12 @@
int j;
for (j = 0; j < i; j++)
- vm_page_unwire(wpipe->pipe_map.ms[j], 1);
+ vm_page_unhold(wpipe->pipe_map.ms[j]);
return (EFAULT);
}
m = PHYS_TO_VM_PAGE(paddr);
- vm_page_wire(m);
+ vm_page_hold(m);
wpipe->pipe_map.ms[i] = m;
}
@@ -627,7 +627,7 @@
}
}
for (i = 0; i < wpipe->pipe_map.npages; i++)
- vm_page_unwire(wpipe->pipe_map.ms[i], 1);
+ vm_page_unhold(wpipe->pipe_map.ms[i]);
wpipe->pipe_map.npages = 0;
}
Index: sys/miscfs/procfs/procfs_mem.c
===================================================================
RCS file: /home/ncvs/src/sys/miscfs/procfs/Attic/procfs_mem.c,v
retrieving revision 1.46.2.3
diff -u -r1.46.2.3 procfs_mem.c
--- sys/miscfs/procfs/procfs_mem.c 22 Jan 2002 17:22:59 -0000 1.46.2.3
+++ sys/miscfs/procfs/procfs_mem.c 6 Aug 2003 23:09:58 -0000
@@ -188,9 +188,9 @@
}
/*
- * Wire the page into memory
+ * Hold the page in memory
*/
- vm_page_wire(m);
+ vm_page_hold(m);
/*
* We're done with tmap now.
@@ -212,7 +212,7 @@
/*
* release the page and the object
*/
- vm_page_unwire(m, 1);
+ vm_page_unhold(m);
vm_object_deallocate(object);
object = NULL;
More information about the freebsd-bugs
mailing list