diff --git a/debian/changelog b/debian/changelog index 45ebd07c3..8f49db149 100644 --- a/debian/changelog +++ b/debian/changelog @@ -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 diff --git a/debian/patches/bugfix/mips/MIPS-OCTEON-make-get_system_type-thread-safe.patch b/debian/patches/bugfix/mips/MIPS-OCTEON-make-get_system_type-thread-safe.patch new file mode 100644 index 000000000..4b80e6ded --- /dev/null +++ b/debian/patches/bugfix/mips/MIPS-OCTEON-make-get_system_type-thread-safe.patch @@ -0,0 +1,66 @@ +From: Aaro Koskinen +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 +Cc: stable@vger.kernel.org +Reviewed-by: Markos Chandras +Patchwork: http://patchwork.linux-mips.org/patch/7437/ +Signed-off-by: James Hogan +--- + 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 + diff --git a/debian/patches/series b/debian/patches/series index 61029fe6e..c293f6889 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -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