Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 02 Sep 2001 01:25:00 -0700
From:      Peter Wemm <peter@wemm.org>
To:        Andrew Gallatin <gallatin@cs.duke.edu>
Cc:        John Baldwin <jhb@FreeBSD.ORG>, freebsd-alpha@FreeBSD.ORG, cvs-committers@FreeBSD.ORG
Subject:   Re: cvs commit: src/sys/alpha/alpha pmap.c 
Message-ID:  <20010902082500.5A0FD3807@overcee.netplex.com.au>
In-Reply-To: <15247.55907.363565.267385@grasshopper.cs.duke.edu> 

next in thread | previous in thread | raw e-mail | index | archive | help
Andrew Gallatin wrote:
> 
> John Baldwin writes:
>  > Can you do a 'l *0xfffffc0000582da8' in gdb to see what source line it die
    d on?
> 
> 0xfffffc0000582da8 is in pmap_remove_pages (../../../alpha/alpha/pmap.c:2612)
> 
> Which ends up being:
> 
>   2607  #ifdef PMAP_REMOVE_PAGES_CURPROC_ONLY
>   2608                  pte = vtopte(pv->pv_va);
>   2609  #else
>   2610                  pte = pmap_pte_quick(pv->pv_pmap, pv->pv_va);
>   2611  #endif
>   2612                  if (!pmap_pte_v(pte))
>   2613                          panic("pmap_remove_pages: page on pm_pvlist h
    as no pte\n");
>   2614                  tpte = *pte;

Well, I'm confused now.  I've reread the 1.63 -> 1.64 diff about 50 
times now and I cannot for the life of me see any actual real change.
Maybe I've been looking at it for so long now that I cannot see what
is staring right at me?  Can you please look over the diff and see
if you can spot something that I cannot see?

Also, do you see an immediate explosion or one at some later point? Is it
repeatable - if not, is it possible that you just had the semi-regular
crash with the -current while running the new kernel?

What is the value of "pte" BTW?

pmap_dispose_proc() is essentially changed like this:

+       vm_offset_t up;

-       ptek = vtopte((vm_offset_t) p->p_addr);
+       up = (vm_offset_t)p->p_addr;
+       ptek = vtopte(up);

-               if ((m = vm_page_lookup(upobj, i)) == NULL)
+               m = vm_page_lookup(upobj, i);
+               if (m == NULL)

-               pmap_invalidate_page(kernel_pmap, (vm_offset_t)p->p_addr + i * PAGE_SIZE);
+               pmap_invalidate_page(kernel_pmap, up + i * PAGE_SIZE);

The rest is whitespace.  I really dont see how this can lead to the
kind of crash you saw. :-(

Anyway, the next thing to try is to back out one of the four functions
at a time.. (or do a binary search, backing out 2 then either the 3rd or
restoring 1).

I would look over the asm code but I just *know* gcc is going to produce
totally unrecognizable assembler differences. :-(

There is some serious badness with object / resource management here. When
a process is created, its vm object is created and *never* destroyed. Its
pointer is left in p_upages_obj across exit() and later with a new fork().
It depends on the vm zones being type safe and preserving their contents
across zfree() / zalloc().  At least it releases the pages at exit.

I will rebuild my UP2000 at work and retest it there as well.  I'll let you
know what happens.

Cheers,
-Peter
--
Peter Wemm - peter@FreeBSD.org; peter@yahoo-inc.com; peter@netplex.com.au
"All of this is for nothing if we don't go to the stars" - JMS/B5


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-alpha" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010902082500.5A0FD3807>