diff mbox

[2/3] selftests/powerpc: Add test for forking inside transaction

Message ID 1448946504-11653-3-git-send-email-rashmicy@gmail.com (mailing list archive)
State Superseded, archived
Headers show

Commit Message

Rashmica Gupta Dec. 1, 2015, 5:08 a.m. UTC
This test does a fork syscall inside a transaction. Basic sniff test to see
if we can enter the kernel during a transaction.

Signed-off-by: Rashmica Gupta <rashmicy@gmail.com>
---
 tools/testing/selftests/powerpc/tm/.gitignore |  1 +
 tools/testing/selftests/powerpc/tm/Makefile   |  2 +-
 tools/testing/selftests/powerpc/tm/tm-fork.c  | 41 +++++++++++++++++++++++++++
 3 files changed, 43 insertions(+), 1 deletion(-)
 create mode 100644 tools/testing/selftests/powerpc/tm/tm-fork.c

Comments

Anshuman Khandual Dec. 1, 2015, 8:11 a.m. UTC | #1
On 12/01/2015 10:38 AM, Rashmica Gupta wrote:
> +int test_fork(void)
> +{
> +	SKIP_IF(!have_htm());
> +
> +	asm __volatile__(
> +		"tbegin.;"
> +		"blt    1f; "
> +		"li     0, 2;"  /* fork syscall */
> +		"sc  ;"
> +		"tend.;"
> +		"1: ;"
> +		: : : "memory", "r0");
> +	/* If we reach here, we've passed.  Otherwise we've probably crashed
> +	 * the kernel */

The transaction inside the parent process will abort. What
is expected inside the child process ? Why should the kernel
crash ?
Rashmica Gupta Dec. 1, 2015, 11:31 p.m. UTC | #2
As far as I'm aware, the kernel used to crash when forking inside a 
transaction (see powerpc/tm: Fix crash when forking inside a 
transaction). So this is to check that the transaction aborts rather 
than your whole kernel crashing.

On 01/12/15 19:11, Anshuman Khandual wrote:
> On 12/01/2015 10:38 AM, Rashmica Gupta wrote:
>> +int test_fork(void)
>> +{
>> +	SKIP_IF(!have_htm());
>> +
>> +	asm __volatile__(
>> +		"tbegin.;"
>> +		"blt    1f; "
>> +		"li     0, 2;"  /* fork syscall */
>> +		"sc  ;"
>> +		"tend.;"
>> +		"1: ;"
>> +		: : : "memory", "r0");
>> +	/* If we reach here, we've passed.  Otherwise we've probably crashed
>> +	 * the kernel */
> The transaction inside the parent process will abort. What
> is expected inside the child process ? Why should the kernel
> crash ?
>
Michael Neuling Dec. 2, 2015, 5:27 a.m. UTC | #3
On Tue, 2015-12-01 at 16:08 +1100, Rashmica Gupta wrote:
> This test does a fork syscall inside a transaction. Basic sniff test
> to see
> if we can enter the kernel during a transaction.

Can you add this description to the top of the test case as well?

Mikey

> 
> Signed-off-by: Rashmica Gupta <rashmicy@gmail.com>
> ---
>  tools/testing/selftests/powerpc/tm/.gitignore |  1 +
>  tools/testing/selftests/powerpc/tm/Makefile   |  2 +-
>  tools/testing/selftests/powerpc/tm/tm-fork.c  | 41
> +++++++++++++++++++++++++++
>  3 files changed, 43 insertions(+), 1 deletion(-)
>  create mode 100644 tools/testing/selftests/powerpc/tm/tm-fork.c
> 
> diff --git a/tools/testing/selftests/powerpc/tm/.gitignore
> b/tools/testing/selftests/powerpc/tm/.gitignore
> index e6668217ccd0..d0c7c97e9b13 100644
> --- a/tools/testing/selftests/powerpc/tm/.gitignore
> +++ b/tools/testing/selftests/powerpc/tm/.gitignore
> @@ -2,3 +2,4 @@ tm-resched-dscr
>  tm-syscall
>  tm-signal-msr-resv
>  tm-signal-stack
> +tm-fork
> diff --git a/tools/testing/selftests/powerpc/tm/Makefile
> b/tools/testing/selftests/powerpc/tm/Makefile
> index 578572a3700a..f7d4727662aa 100644
> --- a/tools/testing/selftests/powerpc/tm/Makefile
> +++ b/tools/testing/selftests/powerpc/tm/Makefile
> @@ -1,4 +1,4 @@
> -TEST_PROGS := tm-resched-dscr tm-syscall tm-signal-msr-resv tm
> -signal-stack
> +TEST_PROGS := tm-resched-dscr tm-syscall tm-signal-msr-resv tm
> -signal-stack tm-fork
>  
>  all: $(TEST_PROGS)
>  
> diff --git a/tools/testing/selftests/powerpc/tm/tm-fork.c
> b/tools/testing/selftests/powerpc/tm/tm-fork.c
> new file mode 100644
> index 000000000000..f571a48a59a0
> --- /dev/null
> +++ b/tools/testing/selftests/powerpc/tm/tm-fork.c
> @@ -0,0 +1,41 @@
> +/*
> + * Copyright 2015, Michael Neuling, IBM Corp.
> + * Licensed under GPLv2.
> + *
> + * Edited: Rashmica Gupta, Nov 2015
> + *
> + * Fork inside a transaction
> + */
> +
> +#include <errno.h>
> +#include <inttypes.h>
> +#include <pthread.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <unistd.h>
> +
> +#include "utils.h"
> +#include "tm.h"
> +
> +int test_fork(void)
> +{
> +	SKIP_IF(!have_htm());
> +
> +	asm __volatile__(
> +		"tbegin.;"
> +		"blt    1f; "
> +		"li     0, 2;"  /* fork syscall */
> +		"sc  ;"
> +		"tend.;"
> +		"1: ;"
> +		: : : "memory", "r0");
> +	/* If we reach here, we've passed.  Otherwise we've probably
> crashed
> +	 * the kernel */
> +
> +	return 0;
> +}
> +
> +int main(int argc, char *argv[])
> +{
> +	return test_harness(test_fork, "tm_fork");
> +}
diff mbox

Patch

diff --git a/tools/testing/selftests/powerpc/tm/.gitignore b/tools/testing/selftests/powerpc/tm/.gitignore
index e6668217ccd0..d0c7c97e9b13 100644
--- a/tools/testing/selftests/powerpc/tm/.gitignore
+++ b/tools/testing/selftests/powerpc/tm/.gitignore
@@ -2,3 +2,4 @@  tm-resched-dscr
 tm-syscall
 tm-signal-msr-resv
 tm-signal-stack
+tm-fork
diff --git a/tools/testing/selftests/powerpc/tm/Makefile b/tools/testing/selftests/powerpc/tm/Makefile
index 578572a3700a..f7d4727662aa 100644
--- a/tools/testing/selftests/powerpc/tm/Makefile
+++ b/tools/testing/selftests/powerpc/tm/Makefile
@@ -1,4 +1,4 @@ 
-TEST_PROGS := tm-resched-dscr tm-syscall tm-signal-msr-resv tm-signal-stack
+TEST_PROGS := tm-resched-dscr tm-syscall tm-signal-msr-resv tm-signal-stack tm-fork
 
 all: $(TEST_PROGS)
 
diff --git a/tools/testing/selftests/powerpc/tm/tm-fork.c b/tools/testing/selftests/powerpc/tm/tm-fork.c
new file mode 100644
index 000000000000..f571a48a59a0
--- /dev/null
+++ b/tools/testing/selftests/powerpc/tm/tm-fork.c
@@ -0,0 +1,41 @@ 
+/*
+ * Copyright 2015, Michael Neuling, IBM Corp.
+ * Licensed under GPLv2.
+ *
+ * Edited: Rashmica Gupta, Nov 2015
+ *
+ * Fork inside a transaction
+ */
+
+#include <errno.h>
+#include <inttypes.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "utils.h"
+#include "tm.h"
+
+int test_fork(void)
+{
+	SKIP_IF(!have_htm());
+
+	asm __volatile__(
+		"tbegin.;"
+		"blt    1f; "
+		"li     0, 2;"  /* fork syscall */
+		"sc  ;"
+		"tend.;"
+		"1: ;"
+		: : : "memory", "r0");
+	/* If we reach here, we've passed.  Otherwise we've probably crashed
+	 * the kernel */
+
+	return 0;
+}
+
+int main(int argc, char *argv[])
+{
+	return test_harness(test_fork, "tm_fork");
+}