[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] vmalloc_sync_all crash still happening on some machines



On Tue, 2011-12-20 at 17:29 +0000, Ian Jackson wrote:
> Jan Beulich writes ("Re: [Xen-devel] vmalloc_sync_all crash still happening 
> on some machines"):
> > If this is reproducible in some way, printing the entries (or really just
> > their PFNs/MFNs) might help understand what is going on here
> > (assuming that such a race can be expected to not really exist in
> > this old and mature a kernel).
> 
> It does seem quite reproducible.  I'd be happy to test patches etc.

(trawling my backlog).

How about this for starters (the ret change is incidental and fixes an
existing warning):

8<--------------------------------------------------------------------

>From 823c4eb30f08e2f35170e4d98c9477dd6d24a387 Mon Sep 17 00:00:00 2001
From: Ian Campbell <ian.campbell@xxxxxxxxxx>
Date: Fri, 13 Jan 2012 10:35:14 +0000
Subject: [PATCH] Debug vmalloc_sync_all crash

---
 arch/x86/mm/fault.c |   18 ++++++++++++++----
 1 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
index 7e7dbd1..5df9335 100644
--- a/arch/x86/mm/fault.c
+++ b/arch/x86/mm/fault.c
@@ -206,8 +206,18 @@ static inline pmd_t *vmalloc_sync_one(pgd_t *pgd, unsigned 
long address)
 
        if (!pmd_present(*pmd))
                set_pmd(pmd, *pmd_k);
-       else
+       else {
+               printk(KERN_CRIT "vmalloc sync one failure for %#lx\n", 
address);
+               printk(KERN_CRIT "  pgd %p = %#010llx\n", pgd, pgd_val(*pgd));
+               printk(KERN_CRIT "pgd_k %p = %#010llx\n", pgd_k, 
pgd_val(*pgd_k));
+               printk(KERN_CRIT "  pud %p = %#010llx\n", pud, pud_val(*pud));
+               printk(KERN_CRIT "pud_k %p = %#010llx\n", pud_k, 
pud_val(*pud_k));
+               printk(KERN_CRIT "  pmd %p = %#010llx\n", pmd, pmd_val(*pmd));
+               printk(KERN_CRIT "pmd_k %p = %#010llx\n", pmd_k, 
pmd_val(*pmd_k));
+               printk(KERN_CRIT "pmd page   %p\n", pmd_page(*pmd));
+               printk(KERN_CRIT "pmd_k page %p\n", pmd_page(*pmd_k));
                BUG_ON(pmd_page(*pmd) != pmd_page(*pmd_k));
+       }
 
        return pmd_k;
 }
@@ -229,15 +239,15 @@ void vmalloc_sync_all(void)
                spin_lock_irqsave(&pgd_lock, flags);
                list_for_each_entry(page, &pgd_list, lru) {
                        spinlock_t *pgt_lock;
-                       int ret;
+                       pmd_t *pmd;
 
                        pgt_lock = &pgd_page_get_mm(page)->page_table_lock;
 
                        spin_lock(pgt_lock);
-                       ret = vmalloc_sync_one(page_address(page), address);
+                       pmd = vmalloc_sync_one(page_address(page), address);
                        spin_unlock(pgt_lock);
 
-                       if (!ret)
+                       if (!pmd)
                                break;
                }
                spin_unlock_irqrestore(&pgd_lock, flags);
-- 
1.7.2.5




_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.