From: Greg Kroah-Hartman Date: Tue, 11 Feb 2014 17:36:05 +0000 (-0800) Subject: 3.13-stable patches X-Git-Tag: v3.4.80~23 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=df504bae2ef62756752cc25c46ce8f41ff5e37f2;p=thirdparty%2Fkernel%2Fstable-queue.git 3.13-stable patches added patches: powerpc-mm-fix-compile-error-of-pgtable-ppc64.h.patch powerpc-thp-fix-crash-on-mremap.patch --- diff --git a/queue-3.13/powerpc-mm-fix-compile-error-of-pgtable-ppc64.h.patch b/queue-3.13/powerpc-mm-fix-compile-error-of-pgtable-ppc64.h.patch new file mode 100644 index 00000000000..a195877c7a0 --- /dev/null +++ b/queue-3.13/powerpc-mm-fix-compile-error-of-pgtable-ppc64.h.patch @@ -0,0 +1,46 @@ +From fd120dc2e205d2318a8b47d6d8098b789e3af67d Mon Sep 17 00:00:00 2001 +From: Li Zhong +Date: Tue, 28 Jan 2014 17:52:42 +0530 +Subject: powerpc/mm: Fix compile error of pgtable-ppc64.h + +From: Li Zhong + +commit fd120dc2e205d2318a8b47d6d8098b789e3af67d upstream. + +It seems that forward declaration couldn't work well with typedef, use +struct spinlock directly to avoiding following build errors: + +In file included from include/linux/spinlock.h:81, + from include/linux/seqlock.h:35, + from include/linux/time.h:5, + from include/uapi/linux/timex.h:56, + from include/linux/timex.h:56, + from include/linux/sched.h:17, + from arch/powerpc/kernel/asm-offsets.c:17: +include/linux/spinlock_types.h:76: error: redefinition of typedef 'spinlock_t' +/root/linux-next/arch/powerpc/include/asm/pgtable-ppc64.h:563: note: previous declaration of 'spinlock_t' was here + +Signed-off-by: Li Zhong +Signed-off-by: Aneesh Kumar K.V +Signed-off-by: Benjamin Herrenschmidt +Signed-off-by: Greg Kroah-Hartman + +--- + arch/powerpc/include/asm/pgtable-ppc64.h | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- a/arch/powerpc/include/asm/pgtable-ppc64.h ++++ b/arch/powerpc/include/asm/pgtable-ppc64.h +@@ -560,9 +560,9 @@ extern void pmdp_invalidate(struct vm_ar + pmd_t *pmdp); + + #define pmd_move_must_withdraw pmd_move_must_withdraw +-typedef struct spinlock spinlock_t; +-static inline int pmd_move_must_withdraw(spinlock_t *new_pmd_ptl, +- spinlock_t *old_pmd_ptl) ++struct spinlock; ++static inline int pmd_move_must_withdraw(struct spinlock *new_pmd_ptl, ++ struct spinlock *old_pmd_ptl) + { + /* + * Archs like ppc64 use pgtable to store per pmd diff --git a/queue-3.13/powerpc-thp-fix-crash-on-mremap.patch b/queue-3.13/powerpc-thp-fix-crash-on-mremap.patch new file mode 100644 index 00000000000..1b2ca130a1a --- /dev/null +++ b/queue-3.13/powerpc-thp-fix-crash-on-mremap.patch @@ -0,0 +1,110 @@ +From b3084f4db3aeb991c507ca774337c7e7893ed04f Mon Sep 17 00:00:00 2001 +From: "Aneesh Kumar K.V" +Date: Mon, 13 Jan 2014 11:34:24 +0530 +Subject: powerpc/thp: Fix crash on mremap + +From: "Aneesh Kumar K.V" + +commit b3084f4db3aeb991c507ca774337c7e7893ed04f upstream. + +This patch fix the below crash + +NIP [c00000000004cee4] .__hash_page_thp+0x2a4/0x440 +LR [c0000000000439ac] .hash_page+0x18c/0x5e0 +... +Call Trace: +[c000000736103c40] [00001ffffb000000] 0x1ffffb000000(unreliable) +[437908.479693] [c000000736103d50] [c0000000000439ac] .hash_page+0x18c/0x5e0 +[437908.479699] [c000000736103e30] [c00000000000924c] .do_hash_page+0x4c/0x58 + +On ppc64 we use the pgtable for storing the hpte slot information and +store address to the pgtable at a constant offset (PTRS_PER_PMD) from +pmd. On mremap, when we switch the pmd, we need to withdraw and deposit +the pgtable again, so that we find the pgtable at PTRS_PER_PMD offset +from new pmd. + +We also want to move the withdraw and deposit before the set_pmd so +that, when page fault find the pmd as trans huge we can be sure that +pgtable can be located at the offset. + +Signed-off-by: Aneesh Kumar K.V +Acked-by: Kirill A. Shutemov +Signed-off-by: Benjamin Herrenschmidt +Signed-off-by: Greg Kroah-Hartman + +--- + arch/powerpc/include/asm/pgtable-ppc64.h | 14 ++++++++++++++ + include/asm-generic/pgtable.h | 12 ++++++++++++ + mm/huge_memory.c | 14 +++++--------- + 3 files changed, 31 insertions(+), 9 deletions(-) + +--- a/arch/powerpc/include/asm/pgtable-ppc64.h ++++ b/arch/powerpc/include/asm/pgtable-ppc64.h +@@ -558,5 +558,19 @@ extern pgtable_t pgtable_trans_huge_with + #define __HAVE_ARCH_PMDP_INVALIDATE + extern void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, + pmd_t *pmdp); ++ ++#define pmd_move_must_withdraw pmd_move_must_withdraw ++typedef struct spinlock spinlock_t; ++static inline int pmd_move_must_withdraw(spinlock_t *new_pmd_ptl, ++ spinlock_t *old_pmd_ptl) ++{ ++ /* ++ * Archs like ppc64 use pgtable to store per pmd ++ * specific information. So when we switch the pmd, ++ * we should also withdraw and deposit the pgtable ++ */ ++ return true; ++} ++ + #endif /* __ASSEMBLY__ */ + #endif /* _ASM_POWERPC_PGTABLE_PPC64_H_ */ +--- a/include/asm-generic/pgtable.h ++++ b/include/asm-generic/pgtable.h +@@ -558,6 +558,18 @@ static inline pmd_t pmd_read_atomic(pmd_ + } + #endif + ++#ifndef pmd_move_must_withdraw ++static inline int pmd_move_must_withdraw(spinlock_t *new_pmd_ptl, ++ spinlock_t *old_pmd_ptl) ++{ ++ /* ++ * With split pmd lock we also need to move preallocated ++ * PTE page table if new_pmd is on different PMD page table. ++ */ ++ return new_pmd_ptl != old_pmd_ptl; ++} ++#endif ++ + /* + * This function is meant to be used by sites walking pagetables with + * the mmap_sem hold in read mode to protect against MADV_DONTNEED and +--- a/mm/huge_memory.c ++++ b/mm/huge_memory.c +@@ -1502,19 +1502,15 @@ int move_huge_pmd(struct vm_area_struct + spin_lock_nested(new_ptl, SINGLE_DEPTH_NESTING); + pmd = pmdp_get_and_clear(mm, old_addr, old_pmd); + VM_BUG_ON(!pmd_none(*new_pmd)); +- set_pmd_at(mm, new_addr, new_pmd, pmd_mksoft_dirty(pmd)); +- if (new_ptl != old_ptl) { +- pgtable_t pgtable; + +- /* +- * Move preallocated PTE page table if new_pmd is on +- * different PMD page table. +- */ ++ if (pmd_move_must_withdraw(new_ptl, old_ptl)) { ++ pgtable_t pgtable; + pgtable = pgtable_trans_huge_withdraw(mm, old_pmd); + pgtable_trans_huge_deposit(mm, new_pmd, pgtable); +- +- spin_unlock(new_ptl); + } ++ set_pmd_at(mm, new_addr, new_pmd, pmd_mksoft_dirty(pmd)); ++ if (new_ptl != old_ptl) ++ spin_unlock(new_ptl); + spin_unlock(old_ptl); + } + out: diff --git a/queue-3.13/series b/queue-3.13/series index f0bd316c17a..6c060650e04 100644 --- a/queue-3.13/series +++ b/queue-3.13/series @@ -107,3 +107,5 @@ drm-mgag200-ast-cirrus-fix-regression-with-drm_can_sleep-conversion.patch ftrace-synchronize-setting-function_trace_op-with-ftrace_trace_function.patch ftrace-fix-synchronization-location-disabling-and-freeing-ftrace_ops.patch ftrace-have-function-graph-only-trace-based-on-global_ops-filters.patch +powerpc-thp-fix-crash-on-mremap.patch +powerpc-mm-fix-compile-error-of-pgtable-ppc64.h.patch