summaryrefslogtreecommitdiffstats
path: root/patches/rt-tests-0.73/hackbench-init-child-s-struct-before-using-it.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/rt-tests-0.73/hackbench-init-child-s-struct-before-using-it.patch')
-rw-r--r--patches/rt-tests-0.73/hackbench-init-child-s-struct-before-using-it.patch57
1 files changed, 57 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. */