Message ID | 1448946504-11653-3-git-send-email-rashmicy@gmail.com (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
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 ?
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 ? >
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 --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"); +}
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