[3.13.y.z extended stable] Patch "MIPS: OCTEON: make get_system_type() thread-safe" has been added to staging queue

Kamal Mostafa kamal at canonical.com
Tue Sep 30 21:29:28 UTC 2014

This is a note to let you know that I have just added a patch titled

    MIPS: OCTEON: make get_system_type() thread-safe

to the linux-3.13.y-queue branch of the 3.13.y.z extended stable tree 
which can be found at:


This patch is scheduled to be released in version

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.13.y.z tree, see



>From d17c271d769525343a4852a5d9ffb2121abf9c54 Mon Sep 17 00:00:00 2001
From: Aaro Koskinen <aaro.koskinen at nsn.com>
Date: Tue, 22 Jul 2014 14:51:08 +0300
Subject: MIPS: OCTEON: make get_system_type() thread-safe

commit 608308682addfdc7b8e2aee88f0e028331d88e4d upstream.

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

Signed-off-by: Aaro Koskinen <aaro.koskinen at nsn.com>
Reviewed-by: Markos Chandras <markos.chandras at imgtec.com>
Patchwork: http://patchwork.linux-mips.org/patch/7437/
Signed-off-by: James Hogan <james.hogan at imgtec.com>
Signed-off-by: Kamal Mostafa <kamal at canonical.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 331b837..270cb3c 100644
--- a/arch/mips/cavium-octeon/setup.c
+++ b/arch/mips/cavium-octeon/setup.c
@@ -458,6 +458,18 @@ static void octeon_halt(void)

+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;
  * 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)

More information about the kernel-team mailing list