Hi Jean-Sebastien,

On Sat, Jul 20, 2013 at 9:28 AM, Jean-Sébastien Pédron
<[email protected]> wrote:
> Hello Neel!
>
> With commit r252646, I have a "vm_page_dirty: page is invalid!" panic
> almost each time an X11 application or the X.Org server itself exit.
> Everything runs fine if I revert this commit.
>
> FreeBSD is built with the experimental radeonkms driver. As I haven't
> seen any other report of this problem, I suppose I do something wrong in
> TTM or the driver itself.
>
> Here's the core.txt:
> http://people.freebsd.org/~dumbbell/radeonkms/r252646-panic-vm_page_dirty-page-is-invalid.core.txt
>
> Do you have any suggestion about what I should look for?
>

I would start looking by looking at the value of the page table entry
in question (this would be 'tpte' in pmap_remove_pages()).

In particular, it would be useful to identify whether this is pointing
to a superpage mapping and if so what page within the superpage is
triggering the "vm_page_dirty: page is invalid" panic.

The following patch may help to do that (but I haven't actually tested it):

Index: pmap.c
===================================================================
--- pmap.c      (revision 253505)
+++ pmap.c      (working copy)
@@ -4379,6 +4379,20 @@
        return (rv);
 }

+static void
+pmap_check_valid(vm_page_t m, vm_offset_t va, pt_entry_t tpte)
+{
+       if (m->valid != VM_PAGE_BITS_ALL) {
+               printf("va = %#lx\n", va);
+               printf("tpte = %#lx\n", tpte);
+               printf("m->phys_addr = %#lx\n", m->phys_addr);
+               printf("m->valid = %#x\n", m->valid);
+               printf("m->dirty= %#x\n", m->dirty);
+               printf("m->flags = %x, aflags = %x, oflags = %x\n",
+                       m->flags, m->aflags, m->oflags);
+       }
+}
+
 /*
  * Remove all pages from specified address space
  * this aids process exit speeds.  Also, this code
@@ -4469,10 +4483,14 @@
                                 */
                                if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW)) {
                                        if ((tpte & PG_PS) != 0) {
-                                               for (mt = m; mt < &m[NBPDR / 
PAGE_SIZE]; mt++)
+                                               for (mt = m; mt < &m[NBPDR / 
PAGE_SIZE]; mt++) {
+                                                       pmap_check_valid(mt, 
pv->pv_va, tpte);
                                                        vm_page_dirty(mt);
-                                       } else
+                                               }
+                                       } else {
+                                               pmap_check_valid(m, pv->pv_va, 
tpte);
                                                vm_page_dirty(m);
+                                       }
                                }

                                CHANGE_PV_LIST_LOCK_TO_VM_PAGE(&lock, m);

best
Neel

> --
> Jean-Sébastien Pédron
>
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to