diff options
-rw-r--r-- | arch/sh/mm/fault_32.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/arch/sh/mm/fault_32.c b/arch/sh/mm/fault_32.c index 08d0117d90fa..dbbdeba2cee5 100644 --- a/arch/sh/mm/fault_32.c +++ b/arch/sh/mm/fault_32.c | |||
@@ -60,8 +60,15 @@ static inline pmd_t *vmalloc_sync_one(pgd_t *pgd, unsigned long address) | |||
60 | 60 | ||
61 | if (!pmd_present(*pmd)) | 61 | if (!pmd_present(*pmd)) |
62 | set_pmd(pmd, *pmd_k); | 62 | set_pmd(pmd, *pmd_k); |
63 | else | 63 | else { |
64 | /* | ||
65 | * The page tables are fully synchronised so there must | ||
66 | * be another reason for the fault. Return NULL here to | ||
67 | * signal that we have not taken care of the fault. | ||
68 | */ | ||
64 | BUG_ON(pmd_page(*pmd) != pmd_page(*pmd_k)); | 69 | BUG_ON(pmd_page(*pmd) != pmd_page(*pmd_k)); |
70 | return NULL; | ||
71 | } | ||
65 | 72 | ||
66 | return pmd_k; | 73 | return pmd_k; |
67 | } | 74 | } |
@@ -87,7 +94,7 @@ static noinline int vmalloc_fault(unsigned long address) | |||
87 | * an interrupt in the middle of a task switch.. | 94 | * an interrupt in the middle of a task switch.. |
88 | */ | 95 | */ |
89 | pgd_k = get_TTB(); | 96 | pgd_k = get_TTB(); |
90 | pmd_k = vmalloc_sync_one(__va((unsigned long)pgd_k), address); | 97 | pmd_k = vmalloc_sync_one(pgd_k, address); |
91 | if (!pmd_k) | 98 | if (!pmd_k) |
92 | return -1; | 99 | return -1; |
93 | 100 | ||