diff options
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.patch | 57 |
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. */ |