[mips*/octeon] Fix /proc/cpuinfo issues.

svn path=/dists/sid/linux/; revision=21652
This commit is contained in:
Aurelien Jarno 2014-07-30 18:53:38 +00:00
parent 5f0f41de53
commit 565d0dd6ae
3 changed files with 68 additions and 0 deletions

1
debian/changelog vendored
View File

@ -7,6 +7,7 @@ linux (3.14.13-3) UNRELEASED; urgency=medium
#756134).
* Rewrite postinst to not require File::stat perl module (Closes: #756207).
* [mips*] Avoid smp_processor_id() in preemptible code.
* [mips*/octeon] Fix /proc/cpuinfo issues.
[ Ben Hutchings ]
* [amd64] Reject x32 executables if x32 ABI not supported

View File

@ -0,0 +1,66 @@
From: Aaro Koskinen <aaro.koskinen@nsn.com>
Date: Tue, 22 Jul 2014 14:51:08 +0300
Subject: MIPS: OCTEON: make get_system_type() thread-safe
Origin: https://git.kernel.org/cgit/linux/kernel/git/jhogan/mips.git/commit?id=726d129dfdc9622197a8c3f5947ce09c1a4c935e
get_system_type() is not thread-safe on OCTEON. It uses static data,
also more dangerous issue is that it's calling cvmx_fuse_read_byte()
every time without any synchronization. Currently it's possible to get
processes stuck looping forever in kernel simply by launching multiple
readers of /proc/cpuinfo:
(while true; do cat /proc/cpuinfo > /dev/null; done) &
(while true; do cat /proc/cpuinfo > /dev/null; done) &
...
Fix by initializing the system type string only once during the early
boot.
Signed-off-by: Aaro Koskinen <aaro.koskinen@nsn.com>
Cc: stable@vger.kernel.org
Reviewed-by: Markos Chandras <markos.chandras@imgtec.com>
Patchwork: http://patchwork.linux-mips.org/patch/7437/
Signed-off-by: James Hogan <james.hogan@imgtec.com>
---
arch/mips/cavium-octeon/setup.c | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/arch/mips/cavium-octeon/setup.c b/arch/mips/cavium-octeon/setup.c
index 008e9c8..c9d9c62 100644
--- a/arch/mips/cavium-octeon/setup.c
+++ b/arch/mips/cavium-octeon/setup.c
@@ -458,6 +458,18 @@ static void octeon_halt(void)
octeon_kill_core(NULL);
}
+static char __read_mostly octeon_system_type[80];
+
+static int __init init_octeon_system_type(void)
+{
+ snprintf(octeon_system_type, sizeof(octeon_system_type), "%s (%s)",
+ cvmx_board_type_to_string(octeon_bootinfo->board_type),
+ octeon_model_get_string(read_c0_prid()));
+
+ return 0;
+}
+early_initcall(init_octeon_system_type);
+
/**
* Return a string representing the system type
*
@@ -465,11 +477,7 @@ static void octeon_halt(void)
*/
const char *octeon_board_type_string(void)
{
- static char name[80];
- sprintf(name, "%s (%s)",
- cvmx_board_type_to_string(octeon_bootinfo->board_type),
- octeon_model_get_string(read_c0_prid()));
- return name;
+ return octeon_system_type;
}
const char *get_system_type(void)
--
1.7.10.4

View File

@ -65,6 +65,7 @@ bugfix/mips/MIPS-SB1-Fix-excessive-kernel-warnings.patch
bugfix/mips/MIPS-ZBOOT-add-missing-linux-string.h-include.patch
bugfix/mips/MIPS-Fix-branch-emulation-of-branch-likely-instructi.patch
bugfix/mips/MIPS-ptrace-Avoid-smp_processor_id-in-preemptible-co.patch
bugfix/mips/MIPS-OCTEON-make-get_system_type-thread-safe.patch
bugfix/s390/s390-ptrace-fix-PSW-mask-check.patch
# Miscellaneous bug fixes