Message ID | 20230720163056.2564824-18-vschneid@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | context_tracking,x86: Defer some IPIs until a user->kernel transition | expand |
On Thu, Jul 20, 2023 at 05:30:53PM +0100, Valentin Schneider wrote: > We now have an RCU_EXPORT knob for configuring the size of the dynticks > counter: CONFIG_RCU_DYNTICKS_BITS. > > Add a torture config for a ridiculously small counter (2 bits). This is ac > opy of TREE4 with the added counter size restriction. > > Link: http://lore.kernel.org/r/4c2cb573-168f-4806-b1d9-164e8276e66a@paulmck-laptop > Suggested-by: Paul E. McKenney <paulmck@kernel.org> > Signed-off-by: Valentin Schneider <vschneid@redhat.com> > --- > .../selftests/rcutorture/configs/rcu/TREE11 | 19 +++++++++++++++++++ > .../rcutorture/configs/rcu/TREE11.boot | 1 + > 2 files changed, 20 insertions(+) > create mode 100644 tools/testing/selftests/rcutorture/configs/rcu/TREE11 > create mode 100644 tools/testing/selftests/rcutorture/configs/rcu/TREE11.boot > > diff --git a/tools/testing/selftests/rcutorture/configs/rcu/TREE11 b/tools/testing/selftests/rcutorture/configs/rcu/TREE11 > new file mode 100644 > index 0000000000000..aa7274efd9819 > --- /dev/null > +++ b/tools/testing/selftests/rcutorture/configs/rcu/TREE11 > @@ -0,0 +1,19 @@ > +CONFIG_SMP=y > +CONFIG_NR_CPUS=8 > +CONFIG_PREEMPT_NONE=n > +CONFIG_PREEMPT_VOLUNTARY=y > +CONFIG_PREEMPT=n > +CONFIG_PREEMPT_DYNAMIC=n > +#CHECK#CONFIG_TREE_RCU=y > +CONFIG_HZ_PERIODIC=n > +CONFIG_NO_HZ_IDLE=n > +CONFIG_NO_HZ_FULL=y > +CONFIG_RCU_TRACE=y > +CONFIG_RCU_FANOUT=4 > +CONFIG_RCU_FANOUT_LEAF=3 > +CONFIG_DEBUG_LOCK_ALLOC=n > +CONFIG_DEBUG_OBJECTS_RCU_HEAD=n > +CONFIG_RCU_EXPERT=y > +CONFIG_RCU_EQS_DEBUG=y > +CONFIG_RCU_LAZY=y > +CONFIG_RCU_DYNTICKS_BITS=2 Why not just add this last line to the existing TREE04 scenario? That would ensure that it gets tested regularly without extending the time required to run a full set of rcutorture tests. > diff --git a/tools/testing/selftests/rcutorture/configs/rcu/TREE11.boot b/tools/testing/selftests/rcutorture/configs/rcu/TREE11.boot > new file mode 100644 > index 0000000000000..a8d94caf7d2fd > --- /dev/null > +++ b/tools/testing/selftests/rcutorture/configs/rcu/TREE11.boot > @@ -0,0 +1 @@ > +rcutree.rcu_fanout_leaf=4 nohz_full=1-N > -- > 2.31.1 >
On Thu, Jul 20, 2023 at 12:53:05PM -0700, Paul E. McKenney wrote: > On Thu, Jul 20, 2023 at 05:30:53PM +0100, Valentin Schneider wrote: > > We now have an RCU_EXPORT knob for configuring the size of the dynticks > > counter: CONFIG_RCU_DYNTICKS_BITS. > > > > Add a torture config for a ridiculously small counter (2 bits). This is ac > > opy of TREE4 with the added counter size restriction. > > > > Link: http://lore.kernel.org/r/4c2cb573-168f-4806-b1d9-164e8276e66a@paulmck-laptop > > Suggested-by: Paul E. McKenney <paulmck@kernel.org> > > Signed-off-by: Valentin Schneider <vschneid@redhat.com> > > --- > > .../selftests/rcutorture/configs/rcu/TREE11 | 19 +++++++++++++++++++ > > .../rcutorture/configs/rcu/TREE11.boot | 1 + > > 2 files changed, 20 insertions(+) > > create mode 100644 tools/testing/selftests/rcutorture/configs/rcu/TREE11 > > create mode 100644 tools/testing/selftests/rcutorture/configs/rcu/TREE11.boot > > > > diff --git a/tools/testing/selftests/rcutorture/configs/rcu/TREE11 b/tools/testing/selftests/rcutorture/configs/rcu/TREE11 > > new file mode 100644 > > index 0000000000000..aa7274efd9819 > > --- /dev/null > > +++ b/tools/testing/selftests/rcutorture/configs/rcu/TREE11 > > @@ -0,0 +1,19 @@ > > +CONFIG_SMP=y > > +CONFIG_NR_CPUS=8 > > +CONFIG_PREEMPT_NONE=n > > +CONFIG_PREEMPT_VOLUNTARY=y > > +CONFIG_PREEMPT=n > > +CONFIG_PREEMPT_DYNAMIC=n > > +#CHECK#CONFIG_TREE_RCU=y > > +CONFIG_HZ_PERIODIC=n > > +CONFIG_NO_HZ_IDLE=n > > +CONFIG_NO_HZ_FULL=y > > +CONFIG_RCU_TRACE=y > > +CONFIG_RCU_FANOUT=4 > > +CONFIG_RCU_FANOUT_LEAF=3 > > +CONFIG_DEBUG_LOCK_ALLOC=n > > +CONFIG_DEBUG_OBJECTS_RCU_HEAD=n > > +CONFIG_RCU_EXPERT=y > > +CONFIG_RCU_EQS_DEBUG=y > > +CONFIG_RCU_LAZY=y > > +CONFIG_RCU_DYNTICKS_BITS=2 > > Why not just add this last line to the existing TREE04 scenario? > That would ensure that it gets tested regularly without extending the > time required to run a full set of rcutorture tests. Please see below for the version of this patch that I am running overnight tests with. Does this one work for you? Thanx, Paul ------------------------------------------------------------------------ commit 1aa13731e665193cd833edac5ebc86a9c3fea2b7 Author: Valentin Schneider <vschneid@redhat.com> Date: Thu Jul 20 20:58:41 2023 -0700 rcutorture: Add a test config to torture test low RCU_DYNTICKS width We now have an RCU_EXPORT knob for configuring the size of the dynticks counter: CONFIG_RCU_DYNTICKS_BITS. Modify scenario TREE04 to exercise a a ridiculously small counter (2 bits). Link: http://lore.kernel.org/r/4c2cb573-168f-4806-b1d9-164e8276e66a@paulmck-laptop Suggested-by: Paul E. McKenney <paulmck@kernel.org> Signed-off-by: Valentin Schneider <vschneid@redhat.com> Signed-off-by: Paul E. McKenney <paulmck@kernel.org> diff --git a/tools/testing/selftests/rcutorture/configs/rcu/TREE04 b/tools/testing/selftests/rcutorture/configs/rcu/TREE04 index dc4985064b3a..aa7274efd981 100644 --- a/tools/testing/selftests/rcutorture/configs/rcu/TREE04 +++ b/tools/testing/selftests/rcutorture/configs/rcu/TREE04 @@ -16,3 +16,4 @@ CONFIG_DEBUG_OBJECTS_RCU_HEAD=n CONFIG_RCU_EXPERT=y CONFIG_RCU_EQS_DEBUG=y CONFIG_RCU_LAZY=y +CONFIG_RCU_DYNTICKS_BITS=2
On 20/07/23 21:00, Paul E. McKenney wrote: > On Thu, Jul 20, 2023 at 12:53:05PM -0700, Paul E. McKenney wrote: >> On Thu, Jul 20, 2023 at 05:30:53PM +0100, Valentin Schneider wrote: >> > diff --git a/tools/testing/selftests/rcutorture/configs/rcu/TREE11 b/tools/testing/selftests/rcutorture/configs/rcu/TREE11 >> > new file mode 100644 >> > index 0000000000000..aa7274efd9819 >> > --- /dev/null >> > +++ b/tools/testing/selftests/rcutorture/configs/rcu/TREE11 >> > @@ -0,0 +1,19 @@ >> > +CONFIG_SMP=y >> > +CONFIG_NR_CPUS=8 >> > +CONFIG_PREEMPT_NONE=n >> > +CONFIG_PREEMPT_VOLUNTARY=y >> > +CONFIG_PREEMPT=n >> > +CONFIG_PREEMPT_DYNAMIC=n >> > +#CHECK#CONFIG_TREE_RCU=y >> > +CONFIG_HZ_PERIODIC=n >> > +CONFIG_NO_HZ_IDLE=n >> > +CONFIG_NO_HZ_FULL=y >> > +CONFIG_RCU_TRACE=y >> > +CONFIG_RCU_FANOUT=4 >> > +CONFIG_RCU_FANOUT_LEAF=3 >> > +CONFIG_DEBUG_LOCK_ALLOC=n >> > +CONFIG_DEBUG_OBJECTS_RCU_HEAD=n >> > +CONFIG_RCU_EXPERT=y >> > +CONFIG_RCU_EQS_DEBUG=y >> > +CONFIG_RCU_LAZY=y >> > +CONFIG_RCU_DYNTICKS_BITS=2 >> >> Why not just add this last line to the existing TREE04 scenario? >> That would ensure that it gets tested regularly without extending the >> time required to run a full set of rcutorture tests. > > Please see below for the version of this patch that I am running overnight > tests with. Does this one work for you? > Yep that's fine with me. I only went with a separate test file as wasn't sure how new test options should be handled (merged into existing tests vs new tests created), and didn't want to negatively impact TREE04 or TREE06. If merging into TREE04 is preferred, then I'll do just that and carry this path moving forwards. Thanks!
On Fri, Jul 21, 2023 at 08:58:53AM +0100, Valentin Schneider wrote: > On 20/07/23 21:00, Paul E. McKenney wrote: > > On Thu, Jul 20, 2023 at 12:53:05PM -0700, Paul E. McKenney wrote: > >> On Thu, Jul 20, 2023 at 05:30:53PM +0100, Valentin Schneider wrote: > >> > diff --git a/tools/testing/selftests/rcutorture/configs/rcu/TREE11 b/tools/testing/selftests/rcutorture/configs/rcu/TREE11 > >> > new file mode 100644 > >> > index 0000000000000..aa7274efd9819 > >> > --- /dev/null > >> > +++ b/tools/testing/selftests/rcutorture/configs/rcu/TREE11 > >> > @@ -0,0 +1,19 @@ > >> > +CONFIG_SMP=y > >> > +CONFIG_NR_CPUS=8 > >> > +CONFIG_PREEMPT_NONE=n > >> > +CONFIG_PREEMPT_VOLUNTARY=y > >> > +CONFIG_PREEMPT=n > >> > +CONFIG_PREEMPT_DYNAMIC=n > >> > +#CHECK#CONFIG_TREE_RCU=y > >> > +CONFIG_HZ_PERIODIC=n > >> > +CONFIG_NO_HZ_IDLE=n > >> > +CONFIG_NO_HZ_FULL=y > >> > +CONFIG_RCU_TRACE=y > >> > +CONFIG_RCU_FANOUT=4 > >> > +CONFIG_RCU_FANOUT_LEAF=3 > >> > +CONFIG_DEBUG_LOCK_ALLOC=n > >> > +CONFIG_DEBUG_OBJECTS_RCU_HEAD=n > >> > +CONFIG_RCU_EXPERT=y > >> > +CONFIG_RCU_EQS_DEBUG=y > >> > +CONFIG_RCU_LAZY=y > >> > +CONFIG_RCU_DYNTICKS_BITS=2 > >> > >> Why not just add this last line to the existing TREE04 scenario? > >> That would ensure that it gets tested regularly without extending the > >> time required to run a full set of rcutorture tests. > > > > Please see below for the version of this patch that I am running overnight > > tests with. Does this one work for you? > > Yep that's fine with me. I only went with a separate test file as wasn't > sure how new test options should be handled (merged into existing tests vs > new tests created), and didn't want to negatively impact TREE04 or > TREE06. If merging into TREE04 is preferred, then I'll do just that and > carry this path moving forwards. Things worked fine for this one-hour-per-scenario test run on my laptop, except for the CONFIG_SMP=n runs, which all got build errors like the following. Thanx, Paul ------------------------------------------------------------------------ In file included from ./include/linux/container_of.h:5, from ./include/linux/list.h:5, from ./include/linux/swait.h:5, from ./include/linux/completion.h:12, from ./include/linux/crypto.h:15, from arch/x86/kernel/asm-offsets.c:9: ./include/linux/context_tracking_state.h:56:61: error: ‘struct context_tracking’ has no member named ‘state’ 56 | #define CT_STATE_SIZE (sizeof(((struct context_tracking *)0)->state) * BITS_PER_BYTE) | ^~ ./include/linux/build_bug.h:78:56: note: in definition of macro ‘__static_assert’ 78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg) | ^~~~ ./include/linux/context_tracking_state.h:73:1: note: in expansion of macro ‘static_assert’ 73 | static_assert((CONTEXT_STATE_END + 1 - CONTEXT_STATE_START) + | ^~~~~~~~~~~~~ ./include/linux/context_tracking_state.h:61:29: note: in expansion of macro ‘CT_STATE_SIZE’ 61 | #define RCU_DYNTICKS_START (CT_STATE_SIZE - CONFIG_RCU_DYNTICKS_BITS) | ^~~~~~~~~~~~~ ./include/linux/context_tracking_state.h:70:29: note: in expansion of macro ‘RCU_DYNTICKS_START’ 70 | #define CONTEXT_WORK_END (RCU_DYNTICKS_START - 1) | ^~~~~~~~~~~~~~~~~~ ./include/linux/context_tracking_state.h:74:16: note: in expansion of macro ‘CONTEXT_WORK_END’ 74 | (CONTEXT_WORK_END + 1 - CONTEXT_WORK_START) + | ^~~~~~~~~~~~~~~~ ./include/linux/context_tracking_state.h:56:61: error: ‘struct context_tracking’ has no member named ‘state’ 56 | #define CT_STATE_SIZE (sizeof(((struct context_tracking *)0)->state) * BITS_PER_BYTE) | ^~ ./include/linux/build_bug.h:78:56: note: in definition of macro ‘__static_assert’ 78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg) | ^~~~ ./include/linux/context_tracking_state.h:73:1: note: in expansion of macro ‘static_assert’ 73 | static_assert((CONTEXT_STATE_END + 1 - CONTEXT_STATE_START) + | ^~~~~~~~~~~~~ ./include/linux/context_tracking_state.h:62:29: note: in expansion of macro ‘CT_STATE_SIZE’ 62 | #define RCU_DYNTICKS_END (CT_STATE_SIZE - 1) | ^~~~~~~~~~~~~ ./include/linux/context_tracking_state.h:75:16: note: in expansion of macro ‘RCU_DYNTICKS_END’ 75 | (RCU_DYNTICKS_END + 1 - RCU_DYNTICKS_START) == | ^~~~~~~~~~~~~~~~ ./include/linux/context_tracking_state.h:56:61: error: ‘struct context_tracking’ has no member named ‘state’ 56 | #define CT_STATE_SIZE (sizeof(((struct context_tracking *)0)->state) * BITS_PER_BYTE) | ^~ ./include/linux/build_bug.h:78:56: note: in definition of macro ‘__static_assert’ 78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg) | ^~~~ ./include/linux/context_tracking_state.h:73:1: note: in expansion of macro ‘static_assert’ 73 | static_assert((CONTEXT_STATE_END + 1 - CONTEXT_STATE_START) + | ^~~~~~~~~~~~~ ./include/linux/context_tracking_state.h:61:29: note: in expansion of macro ‘CT_STATE_SIZE’ 61 | #define RCU_DYNTICKS_START (CT_STATE_SIZE - CONFIG_RCU_DYNTICKS_BITS) | ^~~~~~~~~~~~~ ./include/linux/context_tracking_state.h:75:40: note: in expansion of macro ‘RCU_DYNTICKS_START’ 75 | (RCU_DYNTICKS_END + 1 - RCU_DYNTICKS_START) == | ^~~~~~~~~~~~~~~~~~ ./include/linux/context_tracking_state.h:56:61: error: ‘struct context_tracking’ has no member named ‘state’ 56 | #define CT_STATE_SIZE (sizeof(((struct context_tracking *)0)->state) * BITS_PER_BYTE) | ^~ ./include/linux/build_bug.h:78:56: note: in definition of macro ‘__static_assert’ 78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg) | ^~~~ ./include/linux/context_tracking_state.h:73:1: note: in expansion of macro ‘static_assert’ 73 | static_assert((CONTEXT_STATE_END + 1 - CONTEXT_STATE_START) + | ^~~~~~~~~~~~~ ./include/linux/context_tracking_state.h:76:15: note: in expansion of macro ‘CT_STATE_SIZE’ 76 | CT_STATE_SIZE); | ^~~~~~~~~~~~~ ./include/linux/context_tracking_state.h:73:15: error: expression in static assertion is not an integer 73 | static_assert((CONTEXT_STATE_END + 1 - CONTEXT_STATE_START) + | ^ ./include/linux/build_bug.h:78:56: note: in definition of macro ‘__static_assert’ 78 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg) | ^~~~ ./include/linux/context_tracking_state.h:73:1: note: in expansion of macro ‘static_assert’ 73 | static_assert((CONTEXT_STATE_END + 1 - CONTEXT_STATE_START) + | ^~~~~~~~~~~~~ make[2]: *** [scripts/Makefile.build:116: arch/x86/kernel/asm-offsets.s] Error 1 make[1]: *** [/home/git/linux-rcu-1/Makefile:1275: prepare0] Error 2 make[1]: *** Waiting for unfinished jobs.... LD /home/git/linux-rcu-1/tools/objtool/objtool-in.o LINK /home/git/linux-rcu-1/tools/objtool/objtool make: *** [Makefile:234: __sub-make] Error 2
On 21/07/23 07:07, Paul E. McKenney wrote: > On Fri, Jul 21, 2023 at 08:58:53AM +0100, Valentin Schneider wrote: >> On 20/07/23 21:00, Paul E. McKenney wrote: >> > On Thu, Jul 20, 2023 at 12:53:05PM -0700, Paul E. McKenney wrote: >> >> On Thu, Jul 20, 2023 at 05:30:53PM +0100, Valentin Schneider wrote: >> >> > diff --git a/tools/testing/selftests/rcutorture/configs/rcu/TREE11 b/tools/testing/selftests/rcutorture/configs/rcu/TREE11 >> >> > new file mode 100644 >> >> > index 0000000000000..aa7274efd9819 >> >> > --- /dev/null >> >> > +++ b/tools/testing/selftests/rcutorture/configs/rcu/TREE11 >> >> > @@ -0,0 +1,19 @@ >> >> > +CONFIG_SMP=y >> >> > +CONFIG_NR_CPUS=8 >> >> > +CONFIG_PREEMPT_NONE=n >> >> > +CONFIG_PREEMPT_VOLUNTARY=y >> >> > +CONFIG_PREEMPT=n >> >> > +CONFIG_PREEMPT_DYNAMIC=n >> >> > +#CHECK#CONFIG_TREE_RCU=y >> >> > +CONFIG_HZ_PERIODIC=n >> >> > +CONFIG_NO_HZ_IDLE=n >> >> > +CONFIG_NO_HZ_FULL=y >> >> > +CONFIG_RCU_TRACE=y >> >> > +CONFIG_RCU_FANOUT=4 >> >> > +CONFIG_RCU_FANOUT_LEAF=3 >> >> > +CONFIG_DEBUG_LOCK_ALLOC=n >> >> > +CONFIG_DEBUG_OBJECTS_RCU_HEAD=n >> >> > +CONFIG_RCU_EXPERT=y >> >> > +CONFIG_RCU_EQS_DEBUG=y >> >> > +CONFIG_RCU_LAZY=y >> >> > +CONFIG_RCU_DYNTICKS_BITS=2 >> >> >> >> Why not just add this last line to the existing TREE04 scenario? >> >> That would ensure that it gets tested regularly without extending the >> >> time required to run a full set of rcutorture tests. >> > >> > Please see below for the version of this patch that I am running overnight >> > tests with. Does this one work for you? >> >> Yep that's fine with me. I only went with a separate test file as wasn't >> sure how new test options should be handled (merged into existing tests vs >> new tests created), and didn't want to negatively impact TREE04 or >> TREE06. If merging into TREE04 is preferred, then I'll do just that and >> carry this path moving forwards. > > Things worked fine for this one-hour-per-scenario test run on my laptop, Many thanks for testing! > except for the CONFIG_SMP=n runs, which all got build errors like the > following. > Harumph, yes !SMP (and !CONTEXT_TRACKING_WORK) doesn't compile nicely, I'll fix that for v3.
diff --git a/tools/testing/selftests/rcutorture/configs/rcu/TREE11 b/tools/testing/selftests/rcutorture/configs/rcu/TREE11 new file mode 100644 index 0000000000000..aa7274efd9819 --- /dev/null +++ b/tools/testing/selftests/rcutorture/configs/rcu/TREE11 @@ -0,0 +1,19 @@ +CONFIG_SMP=y +CONFIG_NR_CPUS=8 +CONFIG_PREEMPT_NONE=n +CONFIG_PREEMPT_VOLUNTARY=y +CONFIG_PREEMPT=n +CONFIG_PREEMPT_DYNAMIC=n +#CHECK#CONFIG_TREE_RCU=y +CONFIG_HZ_PERIODIC=n +CONFIG_NO_HZ_IDLE=n +CONFIG_NO_HZ_FULL=y +CONFIG_RCU_TRACE=y +CONFIG_RCU_FANOUT=4 +CONFIG_RCU_FANOUT_LEAF=3 +CONFIG_DEBUG_LOCK_ALLOC=n +CONFIG_DEBUG_OBJECTS_RCU_HEAD=n +CONFIG_RCU_EXPERT=y +CONFIG_RCU_EQS_DEBUG=y +CONFIG_RCU_LAZY=y +CONFIG_RCU_DYNTICKS_BITS=2 diff --git a/tools/testing/selftests/rcutorture/configs/rcu/TREE11.boot b/tools/testing/selftests/rcutorture/configs/rcu/TREE11.boot new file mode 100644 index 0000000000000..a8d94caf7d2fd --- /dev/null +++ b/tools/testing/selftests/rcutorture/configs/rcu/TREE11.boot @@ -0,0 +1 @@ +rcutree.rcu_fanout_leaf=4 nohz_full=1-N
We now have an RCU_EXPORT knob for configuring the size of the dynticks counter: CONFIG_RCU_DYNTICKS_BITS. Add a torture config for a ridiculously small counter (2 bits). This is ac opy of TREE4 with the added counter size restriction. Link: http://lore.kernel.org/r/4c2cb573-168f-4806-b1d9-164e8276e66a@paulmck-laptop Suggested-by: Paul E. McKenney <paulmck@kernel.org> Signed-off-by: Valentin Schneider <vschneid@redhat.com> --- .../selftests/rcutorture/configs/rcu/TREE11 | 19 +++++++++++++++++++ .../rcutorture/configs/rcu/TREE11.boot | 1 + 2 files changed, 20 insertions(+) create mode 100644 tools/testing/selftests/rcutorture/configs/rcu/TREE11 create mode 100644 tools/testing/selftests/rcutorture/configs/rcu/TREE11.boot