67 lines
2.1 KiB
Diff
67 lines
2.1 KiB
Diff
|
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
|
||
|
|