panic upon starting X in recent -CURRENTs (intel driver)
Alan Cox
alc at cs.rice.edu
Wed Feb 20 07:40:28 UTC 2008
Kostik Belousov wrote:
>What happen there is that munmap() do the split for the /dev/mem mapping.
>This caused the OBJT_DEVICE ref_count to be bumped, and vm_map_entry_delete()
>called vm_object_page_remove(). The later called pmap_remove_all()
>unconditionally.
>
>pmap_remove_all has the KASSERT that fails exactly when supplied
>fictitious page. It becomes KASSERT in the rev. 1.106 of i386/pmap.c,
>committed 2008/01/08, it was under the PMAP_DIAGNOSTIC before.
>
>Since such page has md.pv_list empty anyway, this KASSERT seems to be
>only the statement of intent. The change below would prevent the panic
>by not calling pmap_remove_all from vm_object_page_remove for such pages.
>
>
>
In fact, md.pv_list is never initialized for fictitious pages. So, the
invocation of pmap_remove_all() has only worked 'til now because the
underlying memory is zeroed.
>Alan, do you have objections ? [Alternative seems to be a removal of the
>assertions from all pmap implementations, that also weaken the invariants
>for other callers that do skip fictitious pages].
>
>
I want to think this over. I'll e-mail you this weekend.
>diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c
>index 21c0ac6..21ee10d 100644
>--- a/sys/vm/vm_object.c
>+++ b/sys/vm/vm_object.c
>@@ -1884,7 +1884,8 @@ again:
> */
> if ((wirings = p->wire_count) != 0 &&
> (wirings = pmap_page_wired_mappings(p)) != p->wire_count) {
>- pmap_remove_all(p);
>+ if ((p->flags & PG_FICTITIOUS) == 0)
>+ pmap_remove_all(p);
> /* Account for removal of managed, wired mappings. */
> p->wire_count -= wirings;
> if (!clean_only)
>@@ -1898,7 +1899,8 @@ again:
> if (p->valid & p->dirty)
> continue;
> }
>- pmap_remove_all(p);
>+ if ((p->flags & PG_FICTITIOUS) == 0)
>+ pmap_remove_all(p);
> /* Account for removal of managed, wired mappings. */
> if (wirings != 0)
> p->wire_count -= wirings;
>
>
More information about the freebsd-current
mailing list