summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>2013-07-04 09:40:37 +0200
committerMichael Olbrich <m.olbrich@pengutronix.de>2013-07-08 08:34:49 +0200
commita2d5dddade4a5dd975eeeb010a6f52be2977cf99 (patch)
treecf43d253629a004dd9f44b9560999c09ab3feebf
parent3e5e19a2328dad13869502fadfcbe5c60ddc2e1f (diff)
downloadptxdist-a2d5dddade4a5dd975eeeb010a6f52be2977cf99.tar.gz
ptxdist-a2d5dddade4a5dd975eeeb010a6f52be2977cf99.tar.xz
rt-tests: fix runtime problem of hackbench on (at least) arm and armhf
The original report only talked about armhf, but the issue was seen on an arm9, too. Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
-rw-r--r--patches/rt-tests-0.73/hackbench-init-child-s-struct-before-using-it.patch57
-rw-r--r--patches/rt-tests-0.73/series1
2 files changed, 58 insertions, 0 deletions
diff --git a/patches/rt-tests-0.73/hackbench-init-child-s-struct-before-using-it.patch b/patches/rt-tests-0.73/hackbench-init-child-s-struct-before-using-it.patch
new file mode 100644
index 000000000..aaa90dfcf
--- /dev/null
+++ b/patches/rt-tests-0.73/hackbench-init-child-s-struct-before-using-it.patch
@@ -0,0 +1,57 @@
+From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+Date: Thu, 11 Apr 2013 15:20:05 +0200
+Subject: [PATCH] hackbench: init child's struct before using it
+
+Commit ad27df7 ("Reimplement better child tracking and improve error
+handling") changed the way of reporting pid/error after creating a
+child. It will return an union which is a mix pid_t, pthread_t and a
+signed long long for errors.
+Now on 32bit x86 both pid_t and pthread_t are four byte in size and are
+stored in the first 4 bytes. Now if the most significant bit of the long
+long variable happens to be set by chance (because nobody really
+initializes the variable here) then error variable will be negative. On
+little endian machines the assignment of pid or threadid won't reset the
+sign bit and you see this:
+
+| Running in process mode with 10 groups using 40 file descriptors each (== 400 tasks)
+| Each sender will pass 100 messages of 100 bytes
+| 0 children started. Expected 40
+| sending SIGTERM to all child processes
+| signaling 0 worker threads to terminate
+| Creating workers (error: Success)
+
+A machine with proper endian handlig (that is big endian) would reset
+the sign bit during the assignment of pid and I would not have to make
+this patch :)
+
+While here, I make create_worker() since it is not used outside of this
+file.
+
+Cc: David Sommerseth <davids@redhat.com>
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+Signed-off-by: Clark Williams <clark.williams@gmail.com>
+Origin: upstream, commit:dd6ae1155dc7fbee79426ae5952d48b4151c1cd7
+---
+ src/hackbench/hackbench.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/src/hackbench/hackbench.c b/src/hackbench/hackbench.c
+index 03b74b0..6a7f8a3 100644
+--- a/src/hackbench/hackbench.c
++++ b/src/hackbench/hackbench.c
+@@ -184,13 +184,14 @@ again:
+ return NULL;
+ }
+
+-childinfo_t create_worker(void *ctx, void *(*func)(void *))
++static childinfo_t create_worker(void *ctx, void *(*func)(void *))
+ {
+ pthread_attr_t attr;
+ int err;
+ childinfo_t child;
+ pid_t childpid;
+
++ memset(&child, 0, sizeof(child));
+ switch (process_mode) {
+ case 1: /* process mode */
+ /* Fork the sender/receiver child. */
diff --git a/patches/rt-tests-0.73/series b/patches/rt-tests-0.73/series
index caf1a74c7..8bf10ce68 100644
--- a/patches/rt-tests-0.73/series
+++ b/patches/rt-tests-0.73/series
@@ -1,2 +1,3 @@
fix_3_0_issue.diff
add-extra-cflags.patch
+hackbench-init-child-s-struct-before-using-it.patch