Help debugging non-sleepable lock panic on 6.2-RELEASE
Jason Thomson
jason.thomson at mintel.com
Wed Feb 28 13:54:14 UTC 2007
Regarding:
http://lists.freebsd.org/pipermail/freebsd-stable/2007-February/033241.html
Konstantin Belousov wrote:
> On Thu, Feb 22, 2007 at 06:50:37PM +0000, Jason Thomson wrote:
>
>
> Try this (already committed to CURRENT as rev. 1.579). I would be very
> interesting in getting feedback.
Konstantin,
thanks for your help.
The patch below *appears* to have helped.
The server survived for more than 24 hours under heavy (mysqld / apache)
load.
Previously, it would not typically survive this test for more than 5
hours.
It's difficult to be 100% sure as the server load is not reliably
reproducable.
I will keep you informed of any developments.
Thanks for your help.
Kind regards,
Jason.
>
> Index: sys/amd64/amd64/pmap.c
> ===================================================================
> RCS file: /usr/local/arch/ncvs/src/sys/amd64/amd64/pmap.c,v
> retrieving revision 1.578
> retrieving revision 1.579
> diff -u -r1.578 -r1.579
> --- sys/amd64/amd64/pmap.c 18 Feb 2007 06:33:01 -0000 1.578
> +++ sys/amd64/amd64/pmap.c 19 Feb 2007 10:55:16 -0000 1.579
> @@ -77,7 +77,7 @@
> */
>
> #include <sys/cdefs.h>
> -__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.578 2007/02/18 06:33:01 alc Exp $");
> +__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.579 2007/02/19 10:55:16 kib Exp $");
>
> /*
> * Manages physical address maps.
> @@ -1542,9 +1542,15 @@
> while ((*pmap_pde(kernel_pmap, kernel_vm_end) & PG_V) != 0) {
> kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1);
> nkpt++;
> + if (kernel_vm_end - 1 >= kernel_map->max_offset) {
> + kernel_vm_end = kernel_map->max_offset;
> + break;
> + }
> }
> }
> addr = roundup2(addr, PAGE_SIZE * NPTEPG);
> + if (addr - 1 >= kernel_map->max_offset)
> + addr = kernel_map->max_offset;
> while (kernel_vm_end < addr) {
> pde = pmap_pde(kernel_pmap, kernel_vm_end);
> if (pde == NULL) {
> @@ -1562,6 +1568,10 @@
> }
> if ((*pde & PG_V) != 0) {
> kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1);
> + if (kernel_vm_end - 1 >= kernel_map->max_offset) {
> + kernel_vm_end = kernel_map->max_offset;
> + break;
> + }
> continue;
> }
>
> @@ -1581,6 +1591,10 @@
> *pmap_pde(kernel_pmap, kernel_vm_end) = newpdir;
>
> kernel_vm_end = (kernel_vm_end + PAGE_SIZE * NPTEPG) & ~(PAGE_SIZE * NPTEPG - 1);
> + if (kernel_vm_end - 1 >= kernel_map->max_offset) {
> + kernel_vm_end = kernel_map->max_offset;
> + break;
> + }
> }
> }
>
More information about the freebsd-stable
mailing list