Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Ok, are all the panics fixed now?

0 views
Skip to first unread message

John Hay

unread,
Aug 28, 2003, 12:28:17 AM8/28/03
to
> >> So, I think we'll just include a warning with 4.9:
> >>
> >> WARNING!
> >>
> >> Do not attempt to stress a FreeBSD 4.9 machine if you:
> >
> >or "Upgrade your FreeBSD to RedHat".
>
> s/RedHat/FreeBSD 4.8-RELEASE/
>
> >It's simple: we need to backout all these untested MFCs.
>
> Or fix the bugs. I don't know anything about the code in question, but
> now that people are getting repeatable panics, I assume that tracking down
> the bugs will be rather easier.
> There was a time when STABLE absolutely needed to be stable, but I'm not
> sure that's necessarily the case any more; now that we have all the
> release/security branches, I think it's safe to say that most systems which
> need absolute stability aren't going to be running STABLE.

But the security branches don't get bug fixes, only security fixes. So
at the the end we don't have a branch for stability anymore. I think
that is a step in the wrong direction. I think by the time we get to
x.4 or x.5 of a branch, it should be rock stable and only get bug
fixes, with maybe device drivers added. Big changes should be avoided.

John
--
John Hay -- John...@icomtek.csir.co.za / jh...@FreeBSD.org
_______________________________________________
freebsd...@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-stable
To unsubscribe, send any mail to "freebsd-stabl...@freebsd.org"

Tor Egge

unread,
Aug 28, 2003, 12:13:29 PM8/28/03
to

> Ok, I booted with hw.physmem="16M", and a buildworld paniced with
> "free/cache page dirty". (I was taking a nap at the time the buildworld
> crashed, we'll talk about that soon.)

While one buildworld succeeded, another one crashed with
"panic: vm_page_dirty: page in cache", and a third one crashed with
a corrupt entry at the end of the vm_page_buckets[] array.

I added some instrumentation to detect unexpected sleeps causing the problem.
The problem still occurred without any such sleeps being detected, indicating
that the previous fix was incorrect.

I then added code to 'freeze' PMAP1 within critical sections.

panic: PMAP1 frozen
mp_lock = 01000002; cpuid = 1; lapic.id = 00000000^
Debugger("panic")
Stopped at Debugger+0x34: movb $0,in_Debugger.630
db> trace
Debugger(c02f95aa) at Debugger+0x34
panic(c03266cf,c08a2a18,c4395894,6e00cc64,cb426a78) at panic+0xa4
pmap_pte(cb421cac,8098000) at pmap_pte+0xa0
pmap_clear_modify(c0886bf4) at pmap_clear_modify+0x32
swp_pager_async_iodone(c4395894,c2d55400,c2d3b000,c2d55400,c2d3b0a0) at swp_pager_async_iodone+0x176
biodone(c4395894,c2d3b014,c4395894) at biodone+0xf5
dadone(c2d40a00,c2d55400,4d405,c087c514,8060000) at dadone+0x265
camisr(c035a770,cb426e6c,c02b75cb,0,cb420018) at camisr+0x1eb
swi_cambio(0,cb420018,cb420010,c02c0010,8060000) at swi_cambio+0xd
doreti_swi(cb4209ec,cb421fac,8048000,40000,8048000) at doreti_swi+0xf
vm_map_copy_entry(cb421f40,cb420980,c0364d70,cca2bcc0) at vm_map_copy_entry+0xdf
vmspace_fork(cb421f40,cb41b6c0,cb41b6c0,0,cb426f08) at vmspace_fork+0x1db
vm_fork(cb41ee00,cb41b6c0,14) at vm_fork+0x8e
fork1(cb41ee00,14,cb426f20,0,246) at fork1+0x7a7
fork(cb41ee00,cb426f80,80aa3c0,80aa3c0,0) at fork+0x16
syscall2(2f,2f,2f,0,80aa3c0) at syscall2+0x221
Xint0x80_syscall() at Xint0x80_syscall+0x2b


One stack level is missing: pmap_copy() is called from vm_map_copy_entry().

The main problem here is that we've got code running without splvm() protection
that depends on PMAP1 being unchanged at the same time as we have interrupts
changing PMAP1.

Without the PAE MFC patch, the interrupt would change PMAP1 while the functions
accessing page tables without splvm() protection would use the per-vmspace
APTpde/APTmap.

- Tor Egge

Mike Tancsa

unread,
Aug 28, 2003, 3:39:46 PM8/28/03
to

Hi,
Forgive the naive question, but is this an easy issue to solve ?
Or is it just scratching the surface of a larger more complex problem not
easily resolved by a simple patch or two ?

---Mike

Tor Egge

unread,
Aug 28, 2003, 4:21:47 PM8/28/03
to
----Next_Part(Thu_Aug_28_20:20:11_2003_868)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

>
> Hi,
> Forgive the naive question, but is this an easy issue to solve ?
> Or is it just scratching the surface of a larger more complex problem not
> easily resolved by a simple patch or two ?

I'm enclosed a patch that introduces PADDR2/PMAP2 which is to be used
by pmap_pte() (should not be called from interrupts on noncurrent
pmaps) while pmap_pte_quick() (should not be called without splvm()
protection) will use PADDR1/PMAP1.

The patch also backs out revision 1.250.2.20 of
src/sys/i386/i386/pmap.c.

- Tor Egge


----Next_Part(Thu_Aug_28_20:20:11_2003_868)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="paefix.diff2"

Index: sys/i386/i386/mp_machdep.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/i386/mp_machdep.c,v
retrieving revision 1.115.2.17
diff -u -r1.115.2.17 mp_machdep.c
--- sys/i386/i386/mp_machdep.c 9 Aug 2003 16:21:18 -0000 1.115.2.17
+++ sys/i386/i386/mp_machdep.c 28 Aug 2003 20:05:38 -0000
@@ -2133,13 +2133,14 @@
/* allocate and set up an idle stack data page */
stack = (char *)kmem_alloc(kernel_map, UPAGES*PAGE_SIZE);
for (i = 0; i < UPAGES; i++)
- SMPpt[pg + 5 + i] = (pt_entry_t)
+ SMPpt[pg + 6 + i] = (pt_entry_t)
(PG_V | PG_RW | vtophys(PAGE_SIZE * i + stack));

SMPpt[pg + 1] = 0; /* *prv_CMAP1 */
SMPpt[pg + 2] = 0; /* *prv_CMAP2 */
SMPpt[pg + 3] = 0; /* *prv_CMAP3 */
SMPpt[pg + 4] = 0; /* *prv_PMAP1 */
+ SMPpt[pg + 5] = 0; /* *prv_PMAP2 */

/* prime data page for it to use */
gd->gd_cpuid = x;
@@ -2148,10 +2149,12 @@
gd->gd_prv_CMAP2 = &SMPpt[pg + 2];
gd->gd_prv_CMAP3 = &SMPpt[pg + 3];
gd->gd_prv_PMAP1 = (pd_entry_t *)&SMPpt[pg + 4];
+ gd->gd_prv_PMAP2 = (pd_entry_t *)&SMPpt[pg + 5];
gd->gd_prv_CADDR1 = SMP_prvspace[x].CPAGE1;
gd->gd_prv_CADDR2 = SMP_prvspace[x].CPAGE2;
gd->gd_prv_CADDR3 = SMP_prvspace[x].CPAGE3;
gd->gd_prv_PADDR1 = (pt_entry_t *)SMP_prvspace[x].PPAGE1;
+ gd->gd_prv_PADDR2 = (pt_entry_t *)SMP_prvspace[x].PPAGE2;

/* setup a vector to our boot code */
*((volatile u_short *) WARMBOOT_OFF) = WARMBOOT_TARGET;
@@ -2205,7 +2208,7 @@
/* Allocate and setup BSP idle stack */
stack = (char *)kmem_alloc(kernel_map, UPAGES * PAGE_SIZE);
for (i = 0; i < UPAGES; i++)
- SMPpt[5 + i] = (pt_entry_t)
+ SMPpt[6 + i] = (pt_entry_t)
(PG_V | PG_RW | vtophys(PAGE_SIZE * i + stack));

for (x = 0; x < NKPT; x++)
Index: sys/i386/i386/genassym.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/i386/genassym.c,v
retrieving revision 1.86.2.4
diff -u -r1.86.2.4 genassym.c
--- sys/i386/i386/genassym.c 9 Aug 2003 16:21:17 -0000 1.86.2.4
+++ sys/i386/i386/genassym.c 28 Aug 2003 20:05:38 -0000
@@ -198,10 +198,12 @@
ASSYM(GD_PRV_CMAP2, offsetof(struct globaldata, gd_prv_CMAP2));
ASSYM(GD_PRV_CMAP3, offsetof(struct globaldata, gd_prv_CMAP3));
ASSYM(GD_PRV_PMAP1, offsetof(struct globaldata, gd_prv_PMAP1));
+ASSYM(GD_PRV_PMAP2, offsetof(struct globaldata, gd_prv_PMAP2));
ASSYM(GD_PRV_CADDR1, offsetof(struct globaldata, gd_prv_CADDR1));
ASSYM(GD_PRV_CADDR2, offsetof(struct globaldata, gd_prv_CADDR2));
ASSYM(GD_PRV_CADDR3, offsetof(struct globaldata, gd_prv_CADDR3));
ASSYM(GD_PRV_PADDR1, offsetof(struct globaldata, gd_prv_PADDR1));
+ASSYM(GD_PRV_PADDR2, offsetof(struct globaldata, gd_prv_PADDR2));
ASSYM(PS_IDLESTACK, offsetof(struct privatespace, idlestack));
ASSYM(PS_IDLESTACK_TOP, sizeof(struct privatespace));
#endif
Index: sys/i386/i386/globals.s
===================================================================
RCS file: /home/ncvs/src/sys/i386/i386/Attic/globals.s,v
retrieving revision 1.13.2.1
diff -u -r1.13.2.1 globals.s
--- sys/i386/i386/globals.s 16 May 2000 06:58:06 -0000 1.13.2.1
+++ sys/i386/i386/globals.s 28 Aug 2003 20:05:38 -0000
@@ -109,7 +109,9 @@
.globl gd_cpuid, gd_cpu_lockid, gd_other_cpus
.globl gd_ss_eflags, gd_inside_intr
.globl gd_prv_CMAP1, gd_prv_CMAP2, gd_prv_CMAP3, gd_prv_PMAP1
+ .globl gd_prv_PMAP2
.globl gd_prv_CADDR1, gd_prv_CADDR2, gd_prv_CADDR3, gd_prv_PADDR1
+ .globl gd_prv_PADDR2

.set gd_cpuid,globaldata + GD_CPUID
.set gd_cpu_lockid,globaldata + GD_CPU_LOCKID
@@ -120,10 +122,12 @@
.set gd_prv_CMAP2,globaldata + GD_PRV_CMAP2
.set gd_prv_CMAP3,globaldata + GD_PRV_CMAP3
.set gd_prv_PMAP1,globaldata + GD_PRV_PMAP1
+ .set gd_prv_PMAP2,globaldata + GD_PRV_PMAP2
.set gd_prv_CADDR1,globaldata + GD_PRV_CADDR1
.set gd_prv_CADDR2,globaldata + GD_PRV_CADDR2
.set gd_prv_CADDR3,globaldata + GD_PRV_CADDR3
.set gd_prv_PADDR1,globaldata + GD_PRV_PADDR1
+ .set gd_prv_PADDR2,globaldata + GD_PRV_PADDR2
#endif

#if defined(SMP) || defined(APIC_IO)
Index: sys/i386/i386/pmap.c
===================================================================
RCS file: /home/ncvs/src/sys/i386/i386/pmap.c,v
retrieving revision 1.250.2.20
diff -u -r1.250.2.20 pmap.c
--- sys/i386/i386/pmap.c 26 Aug 2003 05:35:00 -0000 1.250.2.20
+++ sys/i386/i386/pmap.c 28 Aug 2003 20:05:38 -0000
@@ -114,6 +114,8 @@
#include <sys/mman.h>
#include <sys/malloc.h>

+#include <machine/cpu.h>
+#include <machine/ipl.h>
#include <vm/vm.h>
#include <vm/vm_param.h>
#include <sys/sysctl.h>
@@ -215,15 +217,19 @@
#define CMAP2 prv_CMAP2
#define CMAP3 prv_CMAP3
#define PMAP1 prv_PMAP1
+#define PMAP2 prv_PMAP2
#define CADDR1 prv_CADDR1
#define CADDR2 prv_CADDR2
#define CADDR3 prv_CADDR3
#define PADDR1 prv_PADDR1
+#define PADDR2 prv_PADDR2
#else
static pt_entry_t *CMAP1, *CMAP2, *CMAP3;
static caddr_t CADDR1, CADDR2, CADDR3;
static pd_entry_t *PMAP1;
static pt_entry_t *PADDR1;
+static pd_entry_t *PMAP2;
+static pt_entry_t *PADDR2;
#endif

static pt_entry_t *ptmmap;
@@ -257,6 +263,7 @@

static vm_page_t pmap_allocpte __P((pmap_t pmap, vm_offset_t va));
static vm_page_t _pmap_allocpte __P((pmap_t pmap, unsigned ptepindex));
+static pt_entry_t *pmap_pte_quick __P((pmap_t pmap, vm_offset_t va));
static vm_page_t pmap_page_lookup __P((vm_object_t object, vm_pindex_t pindex));
static int pmap_unuse_pt __P((pmap_t, vm_offset_t, vm_page_t));
static vm_offset_t pmap_kmem_choose(vm_offset_t addr);
@@ -364,6 +371,7 @@
* ptemap is used for pmap_pte
*/
SYSMAP(pd_entry_t *, PMAP1, PADDR1, 1);
+ SYSMAP(pd_entry_t *, PMAP2, PADDR2, 1);
#endif

/*
@@ -454,10 +462,12 @@
gd->gd_prv_CMAP2 = &SMPpt[2];
gd->gd_prv_CMAP3 = &SMPpt[3];
gd->gd_prv_PMAP1 = &SMPpt[4];
+ gd->gd_prv_PMAP2 = &SMPpt[5];
gd->gd_prv_CADDR1 = SMP_prvspace[0].CPAGE1;
gd->gd_prv_CADDR2 = SMP_prvspace[0].CPAGE2;
gd->gd_prv_CADDR3 = SMP_prvspace[0].CPAGE3;
gd->gd_prv_PADDR1 = (pt_entry_t *)SMP_prvspace[0].PPAGE1;
+ gd->gd_prv_PADDR2 = (pt_entry_t *)SMP_prvspace[0].PPAGE2;
#endif

invltlb();
@@ -663,13 +673,18 @@
* Function:
* Extract the page table entry associated
* with the given map/virtual_address pair.
+ * Note: Must be protected by splvm()
*/

-pt_entry_t *
-pmap_pte(pmap_t pmap, vm_offset_t va)
+static pt_entry_t *
+pmap_pte_quick(pmap_t pmap, vm_offset_t va)
{
pd_entry_t *pde, newpf;

+#ifdef INVARIANTS
+ if (~cpl & (net_imask | bio_imask | cam_imask))
+ panic("pmap_pte_quick not protected by splvm()");
+#endif
pde = pmap_pde(pmap, va);
if (*pde & PG_V) {
if (*pde & PG_PS)
@@ -691,6 +706,44 @@
}

/*
+ * Routine: pmap_pte
+ * Function:
+ * Extract the page table entry associated
+ * with the given map/virtual_address pair.
+ * Note: Must not be called from interrupts on non-current pmap
+ */
+
+pt_entry_t *
+pmap_pte(pmap_t pmap, vm_offset_t va)
+{
+ pd_entry_t *pde, newpf;
+
+ pde = pmap_pde(pmap, va);
+ if (*pde & PG_V) {
+ if (*pde & PG_PS)
+ return (pt_entry_t *)pde;
+ if (pmap_is_current(pmap))
+ return vtopte(va);
+#ifdef INVARIANTS
+ if (intr_nesting_level != 0) {
+ panic("pmap_pte called from interrupt");
+ }
+#endif
+ newpf = *pde & PG_FRAME;
+ if ((*PMAP2 & PG_FRAME) != newpf) {
+ *PMAP2 = newpf | PG_RW | PG_V;
+#ifdef SMP
+ cpu_invlpg(PADDR2);
+#else
+ invltlb_1pg((vm_offset_t) PADDR2);
+#endif
+ }
+ return PADDR2 + (i386_btop(va) & (NPTEPG - 1));
+ }
+ return (0);
+}
+
+/*
* Routine: pmap_extract
* Function:
* Extract the physical page address associated
@@ -1635,8 +1688,8 @@
if (nva > eva)
nva = eva;

- for (; sva < nva; sva += PAGE_SIZE) {
- pte = pmap_pte(pmap, sva);
+ pte = pmap_pte(pmap, sva);
+ for (; sva < nva; sva += PAGE_SIZE, pte++) {
if ((*pte & PG_V) == 0)
continue;

@@ -1684,7 +1737,7 @@
while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) {
pv->pv_pmap->pm_stats.resident_count--;

- pte = pmap_pte(pv->pv_pmap, pv->pv_va);
+ pte = pmap_pte_quick(pv->pv_pmap, pv->pv_va);

tpte = pte_store(pte, 0);
if (tpte & PG_W)
@@ -2681,7 +2734,7 @@
#ifdef PMAP_REMOVE_PAGES_CURPROC_ONLY
pte = vtopte(pv->pv_va);
#else
- pte = pmap_pte(pv->pv_pmap, pv->pv_va);
+ pte = pmap_pte_quick(pv->pv_pmap, pv->pv_va);
#endif
tpte = *pte;

@@ -2762,7 +2815,7 @@
continue;
}
#endif
- pte = pmap_pte(pv->pv_pmap, pv->pv_va);
+ pte = pmap_pte_quick(pv->pv_pmap, pv->pv_va);
if (*pte & bit) {
splx(s);
return TRUE;
@@ -2807,7 +2860,7 @@
}
#endif

- pte = pmap_pte(pv->pv_pmap, pv->pv_va);
+ pte = pmap_pte_quick(pv->pv_pmap, pv->pv_va);

if (setem) {
*pte |= bit;
@@ -2893,7 +2946,7 @@
if (!pmap_track_modified(pv->pv_va))
continue;

- pte = pmap_pte(pv->pv_pmap, pv->pv_va);
+ pte = pmap_pte_quick(pv->pv_pmap, pv->pv_va);

if (pte && (*pte & PG_A)) {
*pte &= ~PG_A;
@@ -3180,6 +3233,7 @@
struct proc *p;
int npte = 0;
int index;
+ int s;
LIST_FOREACH(p, &allproc, p_list) {
if (p->p_pid != pid)
continue;
@@ -3195,6 +3249,7 @@

pde = &pmap->pm_pdir[i];
if (pde && pmap_pde_v(pde)) {
+ s = splvm();
for(j=0;j<1024;j++) {
unsigned va = base + (j << PAGE_SHIFT);
if (va >= (vm_offset_t) VM_MIN_KERNEL_ADDRESS) {
@@ -3202,9 +3257,10 @@
index = 0;
printf("\n");
}
+ splx(s);
return npte;
}
- pte = pmap_pte( pmap, va);
+ pte = pmap_pte_quick(pmap, va);
if (pte && pmap_pte_v(pte)) {
vm_offset_t pa;
vm_page_t m;
@@ -3222,6 +3278,7 @@
}
}
}
+ splx(s);
}
}
}
@@ -3242,9 +3299,11 @@
{
unsigned va, i, j;
unsigned *ptep;
+ int s;

if (pm == kernel_pmap)
return;
+ s = splvm();
for (i = 0; i < 1024; i++)
if (pm->pm_pdir[i])
for (j = 0; j < 1024; j++) {
@@ -3253,10 +3312,11 @@
continue;
if (pm != kernel_pmap && va > UPT_MAX_ADDRESS)
continue;
- ptep = pmap_pte(pm, va);
+ ptep = pmap_pte_quick(pm, va);
if (pmap_pte_v(ptep))
printf("%x:%x ", va, *(int *) ptep);
};
+ splx(s);

}

Index: sys/i386/include/globaldata.h
===================================================================
RCS file: /home/ncvs/src/sys/i386/include/Attic/globaldata.h,v
retrieving revision 1.11.2.2
diff -u -r1.11.2.2 globaldata.h
--- sys/i386/include/globaldata.h 9 Aug 2003 16:21:19 -0000 1.11.2.2
+++ sys/i386/include/globaldata.h 28 Aug 2003 20:05:38 -0000
@@ -61,10 +61,12 @@
pt_entry_t *gd_prv_CMAP2;
pt_entry_t *gd_prv_CMAP3;
pd_entry_t *gd_prv_PMAP1;
+ pd_entry_t *gd_prv_PMAP2;
caddr_t gd_prv_CADDR1;
caddr_t gd_prv_CADDR2;
caddr_t gd_prv_CADDR3;
pt_entry_t *gd_prv_PADDR1;
+ pt_entry_t *gd_prv_PADDR2;
#endif
u_int gd_astpending;
};
@@ -80,13 +82,14 @@
struct globaldata globaldata;
char __filler0[PAGE_SIZE - sizeof(struct globaldata)];

- /* page 1..4 - CPAGE1,CPAGE2,CPAGE3,PPAGE1 */
+ /* page 1..5 - CPAGE1,CPAGE2,CPAGE3,PPAGE1,PPAGE2 */
char CPAGE1[PAGE_SIZE];
char CPAGE2[PAGE_SIZE];
char CPAGE3[PAGE_SIZE];
char PPAGE1[PAGE_SIZE];
+ char PPAGE2[PAGE_SIZE];

- /* page 5..4+UPAGES - idle stack (UPAGES pages) */
+ /* page 6..5+UPAGES - idle stack (UPAGES pages) */
char idlestack[UPAGES * PAGE_SIZE];
};

Index: sys/i386/include/globals.h
===================================================================
RCS file: /home/ncvs/src/sys/i386/include/Attic/globals.h,v
retrieving revision 1.5.2.2
diff -u -r1.5.2.2 globals.h
--- sys/i386/include/globals.h 9 Aug 2003 16:21:19 -0000 1.5.2.2
+++ sys/i386/include/globals.h 28 Aug 2003 20:05:38 -0000
@@ -104,10 +104,12 @@
#define prv_CMAP2 GLOBAL_LVALUE(prv_CMAP2, pt_entry_t *)
#define prv_CMAP3 GLOBAL_LVALUE(prv_CMAP3, pt_entry_t *)
#define prv_PMAP1 GLOBAL_LVALUE(prv_PMAP1, pd_entry_t *)
+#define prv_PMAP2 GLOBAL_LVALUE(prv_PMAP2, pd_entry_t *)
#define prv_CADDR1 GLOBAL_RVALUE(prv_CADDR1, caddr_t)
#define prv_CADDR2 GLOBAL_RVALUE(prv_CADDR2, caddr_t)
#define prv_CADDR3 GLOBAL_RVALUE(prv_CADDR3, caddr_t)
#define prv_PADDR1 GLOBAL_RVALUE(prv_PADDR1, pt_entry_t *)
+#define prv_PADDR2 GLOBAL_RVALUE(prv_PADDR2, pt_entry_t *)
#endif
#endif /*UP kernel*/

@@ -134,10 +136,12 @@
GLOBAL_FUNC(prv_CMAP2)
GLOBAL_FUNC(prv_CMAP3)
GLOBAL_FUNC(prv_PMAP1)
+GLOBAL_FUNC(prv_PMAP2)
GLOBAL_FUNC(prv_CADDR1)
GLOBAL_FUNC(prv_CADDR2)
GLOBAL_FUNC(prv_CADDR3)
GLOBAL_FUNC(prv_PADDR1)
+GLOBAL_FUNC(prv_PADDR2)
#endif

#define SET_CURPROC(x) (_global_curproc_set_nv((int)x))

----Next_Part(Thu_Aug_28_20:20:11_2003_868)--
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
freebsd...@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-stable
To unsubscribe, send any mail to "freebsd-stabl...@freebsd.org"

----Next_Part(Thu_Aug_28_20:20:11_2003_868)----

Mike Silbersack

unread,
Aug 29, 2003, 12:36:29 AM8/29/03
to

On Thu, 28 Aug 2003, Tor Egge wrote:

> I'm enclosed a patch that introduces PADDR2/PMAP2 which is to be used
> by pmap_pte() (should not be called from interrupts on noncurrent
> pmaps) while pmap_pte_quick() (should not be called without splvm()
> protection) will use PADDR1/PMAP1.
>
> The patch also backs out revision 1.250.2.20 of
> src/sys/i386/i386/pmap.c.
>
> - Tor Egge

With this patch applied, my Celeron 450 with 12 megs of ram (artifically
limited, of course) has been swapping away while running a buildworld for
3+ hours now without a problem. Before your patch, it would die in 15
minutes or so; I think you may have fixed the problem.

Good work, as always!

Mike "Silby" Silbersack

Erik Trulsson

unread,
Aug 30, 2003, 7:24:50 AM8/30/03
to
On Thu, Aug 28, 2003 at 11:34:19PM -0500, Mike Silbersack wrote:
>
>
> On Thu, 28 Aug 2003, Tor Egge wrote:
>
> > I'm enclosed a patch that introduces PADDR2/PMAP2 which is to be used
> > by pmap_pte() (should not be called from interrupts on noncurrent
> > pmaps) while pmap_pte_quick() (should not be called without splvm()
> > protection) will use PADDR1/PMAP1.
> >
> > The patch also backs out revision 1.250.2.20 of
> > src/sys/i386/i386/pmap.c.
> >
> > - Tor Egge
>
> With this patch applied, my Celeron 450 with 12 megs of ram (artifically
> limited, of course) has been swapping away while running a buildworld for
> 3+ hours now without a problem. Before your patch, it would die in 15
> minutes or so; I think you may have fixed the problem.
>
> Good work, as always!

Same thing here: With this patch I haven't been able to provoke a
panic, while without it I could reliably get one of my machines to
panic.

--
<Insert your favourite quote here.>
Erik Trulsson
ertr...@student.uu.se

Matthew Dillon

unread,
Aug 31, 2003, 1:04:33 PM8/31/03
to

:>
:> Hi,

:> Forgive the naive question, but is this an easy issue to solve ?
:> Or is it just scratching the surface of a larger more complex problem not
:> easily resolved by a simple patch or two ?
:
:I'm enclosed a patch that introduces PADDR2/PMAP2 which is to be used

:by pmap_pte() (should not be called from interrupts on noncurrent
:pmaps) while pmap_pte_quick() (should not be called without splvm()
:protection) will use PADDR1/PMAP1.
:
:The patch also backs out revision 1.250.2.20 of
:src/sys/i386/i386/pmap.c.
:
:- Tor Egge

Tor, this looks like it could have been an issue even before the PAE
patch went in. What are your thoughts on the matter?

-Matt

Maxim Konovalov

unread,
Sep 3, 2003, 11:01:26 AM9/3/03
to
>From the today sources:

db> trace
Debugger(c025119b) at Debugger+0x34
panic(c02642a0,c968ee58,c01f3bbd,c02a524c,c02a524c) at panic+0x70
vm_map_entry_create(c02a524c,c02a524c,c99c7000,c968eedc,c968ee6c) at
vm_map_entry_create+0x40
vm_map_insert(c02a524c,c9944114,0,0,c99c7000) at vm_map_insert+0x199
vm_map_find(c02a524c,c9944114,0,0,c968eedc,4000,1,7,7,0,0,4) at
vm_map_find+0xdc
pipespace(c99d5400,4000,c99d546c,c) at pipespace+0x5b
pipe_create(c968ef20) at pipe_create+0x8a
pipe(c94d9d00,c968ef80,c,806a280,8061962) at pipe+0x5c
syscall2(2f,2f,2f,8061962,806a280) at syscall2+0x209
Xint0x80_syscall() at Xint0x80_syscall+0x25

--
Maxim Konovalov, ma...@macomnet.ru, ma...@FreeBSD.org

Mike Silbersack

unread,
Sep 3, 2003, 11:25:51 AM9/3/03
to

On Wed, 3 Sep 2003, Maxim Konovalov wrote:

> >From the today sources:
>
> db> trace
> Debugger(c025119b) at Debugger+0x34
> panic(c02642a0,c968ee58,c01f3bbd,c02a524c,c02a524c) at panic+0x70
> vm_map_entry_create(c02a524c,c02a524c,c99c7000,c968eedc,c968ee6c) at

Was it a kernel resorces exhausted panic, or something else?

Mike "Silby" Silbersack

0 new messages