[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |