From 08e4f64a7c8bcffe81b36541e3c4e6b3ba7bda24 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 28 Jul 2014 22:50:10 -0700 Subject: [PATCH] 3.15-stable patches added patches: drm-radeon-fix-cut-and-paste-issue-for-hawaii.patch drm-radeon-fix-irq-ring-buffer-overflow-handling.patch fix-gcc-4.9.0-miscompilation-of-load_balance-in-scheduler.patch mm-hugetlb-fix-copy_hugetlb_page_range.patch --- ...n-fix-cut-and-paste-issue-for-hawaii.patch | 33 +++++++++ ...ix-irq-ring-buffer-overflow-handling.patch | 68 ++++++++++++++++++ ...ilation-of-load_balance-in-scheduler.patch | 70 +++++++++++++++++++ ...-hugetlb-fix-copy_hugetlb_page_range.patch | 70 +++++++++++++++++++ queue-3.15/series | 4 ++ 5 files changed, 245 insertions(+) create mode 100644 queue-3.15/drm-radeon-fix-cut-and-paste-issue-for-hawaii.patch create mode 100644 queue-3.15/drm-radeon-fix-irq-ring-buffer-overflow-handling.patch create mode 100644 queue-3.15/fix-gcc-4.9.0-miscompilation-of-load_balance-in-scheduler.patch create mode 100644 queue-3.15/mm-hugetlb-fix-copy_hugetlb_page_range.patch diff --git a/queue-3.15/drm-radeon-fix-cut-and-paste-issue-for-hawaii.patch b/queue-3.15/drm-radeon-fix-cut-and-paste-issue-for-hawaii.patch new file mode 100644 index 00000000000..b0f4dd5928e --- /dev/null +++ b/queue-3.15/drm-radeon-fix-cut-and-paste-issue-for-hawaii.patch @@ -0,0 +1,33 @@ +From 1b2c4869d8247f9e202fa8a73777c34adc62d409 Mon Sep 17 00:00:00 2001 +From: Jerome Glisse +Date: Thu, 24 Jul 2014 16:34:17 -0400 +Subject: drm/radeon: fix cut and paste issue for hawaii. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Jerome Glisse + +commit 1b2c4869d8247f9e202fa8a73777c34adc62d409 upstream. + +This is a halfway fix for hawaii acceleration. More fixes to come +but hopefully isolated to userspace. + +Signed-off-by: Jérôme Glisse +Signed-off-by: Dave Airlie +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/radeon/cik.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/gpu/drm/radeon/cik.c ++++ b/drivers/gpu/drm/radeon/cik.c +@@ -2290,6 +2290,7 @@ static void cik_tiling_mode_table_init(s + gb_tile_moden = 0; + break; + } ++ rdev->config.cik.macrotile_mode_array[reg_offset] = gb_tile_moden; + WREG32(GB_MACROTILE_MODE0 + (reg_offset * 4), gb_tile_moden); + } + } else if (num_pipe_configs == 8) { diff --git a/queue-3.15/drm-radeon-fix-irq-ring-buffer-overflow-handling.patch b/queue-3.15/drm-radeon-fix-irq-ring-buffer-overflow-handling.patch new file mode 100644 index 00000000000..3b2656197f4 --- /dev/null +++ b/queue-3.15/drm-radeon-fix-irq-ring-buffer-overflow-handling.patch @@ -0,0 +1,68 @@ +From e8c214d22e76dd0ead38f97f8d2dc09aac70d651 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Christian=20K=C3=B6nig?= +Date: Wed, 23 Jul 2014 09:47:58 +0200 +Subject: drm/radeon: fix irq ring buffer overflow handling +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: =?UTF-8?q?Christian=20K=C3=B6nig?= + +commit e8c214d22e76dd0ead38f97f8d2dc09aac70d651 upstream. + +We must mask out the overflow bit as well, otherwise +the wptr will never match the rptr again and the interrupt +handler will loop forever. + +Signed-off-by: Christian König +Signed-off-by: Alex Deucher +Reviewed-by: Michel Dänzer +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/gpu/drm/radeon/cik.c | 1 + + drivers/gpu/drm/radeon/evergreen.c | 1 + + drivers/gpu/drm/radeon/r600.c | 1 + + drivers/gpu/drm/radeon/si.c | 1 + + 4 files changed, 4 insertions(+) + +--- a/drivers/gpu/drm/radeon/cik.c ++++ b/drivers/gpu/drm/radeon/cik.c +@@ -7363,6 +7363,7 @@ static inline u32 cik_get_ih_wptr(struct + tmp = RREG32(IH_RB_CNTL); + tmp |= IH_WPTR_OVERFLOW_CLEAR; + WREG32(IH_RB_CNTL, tmp); ++ wptr &= ~RB_OVERFLOW; + } + return (wptr & rdev->ih.ptr_mask); + } +--- a/drivers/gpu/drm/radeon/evergreen.c ++++ b/drivers/gpu/drm/radeon/evergreen.c +@@ -4759,6 +4759,7 @@ static u32 evergreen_get_ih_wptr(struct + tmp = RREG32(IH_RB_CNTL); + tmp |= IH_WPTR_OVERFLOW_CLEAR; + WREG32(IH_RB_CNTL, tmp); ++ wptr &= ~RB_OVERFLOW; + } + return (wptr & rdev->ih.ptr_mask); + } +--- a/drivers/gpu/drm/radeon/r600.c ++++ b/drivers/gpu/drm/radeon/r600.c +@@ -3792,6 +3792,7 @@ static u32 r600_get_ih_wptr(struct radeo + tmp = RREG32(IH_RB_CNTL); + tmp |= IH_WPTR_OVERFLOW_CLEAR; + WREG32(IH_RB_CNTL, tmp); ++ wptr &= ~RB_OVERFLOW; + } + return (wptr & rdev->ih.ptr_mask); + } +--- a/drivers/gpu/drm/radeon/si.c ++++ b/drivers/gpu/drm/radeon/si.c +@@ -6090,6 +6090,7 @@ static inline u32 si_get_ih_wptr(struct + tmp = RREG32(IH_RB_CNTL); + tmp |= IH_WPTR_OVERFLOW_CLEAR; + WREG32(IH_RB_CNTL, tmp); ++ wptr &= ~RB_OVERFLOW; + } + return (wptr & rdev->ih.ptr_mask); + } diff --git a/queue-3.15/fix-gcc-4.9.0-miscompilation-of-load_balance-in-scheduler.patch b/queue-3.15/fix-gcc-4.9.0-miscompilation-of-load_balance-in-scheduler.patch new file mode 100644 index 00000000000..51baa84c4fc --- /dev/null +++ b/queue-3.15/fix-gcc-4.9.0-miscompilation-of-load_balance-in-scheduler.patch @@ -0,0 +1,70 @@ +From 2062afb4f804afef61cbe62a30cac9a46e58e067 Mon Sep 17 00:00:00 2001 +From: Linus Torvalds +Date: Sat, 26 Jul 2014 14:52:01 -0700 +Subject: Fix gcc-4.9.0 miscompilation of load_balance() in scheduler +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Linus Torvalds + +commit 2062afb4f804afef61cbe62a30cac9a46e58e067 upstream. + +Michel Dänzer and a couple of other people reported inexplicable random +oopses in the scheduler, and the cause turns out to be gcc mis-compiling +the load_balance() function when debugging is enabled. The gcc bug +apparently goes back to gcc-4.5, but slight optimization changes means +that it now showed up as a problem in 4.9.0 and 4.9.1. + +The instruction scheduling problem causes gcc to schedule a spill +operation to before the stack frame has been created, which in turn can +corrupt the spilled value if an interrupt comes in. There may be other +effects of this bug too, but that's the code generation problem seen in +Michel's case. + +This is fixed in current gcc HEAD, but the workaround as suggested by +Markus Trippelsdorf is pretty simple: use -fno-var-tracking-assignments +when compiling the kernel, which disables the gcc code that causes the +problem. This can result in slightly worse debug information for +variable accesses, but that is infinitely preferable to actual code +generation problems. + +Doing this unconditionally (not just for CONFIG_DEBUG_INFO) also allows +non-debug builds to verify that the debug build would be identical: we +can do + + export GCC_COMPARE_DEBUG=1 + +to make gcc internally verify that the result of the build is +independent of the "-g" flag (it will make the compiler build everything +twice, toggling the debug flag, and compare the results). + +Without the "-fno-var-tracking-assignments" option, the build would fail +(even with 4.8.3 that didn't show the actual stack frame bug) with a gcc +compare failure. + +See also gcc bugzilla: + + https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61801 + +Reported-by: Michel Dänzer +Suggested-by: Markus Trippelsdorf +Cc: Jakub Jelinek +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + Makefile | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/Makefile ++++ b/Makefile +@@ -669,6 +669,8 @@ KBUILD_CFLAGS += -fomit-frame-pointer + endif + endif + ++KBUILD_CFLAGS += $(call cc-option, -fno-var-tracking-assignments) ++ + ifdef CONFIG_DEBUG_INFO + KBUILD_CFLAGS += -g + KBUILD_AFLAGS += -Wa,--gdwarf-2 diff --git a/queue-3.15/mm-hugetlb-fix-copy_hugetlb_page_range.patch b/queue-3.15/mm-hugetlb-fix-copy_hugetlb_page_range.patch new file mode 100644 index 00000000000..b4a46e4c58e --- /dev/null +++ b/queue-3.15/mm-hugetlb-fix-copy_hugetlb_page_range.patch @@ -0,0 +1,70 @@ +From 0253d634e0803a8376a0d88efee0bf523d8673f9 Mon Sep 17 00:00:00 2001 +From: Naoya Horiguchi +Date: Wed, 23 Jul 2014 14:00:19 -0700 +Subject: mm: hugetlb: fix copy_hugetlb_page_range() + +From: Naoya Horiguchi + +commit 0253d634e0803a8376a0d88efee0bf523d8673f9 upstream. + +Commit 4a705fef9862 ("hugetlb: fix copy_hugetlb_page_range() to handle +migration/hwpoisoned entry") changed the order of +huge_ptep_set_wrprotect() and huge_ptep_get(), which leads to breakage +in some workloads like hugepage-backed heap allocation via libhugetlbfs. +This patch fixes it. + +The test program for the problem is shown below: + + $ cat heap.c + #include + #include + #include + + #define HPS 0x200000 + + int main() { + int i; + char *p = malloc(HPS); + memset(p, '1', HPS); + for (i = 0; i < 5; i++) { + if (!fork()) { + memset(p, '2', HPS); + p = malloc(HPS); + memset(p, '3', HPS); + free(p); + return 0; + } + } + sleep(1); + free(p); + return 0; + } + + $ export HUGETLB_MORECORE=yes ; export HUGETLB_NO_PREFAULT= ; hugectl --heap ./heap + +Fixes 4a705fef9862 ("hugetlb: fix copy_hugetlb_page_range() to handle +migration/hwpoisoned entry"), so is applicable to -stable kernels which +include it. + +Signed-off-by: Naoya Horiguchi +Reported-by: Guillaume Morin +Suggested-by: Guillaume Morin +Acked-by: Hugh Dickins +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + mm/hugetlb.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/mm/hugetlb.c ++++ b/mm/hugetlb.c +@@ -2461,6 +2461,7 @@ int copy_hugetlb_page_range(struct mm_st + } else { + if (cow) + huge_ptep_set_wrprotect(src, addr, src_pte); ++ entry = huge_ptep_get(src_pte); + ptepage = pte_page(entry); + get_page(ptepage); + page_dup_rmap(ptepage); diff --git a/queue-3.15/series b/queue-3.15/series index 475e39b1926..0b3ba094e97 100644 --- a/queue-3.15/series +++ b/queue-3.15/series @@ -27,3 +27,7 @@ hwmon-smsc47m192-fix-temperature-limit-and-vrm-write-operations.patch parport-fix-menu-breakage.patch fs-umount-on-symlink-leaks-mnt-count.patch x86_32-entry-store-badsys-error-code-in-eax.patch +drm-radeon-fix-irq-ring-buffer-overflow-handling.patch +drm-radeon-fix-cut-and-paste-issue-for-hawaii.patch +mm-hugetlb-fix-copy_hugetlb_page_range.patch +fix-gcc-4.9.0-miscompilation-of-load_balance-in-scheduler.patch -- 2.47.3