commit 0e311d237d7f3022b7dafb639b42541bfb42fe94 upstream.
When the P4D page table layer is folded at runtime, the p4d_free() should do nothing, the same as in <asm-generic/pgtable-nop4d.h>.
It seems this bug should cause double-free in efi_call_phys_epilog(), but I don't know how to trigger that code path, so I can't confirm that by testing.
Signed-off-by: Andrey Ryabinin aryabinin@virtuozzo.com Reviewed-by: Kirill A. Shutemov kirill.shutemov@linux.intel.com Cc: Linus Torvalds torvalds@linux-foundation.org Cc: Peter Zijlstra peterz@infradead.org Cc: Thomas Gleixner tglx@linutronix.de Cc: stable@vger.kernel.org # 4.17 Fixes: 98219dda2ab5 ("x86/mm: Fold p4d page table layer at runtime") Link: http://lkml.kernel.org/r/20180625102427.15015-1-aryabinin@virtuozzo.com Signed-off-by: Ingo Molnar mingo@kernel.org Signed-off-by: Andrey Ryabinin aryabinin@virtuozzo.com ---
Changes since v1: - Fix wrong "From:" field
arch/x86/include/asm/pgalloc.h | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/arch/x86/include/asm/pgalloc.h b/arch/x86/include/asm/pgalloc.h index 263c142a6a6c..f65e9e1cea4c 100644 --- a/arch/x86/include/asm/pgalloc.h +++ b/arch/x86/include/asm/pgalloc.h @@ -184,6 +184,9 @@ static inline p4d_t *p4d_alloc_one(struct mm_struct *mm, unsigned long addr)
static inline void p4d_free(struct mm_struct *mm, p4d_t *p4d) { + if (!pgtable_l5_enabled) + return; + BUG_ON((unsigned long)p4d & (PAGE_SIZE-1)); free_page((unsigned long)p4d); }
On Mon, Jul 02, 2018 at 11:48:28AM +0300, Andrey Ryabinin wrote:
commit 0e311d237d7f3022b7dafb639b42541bfb42fe94 upstream.
When the P4D page table layer is folded at runtime, the p4d_free() should do nothing, the same as in <asm-generic/pgtable-nop4d.h>.
It seems this bug should cause double-free in efi_call_phys_epilog(), but I don't know how to trigger that code path, so I can't confirm that by testing.
Signed-off-by: Andrey Ryabinin aryabinin@virtuozzo.com Reviewed-by: Kirill A. Shutemov kirill.shutemov@linux.intel.com Cc: Linus Torvalds torvalds@linux-foundation.org Cc: Peter Zijlstra peterz@infradead.org Cc: Thomas Gleixner tglx@linutronix.de Cc: stable@vger.kernel.org # 4.17 Fixes: 98219dda2ab5 ("x86/mm: Fold p4d page table layer at runtime") Link: http://lkml.kernel.org/r/20180625102427.15015-1-aryabinin@virtuozzo.com Signed-off-by: Ingo Molnar mingo@kernel.org Signed-off-by: Andrey Ryabinin aryabinin@virtuozzo.com
Changes since v1:
- Fix wrong "From:" field
arch/x86/include/asm/pgalloc.h | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/arch/x86/include/asm/pgalloc.h b/arch/x86/include/asm/pgalloc.h index 263c142a6a6c..f65e9e1cea4c 100644 --- a/arch/x86/include/asm/pgalloc.h +++ b/arch/x86/include/asm/pgalloc.h @@ -184,6 +184,9 @@ static inline p4d_t *p4d_alloc_one(struct mm_struct *mm, unsigned long addr) static inline void p4d_free(struct mm_struct *mm, p4d_t *p4d) {
- if (!pgtable_l5_enabled)
return;
Again, did you actually test-build this? What changed from the original patch which blew the build up into little tiny pieces?
greg k-h
On 07/02/2018 12:15 PM, Greg KH wrote:
On Mon, Jul 02, 2018 at 11:48:28AM +0300, Andrey Ryabinin wrote:
commit 0e311d237d7f3022b7dafb639b42541bfb42fe94 upstream.
When the P4D page table layer is folded at runtime, the p4d_free() should do nothing, the same as in <asm-generic/pgtable-nop4d.h>.
It seems this bug should cause double-free in efi_call_phys_epilog(), but I don't know how to trigger that code path, so I can't confirm that by testing.
Signed-off-by: Andrey Ryabinin aryabinin@virtuozzo.com Reviewed-by: Kirill A. Shutemov kirill.shutemov@linux.intel.com Cc: Linus Torvalds torvalds@linux-foundation.org Cc: Peter Zijlstra peterz@infradead.org Cc: Thomas Gleixner tglx@linutronix.de Cc: stable@vger.kernel.org # 4.17 Fixes: 98219dda2ab5 ("x86/mm: Fold p4d page table layer at runtime") Link: http://lkml.kernel.org/r/20180625102427.15015-1-aryabinin@virtuozzo.com Signed-off-by: Ingo Molnar mingo@kernel.org Signed-off-by: Andrey Ryabinin aryabinin@virtuozzo.com
Changes since v1:
- Fix wrong "From:" field
arch/x86/include/asm/pgalloc.h | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/arch/x86/include/asm/pgalloc.h b/arch/x86/include/asm/pgalloc.h index 263c142a6a6c..f65e9e1cea4c 100644 --- a/arch/x86/include/asm/pgalloc.h +++ b/arch/x86/include/asm/pgalloc.h @@ -184,6 +184,9 @@ static inline p4d_t *p4d_alloc_one(struct mm_struct *mm, unsigned long addr) static inline void p4d_free(struct mm_struct *mm, p4d_t *p4d) {
- if (!pgtable_l5_enabled)
return;
Again, did you actually test-build this?
Again, yes, I did test-build this.
What changed from the original patch which blew the build up into little tiny pieces?
Removed '()'. In 4.17 pgtable_l5_enabled is variable, in 4.18 it's function.
greg k-h
On Mon, Jul 02, 2018 at 12:20:06PM +0300, Andrey Ryabinin wrote:
On 07/02/2018 12:15 PM, Greg KH wrote:
On Mon, Jul 02, 2018 at 11:48:28AM +0300, Andrey Ryabinin wrote:
commit 0e311d237d7f3022b7dafb639b42541bfb42fe94 upstream.
When the P4D page table layer is folded at runtime, the p4d_free() should do nothing, the same as in <asm-generic/pgtable-nop4d.h>.
It seems this bug should cause double-free in efi_call_phys_epilog(), but I don't know how to trigger that code path, so I can't confirm that by testing.
Signed-off-by: Andrey Ryabinin aryabinin@virtuozzo.com Reviewed-by: Kirill A. Shutemov kirill.shutemov@linux.intel.com Cc: Linus Torvalds torvalds@linux-foundation.org Cc: Peter Zijlstra peterz@infradead.org Cc: Thomas Gleixner tglx@linutronix.de Cc: stable@vger.kernel.org # 4.17 Fixes: 98219dda2ab5 ("x86/mm: Fold p4d page table layer at runtime") Link: http://lkml.kernel.org/r/20180625102427.15015-1-aryabinin@virtuozzo.com Signed-off-by: Ingo Molnar mingo@kernel.org Signed-off-by: Andrey Ryabinin aryabinin@virtuozzo.com
Changes since v1:
- Fix wrong "From:" field
arch/x86/include/asm/pgalloc.h | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/arch/x86/include/asm/pgalloc.h b/arch/x86/include/asm/pgalloc.h index 263c142a6a6c..f65e9e1cea4c 100644 --- a/arch/x86/include/asm/pgalloc.h +++ b/arch/x86/include/asm/pgalloc.h @@ -184,6 +184,9 @@ static inline p4d_t *p4d_alloc_one(struct mm_struct *mm, unsigned long addr) static inline void p4d_free(struct mm_struct *mm, p4d_t *p4d) {
- if (!pgtable_l5_enabled)
return;
Again, did you actually test-build this?
Again, yes, I did test-build this.
What changed from the original patch which blew the build up into little tiny pieces?
Removed '()'. In 4.17 pgtable_l5_enabled is variable, in 4.18 it's function.
Ah, good, it wasn't obvious that you changed anything. I'll queue this up after these latest kernels are released in a few days.
thanks,
greg k-h
linux-stable-mirror@lists.linaro.org