|
[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 |