diff options
author | Uwe Kleine-König <u.kleine-koenig@pengutronix.de> | 2013-07-04 09:40:37 +0200 |
---|---|---|
committer | Michael Olbrich <m.olbrich@pengutronix.de> | 2013-07-08 08:34:49 +0200 |
commit | a2d5dddade4a5dd975eeeb010a6f52be2977cf99 (patch) | |
tree | cf43d253629a004dd9f44b9560999c09ab3feebf | |
parent | 3e5e19a2328dad13869502fadfcbe5c60ddc2e1f (diff) | |
download | ptxdist-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.patch | 57 | ||||
-rw-r--r-- | patches/rt-tests-0.73/series | 1 |
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 |