* [PATCH rcu 1/9] rcutorture: Dump grace-period state upon rtort_pipe_count incidents
2023-07-17 18:20 [PATCH rcu 0/9] Torture-test updates for v6.6 Paul E. McKenney
@ 2023-07-17 18:20 ` Paul E. McKenney
2023-07-17 18:20 ` [PATCH rcu 2/9] torture: Support randomized shuffling for proxy exec testing Paul E. McKenney
` (7 subsequent siblings)
8 siblings, 0 replies; 17+ messages in thread
From: Paul E. McKenney @ 2023-07-17 18:20 UTC (permalink / raw)
To: rcu; +Cc: linux-kernel, kernel-team, rostedt, Paul E. McKenney
The rtort_pipe_count WARN() indicates that grace periods were unable
to invoke all callbacks during a stutter_wait() interval. But it is
sometimes helpful to have a bit more information as to why. This commit
therefore invokes show_rcu_gp_kthreads() immediately before that WARN()
in order to dump out some relevant information.
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
kernel/rcu/rcutorture.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
index 147551c23baf..d291a1438c30 100644
--- a/kernel/rcu/rcutorture.c
+++ b/kernel/rcu/rcutorture.c
@@ -1581,6 +1581,7 @@ rcu_torture_writer(void *arg)
rcu_access_pointer(rcu_torture_current) !=
&rcu_tortures[i]) {
tracing_off();
+ show_rcu_gp_kthreads();
WARN(1, "%s: rtort_pipe_count: %d\n", __func__, rcu_tortures[i].rtort_pipe_count);
rcu_ftrace_dump(DUMP_ALL);
}
--
2.40.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PATCH rcu 2/9] torture: Support randomized shuffling for proxy exec testing
2023-07-17 18:20 [PATCH rcu 0/9] Torture-test updates for v6.6 Paul E. McKenney
2023-07-17 18:20 ` [PATCH rcu 1/9] rcutorture: Dump grace-period state upon rtort_pipe_count incidents Paul E. McKenney
@ 2023-07-17 18:20 ` Paul E. McKenney
2023-07-17 18:20 ` [PATCH rcu 3/9] torture: Add lock_torture_writer_fifo module param Paul E. McKenney
` (6 subsequent siblings)
8 siblings, 0 replies; 17+ messages in thread
From: Paul E. McKenney @ 2023-07-17 18:20 UTC (permalink / raw)
To: rcu
Cc: linux-kernel, kernel-team, rostedt, Connor O'Brien,
Paul E. McKenney, Josh Triplett, Joel Fernandes, Juri Lelli,
Valentin Schneider, Dietmar Eggemann, kernel-team, John Stultz,
Davidlohr Bueso
From: Connor O'Brien <connoro@google.com>
Currently shuffling sets the same cpu affinities for all tasks,
which makes us less likely to hit paths involving migrating
blocked tasks onto a cpu where they can't run.
This patch adds an element of randomness to allow affinities of
different writer tasks to diverge.
This has helped uncover issues in testing with Proxy Execution
Cc: "Paul E. McKenney" <paulmck@kernel.org>
Cc: Josh Triplett <josh@joshtriplett.org>
Cc: Joel Fernandes <joel@joelfernandes.org>
Cc: Juri Lelli <juri.lelli@redhat.com>
Cc: Valentin Schneider <vschneid@redhat.com>
Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
Cc: kernel-team@android.com
Signed-off-by: Connor O'Brien <connoro@google.com>
Signed-off-by: John Stultz <jstultz@google.com>
Acked-by: Davidlohr Bueso <dave@stgolabs.net>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
kernel/torture.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/kernel/torture.c b/kernel/torture.c
index 1a0519b836ac..8be83fdc6be1 100644
--- a/kernel/torture.c
+++ b/kernel/torture.c
@@ -54,6 +54,9 @@ module_param(verbose_sleep_frequency, int, 0444);
static int verbose_sleep_duration = 1;
module_param(verbose_sleep_duration, int, 0444);
+static int random_shuffle;
+module_param(random_shuffle, int, 0444);
+
static char *torture_type;
static int verbose;
@@ -518,6 +521,7 @@ static void torture_shuffle_task_unregister_all(void)
*/
static void torture_shuffle_tasks(void)
{
+ DEFINE_TORTURE_RANDOM(rand);
struct shuffle_task *stp;
cpumask_setall(shuffle_tmp_mask);
@@ -537,8 +541,10 @@ static void torture_shuffle_tasks(void)
cpumask_clear_cpu(shuffle_idle_cpu, shuffle_tmp_mask);
mutex_lock(&shuffle_task_mutex);
- list_for_each_entry(stp, &shuffle_task_list, st_l)
- set_cpus_allowed_ptr(stp->st_t, shuffle_tmp_mask);
+ list_for_each_entry(stp, &shuffle_task_list, st_l) {
+ if (!random_shuffle || torture_random(&rand) & 0x1)
+ set_cpus_allowed_ptr(stp->st_t, shuffle_tmp_mask);
+ }
mutex_unlock(&shuffle_task_mutex);
cpus_read_unlock();
--
2.40.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PATCH rcu 3/9] torture: Add lock_torture_writer_fifo module param
2023-07-17 18:20 [PATCH rcu 0/9] Torture-test updates for v6.6 Paul E. McKenney
2023-07-17 18:20 ` [PATCH rcu 1/9] rcutorture: Dump grace-period state upon rtort_pipe_count incidents Paul E. McKenney
2023-07-17 18:20 ` [PATCH rcu 2/9] torture: Support randomized shuffling for proxy exec testing Paul E. McKenney
@ 2023-07-17 18:20 ` Paul E. McKenney
2023-07-28 3:22 ` Paul E. McKenney
2023-07-17 18:20 ` [PATCH rcu 4/9] torture: Make torture_hrtimeout_*() use TASK_IDLE Paul E. McKenney
` (5 subsequent siblings)
8 siblings, 1 reply; 17+ messages in thread
From: Paul E. McKenney @ 2023-07-17 18:20 UTC (permalink / raw)
To: rcu
Cc: linux-kernel, kernel-team, rostedt, Dietmar Eggemann,
Paul E. McKenney, Josh Triplett, Joel Fernandes, Juri Lelli,
Valentin Schneider, kernel-team, John Stultz, Davidlohr Bueso
From: Dietmar Eggemann <dietmar.eggemann@arm.com>
Modifies locktorture writer to run as RT task.
To use it:
insmod /lib/modules/torture.ko random_shuffle=1 lock_torture_writer_fifo=1
^^^^^^^^^^^^^^^^^^^^^^^^^^
insmod /lib/modules/locktorture.ko torture_type=mutex_lock rt_boost=1 rt_boost_factor=50 nested_locks=3
This patch has been helpful to uncover issues with the proxy-execution
series.
Cc: "Paul E. McKenney" <paulmck@kernel.org>
Cc: Josh Triplett <josh@joshtriplett.org>
Cc: Joel Fernandes <joel@joelfernandes.org>
Cc: Juri Lelli <juri.lelli@redhat.com>
Cc: Valentin Schneider <vschneid@redhat.com>
Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
Cc: kernel-team@android.com
Signed-off-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
[jstultz: Include header change to build, reword commit message]
Signed-off-by: John Stultz <jstultz@google.com>
Acked-by: Davidlohr Bueso <dave@stgolabs.net>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
kernel/locking/locktorture.c | 3 ++-
kernel/torture.c | 11 ++++++++++-
2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/kernel/locking/locktorture.c b/kernel/locking/locktorture.c
index 949d3deae506..aac48d323254 100644
--- a/kernel/locking/locktorture.c
+++ b/kernel/locking/locktorture.c
@@ -809,7 +809,8 @@ static int lock_torture_writer(void *arg)
bool skip_main_lock;
VERBOSE_TOROUT_STRING("lock_torture_writer task started");
- set_user_nice(current, MAX_NICE);
+ if (!rt_task(current))
+ set_user_nice(current, MAX_NICE);
do {
if ((torture_random(&rand) & 0xfffff) == 0)
diff --git a/kernel/torture.c b/kernel/torture.c
index 8be83fdc6be1..db79197e257a 100644
--- a/kernel/torture.c
+++ b/kernel/torture.c
@@ -37,6 +37,7 @@
#include <linux/ktime.h>
#include <asm/byteorder.h>
#include <linux/torture.h>
+#include <linux/sched/rt.h>
#include "rcu/rcu.h"
MODULE_LICENSE("GPL");
@@ -57,6 +58,9 @@ module_param(verbose_sleep_duration, int, 0444);
static int random_shuffle;
module_param(random_shuffle, int, 0444);
+static int lock_torture_writer_fifo;
+module_param(lock_torture_writer_fifo, int, 0444);
+
static char *torture_type;
static int verbose;
@@ -734,7 +738,7 @@ bool stutter_wait(const char *title)
cond_resched_tasks_rcu_qs();
spt = READ_ONCE(stutter_pause_test);
for (; spt; spt = READ_ONCE(stutter_pause_test)) {
- if (!ret) {
+ if (!ret && !rt_task(current)) {
sched_set_normal(current, MAX_NICE);
ret = true;
}
@@ -944,6 +948,11 @@ int _torture_create_kthread(int (*fn)(void *arg), void *arg, char *s, char *m,
*tp = NULL;
return ret;
}
+
+ if (lock_torture_writer_fifo &&
+ !strncmp(s, "lock_torture_writer", strlen(s)))
+ sched_set_fifo(*tp);
+
wake_up_process(*tp); // Process is sleeping, so ordering provided.
torture_shuffle_task_register(*tp);
return ret;
--
2.40.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* Re: [PATCH rcu 3/9] torture: Add lock_torture_writer_fifo module param
2023-07-17 18:20 ` [PATCH rcu 3/9] torture: Add lock_torture_writer_fifo module param Paul E. McKenney
@ 2023-07-28 3:22 ` Paul E. McKenney
2023-07-28 3:22 ` [PATCH rcu 1/2] torture: Add a kthread-creation callback to _torture_create_kthread() Paul E. McKenney
2023-07-28 3:22 ` [PATCH rcu 2/2] torture: Add lock_torture writer_fifo module parameter Paul E. McKenney
0 siblings, 2 replies; 17+ messages in thread
From: Paul E. McKenney @ 2023-07-28 3:22 UTC (permalink / raw)
To: rcu
Cc: linux-kernel, kernel-team, rostedt, Dietmar Eggemann,
Josh Triplett, Joel Fernandes, Juri Lelli, Valentin Schneider,
kernel-team, John Stultz, Davidlohr Bueso
On Mon, Jul 17, 2023 at 11:20:36AM -0700, Paul E. McKenney wrote:
> From: Dietmar Eggemann <dietmar.eggemann@arm.com>
>
> Modifies locktorture writer to run as RT task.
>
> To use it:
> insmod /lib/modules/torture.ko random_shuffle=1 lock_torture_writer_fifo=1
> ^^^^^^^^^^^^^^^^^^^^^^^^^^
> insmod /lib/modules/locktorture.ko torture_type=mutex_lock rt_boost=1 rt_boost_factor=50 nested_locks=3
>
> This patch has been helpful to uncover issues with the proxy-execution
> series.
>
> Cc: "Paul E. McKenney" <paulmck@kernel.org>
> Cc: Josh Triplett <josh@joshtriplett.org>
> Cc: Joel Fernandes <joel@joelfernandes.org>
> Cc: Juri Lelli <juri.lelli@redhat.com>
> Cc: Valentin Schneider <vschneid@redhat.com>
> Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
> Cc: kernel-team@android.com
> Signed-off-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
> [jstultz: Include header change to build, reword commit message]
> Signed-off-by: John Stultz <jstultz@google.com>
> Acked-by: Davidlohr Bueso <dave@stgolabs.net>
> Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
> ---
> kernel/locking/locktorture.c | 3 ++-
> kernel/torture.c | 11 ++++++++++-
> 2 files changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/kernel/locking/locktorture.c b/kernel/locking/locktorture.c
> index 949d3deae506..aac48d323254 100644
> --- a/kernel/locking/locktorture.c
> +++ b/kernel/locking/locktorture.c
> @@ -809,7 +809,8 @@ static int lock_torture_writer(void *arg)
> bool skip_main_lock;
>
> VERBOSE_TOROUT_STRING("lock_torture_writer task started");
> - set_user_nice(current, MAX_NICE);
> + if (!rt_task(current))
> + set_user_nice(current, MAX_NICE);
>
> do {
> if ((torture_random(&rand) & 0xfffff) == 0)
> diff --git a/kernel/torture.c b/kernel/torture.c
> index 8be83fdc6be1..db79197e257a 100644
> --- a/kernel/torture.c
> +++ b/kernel/torture.c
> @@ -37,6 +37,7 @@
> #include <linux/ktime.h>
> #include <asm/byteorder.h>
> #include <linux/torture.h>
> +#include <linux/sched/rt.h>
> #include "rcu/rcu.h"
>
> MODULE_LICENSE("GPL");
> @@ -57,6 +58,9 @@ module_param(verbose_sleep_duration, int, 0444);
> static int random_shuffle;
> module_param(random_shuffle, int, 0444);
>
> +static int lock_torture_writer_fifo;
> +module_param(lock_torture_writer_fifo, int, 0444);
> +
> static char *torture_type;
> static int verbose;
>
> @@ -734,7 +738,7 @@ bool stutter_wait(const char *title)
> cond_resched_tasks_rcu_qs();
> spt = READ_ONCE(stutter_pause_test);
> for (; spt; spt = READ_ONCE(stutter_pause_test)) {
> - if (!ret) {
> + if (!ret && !rt_task(current)) {
> sched_set_normal(current, MAX_NICE);
> ret = true;
> }
> @@ -944,6 +948,11 @@ int _torture_create_kthread(int (*fn)(void *arg), void *arg, char *s, char *m,
> *tp = NULL;
> return ret;
> }
> +
> + if (lock_torture_writer_fifo &&
> + !strncmp(s, "lock_torture_writer", strlen(s)))
> + sched_set_fifo(*tp);
I replaced this with a callback function in order to confine
locktorture-specific code to kernel/locking/locktorture.c.
I will reply with the following two patches.
1. Add a kthread-creation callback to _torture_create_kthread().
2. Add lock_torture writer_fifo module parameter, courtesy of
Dietmar Eggemann.
Please let me know if you have objections to this change.
Thanx, Paul
------------------------------------------------------------------------
b/Documentation/admin-guide/kernel-parameters.txt | 4 ++++
b/include/linux/torture.h | 7 +++++--
b/kernel/locking/locktorture.c | 12 +++++++-----
b/kernel/torture.c | 6 +++++-
kernel/torture.c | 3 ++-
5 files changed, 23 insertions(+), 9 deletions(-)
^ permalink raw reply [flat|nested] 17+ messages in thread* [PATCH rcu 1/2] torture: Add a kthread-creation callback to _torture_create_kthread()
2023-07-28 3:22 ` Paul E. McKenney
@ 2023-07-28 3:22 ` Paul E. McKenney
2023-08-05 22:44 ` Joel Fernandes
2023-08-08 3:26 ` John Stultz
2023-07-28 3:22 ` [PATCH rcu 2/2] torture: Add lock_torture writer_fifo module parameter Paul E. McKenney
1 sibling, 2 replies; 17+ messages in thread
From: Paul E. McKenney @ 2023-07-28 3:22 UTC (permalink / raw)
To: rcu
Cc: linux-kernel, kernel-team, rostedt, Paul E. McKenney,
Dietmar Eggemann, John Stultz, Josh Triplett, Joel Fernandes,
Juri Lelli, Valentin Schneider, kernel-team
This commit adds a kthread-creation callback to the
_torture_create_kthread() function, which allows callers of a new
torture_create_kthread_cb() macro to specify a function to be invoked
after the kthread is created but before it is awakened for the first time.
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
Cc: John Stultz <jstultz@google.com>
Cc: Josh Triplett <josh@joshtriplett.org>
Cc: Joel Fernandes <joel@joelfernandes.org>
Cc: Juri Lelli <juri.lelli@redhat.com>
Cc: Valentin Schneider <vschneid@redhat.com>
Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
Cc: kernel-team@android.com
---
include/linux/torture.h | 7 +++++--
kernel/torture.c | 6 +++++-
2 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/include/linux/torture.h b/include/linux/torture.h
index 7038104463e4..bb466eec01e4 100644
--- a/include/linux/torture.h
+++ b/include/linux/torture.h
@@ -108,12 +108,15 @@ bool torture_must_stop(void);
bool torture_must_stop_irq(void);
void torture_kthread_stopping(char *title);
int _torture_create_kthread(int (*fn)(void *arg), void *arg, char *s, char *m,
- char *f, struct task_struct **tp);
+ char *f, struct task_struct **tp, void (*cbf)(struct task_struct *tp));
void _torture_stop_kthread(char *m, struct task_struct **tp);
#define torture_create_kthread(n, arg, tp) \
_torture_create_kthread(n, (arg), #n, "Creating " #n " task", \
- "Failed to create " #n, &(tp))
+ "Failed to create " #n, &(tp), NULL)
+#define torture_create_kthread_cb(n, arg, tp, cbf) \
+ _torture_create_kthread(n, (arg), #n, "Creating " #n " task", \
+ "Failed to create " #n, &(tp), cbf)
#define torture_stop_kthread(n, tp) \
_torture_stop_kthread("Stopping " #n " task", &(tp))
diff --git a/kernel/torture.c b/kernel/torture.c
index 8be83fdc6be1..b88a1a86d9da 100644
--- a/kernel/torture.c
+++ b/kernel/torture.c
@@ -932,7 +932,7 @@ EXPORT_SYMBOL_GPL(torture_kthread_stopping);
* it starts, you will need to open-code your own.
*/
int _torture_create_kthread(int (*fn)(void *arg), void *arg, char *s, char *m,
- char *f, struct task_struct **tp)
+ char *f, struct task_struct **tp, void (*cbf)(struct task_struct *tp))
{
int ret = 0;
@@ -944,6 +944,10 @@ int _torture_create_kthread(int (*fn)(void *arg), void *arg, char *s, char *m,
*tp = NULL;
return ret;
}
+
+ if (cbf)
+ cbf(*tp);
+
wake_up_process(*tp); // Process is sleeping, so ordering provided.
torture_shuffle_task_register(*tp);
return ret;
--
2.40.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* Re: [PATCH rcu 1/2] torture: Add a kthread-creation callback to _torture_create_kthread()
2023-07-28 3:22 ` [PATCH rcu 1/2] torture: Add a kthread-creation callback to _torture_create_kthread() Paul E. McKenney
@ 2023-08-05 22:44 ` Joel Fernandes
2023-08-08 3:26 ` John Stultz
1 sibling, 0 replies; 17+ messages in thread
From: Joel Fernandes @ 2023-08-05 22:44 UTC (permalink / raw)
To: Paul E. McKenney
Cc: rcu, linux-kernel, kernel-team, rostedt, Dietmar Eggemann,
John Stultz, Josh Triplett, Juri Lelli, Valentin Schneider,
kernel-team
On Thu, Jul 27, 2023 at 11:22 PM Paul E. McKenney <paulmck@kernel.org> wrote:
>
> This commit adds a kthread-creation callback to the
> _torture_create_kthread() function, which allows callers of a new
> torture_create_kthread_cb() macro to specify a function to be invoked
> after the kthread is created but before it is awakened for the first time.
>
> Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
> Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
> Cc: John Stultz <jstultz@google.com>
> Cc: Josh Triplett <josh@joshtriplett.org>
> Cc: Joel Fernandes <joel@joelfernandes.org>
Reviewed-by: Joel Fernandes (Google) <joel@joelfernandes.org>
thanks,
- Joel
> Cc: Juri Lelli <juri.lelli@redhat.com>
> Cc: Valentin Schneider <vschneid@redhat.com>
> Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
> Cc: kernel-team@android.com
> ---
> include/linux/torture.h | 7 +++++--
> kernel/torture.c | 6 +++++-
> 2 files changed, 10 insertions(+), 3 deletions(-)
>
> diff --git a/include/linux/torture.h b/include/linux/torture.h
> index 7038104463e4..bb466eec01e4 100644
> --- a/include/linux/torture.h
> +++ b/include/linux/torture.h
> @@ -108,12 +108,15 @@ bool torture_must_stop(void);
> bool torture_must_stop_irq(void);
> void torture_kthread_stopping(char *title);
> int _torture_create_kthread(int (*fn)(void *arg), void *arg, char *s, char *m,
> - char *f, struct task_struct **tp);
> + char *f, struct task_struct **tp, void (*cbf)(struct task_struct *tp));
> void _torture_stop_kthread(char *m, struct task_struct **tp);
>
> #define torture_create_kthread(n, arg, tp) \
> _torture_create_kthread(n, (arg), #n, "Creating " #n " task", \
> - "Failed to create " #n, &(tp))
> + "Failed to create " #n, &(tp), NULL)
> +#define torture_create_kthread_cb(n, arg, tp, cbf) \
> + _torture_create_kthread(n, (arg), #n, "Creating " #n " task", \
> + "Failed to create " #n, &(tp), cbf)
> #define torture_stop_kthread(n, tp) \
> _torture_stop_kthread("Stopping " #n " task", &(tp))
>
> diff --git a/kernel/torture.c b/kernel/torture.c
> index 8be83fdc6be1..b88a1a86d9da 100644
> --- a/kernel/torture.c
> +++ b/kernel/torture.c
> @@ -932,7 +932,7 @@ EXPORT_SYMBOL_GPL(torture_kthread_stopping);
> * it starts, you will need to open-code your own.
> */
> int _torture_create_kthread(int (*fn)(void *arg), void *arg, char *s, char *m,
> - char *f, struct task_struct **tp)
> + char *f, struct task_struct **tp, void (*cbf)(struct task_struct *tp))
> {
> int ret = 0;
>
> @@ -944,6 +944,10 @@ int _torture_create_kthread(int (*fn)(void *arg), void *arg, char *s, char *m,
> *tp = NULL;
> return ret;
> }
> +
> + if (cbf)
> + cbf(*tp);
> +
> wake_up_process(*tp); // Process is sleeping, so ordering provided.
> torture_shuffle_task_register(*tp);
> return ret;
> --
> 2.40.1
>
^ permalink raw reply [flat|nested] 17+ messages in thread* Re: [PATCH rcu 1/2] torture: Add a kthread-creation callback to _torture_create_kthread()
2023-07-28 3:22 ` [PATCH rcu 1/2] torture: Add a kthread-creation callback to _torture_create_kthread() Paul E. McKenney
2023-08-05 22:44 ` Joel Fernandes
@ 2023-08-08 3:26 ` John Stultz
1 sibling, 0 replies; 17+ messages in thread
From: John Stultz @ 2023-08-08 3:26 UTC (permalink / raw)
To: Paul E. McKenney
Cc: rcu, linux-kernel, kernel-team, rostedt, Dietmar Eggemann,
Josh Triplett, Joel Fernandes, Juri Lelli, Valentin Schneider,
kernel-team
On Thu, Jul 27, 2023 at 8:22 PM Paul E. McKenney <paulmck@kernel.org> wrote:
>
> This commit adds a kthread-creation callback to the
> _torture_create_kthread() function, which allows callers of a new
> torture_create_kthread_cb() macro to specify a function to be invoked
> after the kthread is created but before it is awakened for the first time.
>
> Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
> Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
> Cc: John Stultz <jstultz@google.com>
> Cc: Josh Triplett <josh@joshtriplett.org>
> Cc: Joel Fernandes <joel@joelfernandes.org>
> Cc: Juri Lelli <juri.lelli@redhat.com>
> Cc: Valentin Schneider <vschneid@redhat.com>
> Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
> Cc: kernel-team@android.com
Thanks for improving the patch this way!
Acked-by: John Stultz <jstultz@google.com>
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH rcu 2/2] torture: Add lock_torture writer_fifo module parameter
2023-07-28 3:22 ` Paul E. McKenney
2023-07-28 3:22 ` [PATCH rcu 1/2] torture: Add a kthread-creation callback to _torture_create_kthread() Paul E. McKenney
@ 2023-07-28 3:22 ` Paul E. McKenney
2023-08-08 3:27 ` John Stultz
1 sibling, 1 reply; 17+ messages in thread
From: Paul E. McKenney @ 2023-07-28 3:22 UTC (permalink / raw)
To: rcu
Cc: linux-kernel, kernel-team, rostedt, Dietmar Eggemann,
Paul E. McKenney, Josh Triplett, Joel Fernandes, Juri Lelli,
Valentin Schneider, kernel-team, John Stultz, Davidlohr Bueso
From: Dietmar Eggemann <dietmar.eggemann@arm.com>
This commit adds a module parameter that causes the locktorture writer
to run at real-time priority.
To use it:
insmod /lib/modules/torture.ko random_shuffle=1
insmod /lib/modules/locktorture.ko torture_type=mutex_lock rt_boost=1 rt_boost_factor=50 nested_locks=3 writer_fifo=1
^^^^^^^^^^^^^
A predecessor to this patch has been helpful to uncover issues with the
proxy-execution series.
[ paulmck: Remove locktorture-specific code from kernel/torture.c. ]
Cc: "Paul E. McKenney" <paulmck@kernel.org>
Cc: Josh Triplett <josh@joshtriplett.org>
Cc: Joel Fernandes <joel@joelfernandes.org>
Cc: Juri Lelli <juri.lelli@redhat.com>
Cc: Valentin Schneider <vschneid@redhat.com>
Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
Cc: kernel-team@android.com
Signed-off-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
[jstultz: Include header change to build, reword commit message]
Signed-off-by: John Stultz <jstultz@google.com>
Acked-by: Davidlohr Bueso <dave@stgolabs.net>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
Documentation/admin-guide/kernel-parameters.txt | 4 ++++
kernel/locking/locktorture.c | 12 +++++++-----
kernel/torture.c | 3 ++-
3 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index a1457995fd41..7b94455e9ae2 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -2918,6 +2918,10 @@
locktorture.torture_type= [KNL]
Specify the locking implementation to test.
+ locktorture.writer_fifo= [KNL]
+ Run the write-side locktorture kthreads at
+ sched_set_fifo() real-time priority.
+
locktorture.verbose= [KNL]
Enable additional printk() statements.
diff --git a/kernel/locking/locktorture.c b/kernel/locking/locktorture.c
index 949d3deae506..270c7f80ce84 100644
--- a/kernel/locking/locktorture.c
+++ b/kernel/locking/locktorture.c
@@ -45,6 +45,7 @@ torture_param(int, stutter, 5, "Number of jiffies to run/halt test, 0=disable");
torture_param(int, rt_boost, 2,
"Do periodic rt-boost. 0=Disable, 1=Only for rt_mutex, 2=For all lock types.");
torture_param(int, rt_boost_factor, 50, "A factor determining how often rt-boost happens.");
+torture_param(int, writer_fifo, 0, "Run writers at sched_set_fifo() priority");
torture_param(int, verbose, 1, "Enable verbose debugging printk()s");
torture_param(int, nested_locks, 0, "Number of nested locks (max = 8)");
/* Going much higher trips "BUG: MAX_LOCKDEP_CHAIN_HLOCKS too low!" errors */
@@ -809,7 +810,8 @@ static int lock_torture_writer(void *arg)
bool skip_main_lock;
VERBOSE_TOROUT_STRING("lock_torture_writer task started");
- set_user_nice(current, MAX_NICE);
+ if (!rt_task(current))
+ set_user_nice(current, MAX_NICE);
do {
if ((torture_random(&rand) & 0xfffff) == 0)
@@ -1015,8 +1017,7 @@ static void lock_torture_cleanup(void)
if (writer_tasks) {
for (i = 0; i < cxt.nrealwriters_stress; i++)
- torture_stop_kthread(lock_torture_writer,
- writer_tasks[i]);
+ torture_stop_kthread(lock_torture_writer, writer_tasks[i]);
kfree(writer_tasks);
writer_tasks = NULL;
}
@@ -1244,8 +1245,9 @@ static int __init lock_torture_init(void)
goto create_reader;
/* Create writer. */
- firsterr = torture_create_kthread(lock_torture_writer, &cxt.lwsa[i],
- writer_tasks[i]);
+ firsterr = torture_create_kthread_cb(lock_torture_writer, &cxt.lwsa[i],
+ writer_tasks[i],
+ writer_fifo ? sched_set_fifo : NULL);
if (torture_init_error(firsterr))
goto unwind;
diff --git a/kernel/torture.c b/kernel/torture.c
index b88a1a86d9da..a1ac493488e2 100644
--- a/kernel/torture.c
+++ b/kernel/torture.c
@@ -37,6 +37,7 @@
#include <linux/ktime.h>
#include <asm/byteorder.h>
#include <linux/torture.h>
+#include <linux/sched/rt.h>
#include "rcu/rcu.h"
MODULE_LICENSE("GPL");
@@ -734,7 +735,7 @@ bool stutter_wait(const char *title)
cond_resched_tasks_rcu_qs();
spt = READ_ONCE(stutter_pause_test);
for (; spt; spt = READ_ONCE(stutter_pause_test)) {
- if (!ret) {
+ if (!ret && !rt_task(current)) {
sched_set_normal(current, MAX_NICE);
ret = true;
}
--
2.40.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* Re: [PATCH rcu 2/2] torture: Add lock_torture writer_fifo module parameter
2023-07-28 3:22 ` [PATCH rcu 2/2] torture: Add lock_torture writer_fifo module parameter Paul E. McKenney
@ 2023-08-08 3:27 ` John Stultz
2023-08-08 4:00 ` Paul E. McKenney
0 siblings, 1 reply; 17+ messages in thread
From: John Stultz @ 2023-08-08 3:27 UTC (permalink / raw)
To: Paul E. McKenney
Cc: rcu, linux-kernel, kernel-team, rostedt, Dietmar Eggemann,
Josh Triplett, Joel Fernandes, Juri Lelli, Valentin Schneider,
kernel-team, Davidlohr Bueso
On Thu, Jul 27, 2023 at 8:22 PM Paul E. McKenney <paulmck@kernel.org> wrote:
>
> From: Dietmar Eggemann <dietmar.eggemann@arm.com>
>
> This commit adds a module parameter that causes the locktorture writer
> to run at real-time priority.
>
> To use it:
> insmod /lib/modules/torture.ko random_shuffle=1
> insmod /lib/modules/locktorture.ko torture_type=mutex_lock rt_boost=1 rt_boost_factor=50 nested_locks=3 writer_fifo=1
> ^^^^^^^^^^^^^
>
> A predecessor to this patch has been helpful to uncover issues with the
> proxy-execution series.
>
> [ paulmck: Remove locktorture-specific code from kernel/torture.c. ]
Thanks again for improving this! I've switched over to your version
here in my test tree.
Acked-by: John Stultz <jstultz@google.com>
thanks
-john
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH rcu 2/2] torture: Add lock_torture writer_fifo module parameter
2023-08-08 3:27 ` John Stultz
@ 2023-08-08 4:00 ` Paul E. McKenney
0 siblings, 0 replies; 17+ messages in thread
From: Paul E. McKenney @ 2023-08-08 4:00 UTC (permalink / raw)
To: John Stultz
Cc: rcu, linux-kernel, kernel-team, rostedt, Dietmar Eggemann,
Josh Triplett, Joel Fernandes, Juri Lelli, Valentin Schneider,
kernel-team, Davidlohr Bueso
On Mon, Aug 07, 2023 at 08:27:29PM -0700, John Stultz wrote:
> On Thu, Jul 27, 2023 at 8:22 PM Paul E. McKenney <paulmck@kernel.org> wrote:
> >
> > From: Dietmar Eggemann <dietmar.eggemann@arm.com>
> >
> > This commit adds a module parameter that causes the locktorture writer
> > to run at real-time priority.
> >
> > To use it:
> > insmod /lib/modules/torture.ko random_shuffle=1
> > insmod /lib/modules/locktorture.ko torture_type=mutex_lock rt_boost=1 rt_boost_factor=50 nested_locks=3 writer_fifo=1
> > ^^^^^^^^^^^^^
> >
> > A predecessor to this patch has been helpful to uncover issues with the
> > proxy-execution series.
> >
> > [ paulmck: Remove locktorture-specific code from kernel/torture.c. ]
>
> Thanks again for improving this! I've switched over to your version
> here in my test tree.
>
> Acked-by: John Stultz <jstultz@google.com>
Thank you both! I will apply on my next rebase.
Thanx, Paul
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH rcu 4/9] torture: Make torture_hrtimeout_*() use TASK_IDLE
2023-07-17 18:20 [PATCH rcu 0/9] Torture-test updates for v6.6 Paul E. McKenney
` (2 preceding siblings ...)
2023-07-17 18:20 ` [PATCH rcu 3/9] torture: Add lock_torture_writer_fifo module param Paul E. McKenney
@ 2023-07-17 18:20 ` Paul E. McKenney
2023-07-17 18:20 ` [PATCH rcu 5/9] torture: Move torture_onoff() timeouts to hrtimers Paul E. McKenney
` (4 subsequent siblings)
8 siblings, 0 replies; 17+ messages in thread
From: Paul E. McKenney @ 2023-07-17 18:20 UTC (permalink / raw)
To: rcu; +Cc: linux-kernel, kernel-team, rostedt, Paul E. McKenney
Given that it is expected that more code will use torture_hrtimeout_*(),
including for longer timeouts, make it use TASK_IDLE instead of
TASK_UNINTERRUPTIBLE.
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
kernel/torture.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kernel/torture.c b/kernel/torture.c
index db79197e257a..836fefa44373 100644
--- a/kernel/torture.c
+++ b/kernel/torture.c
@@ -96,7 +96,7 @@ int torture_hrtimeout_ns(ktime_t baset_ns, u32 fuzzt_ns, struct torture_random_s
if (trsp)
hto += (torture_random(trsp) >> 3) % fuzzt_ns;
- set_current_state(TASK_UNINTERRUPTIBLE);
+ set_current_state(TASK_IDLE);
return schedule_hrtimeout(&hto, HRTIMER_MODE_REL);
}
EXPORT_SYMBOL_GPL(torture_hrtimeout_ns);
--
2.40.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PATCH rcu 5/9] torture: Move torture_onoff() timeouts to hrtimers
2023-07-17 18:20 [PATCH rcu 0/9] Torture-test updates for v6.6 Paul E. McKenney
` (3 preceding siblings ...)
2023-07-17 18:20 ` [PATCH rcu 4/9] torture: Make torture_hrtimeout_*() use TASK_IDLE Paul E. McKenney
@ 2023-07-17 18:20 ` Paul E. McKenney
2023-07-17 18:20 ` [PATCH rcu 6/9] torture: Move torture_shuffle() " Paul E. McKenney
` (3 subsequent siblings)
8 siblings, 0 replies; 17+ messages in thread
From: Paul E. McKenney @ 2023-07-17 18:20 UTC (permalink / raw)
To: rcu; +Cc: linux-kernel, kernel-team, rostedt, Paul E. McKenney
In order to gain better race coverage, move the CPU-hotplug-related
timed waits in torture_onoff() to torture_hrtimeout_jiffies().
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
kernel/torture.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/kernel/torture.c b/kernel/torture.c
index 836fefa44373..fc873116a399 100644
--- a/kernel/torture.c
+++ b/kernel/torture.c
@@ -357,12 +357,12 @@ torture_onoff(void *arg)
if (onoff_holdoff > 0) {
VERBOSE_TOROUT_STRING("torture_onoff begin holdoff");
- schedule_timeout_interruptible(onoff_holdoff);
+ torture_hrtimeout_jiffies(onoff_holdoff, &rand);
VERBOSE_TOROUT_STRING("torture_onoff end holdoff");
}
while (!torture_must_stop()) {
if (disable_onoff_at_boot && !rcu_inkernel_boot_has_ended()) {
- schedule_timeout_interruptible(HZ / 10);
+ torture_hrtimeout_jiffies(HZ / 10, &rand);
continue;
}
cpu = (torture_random(&rand) >> 4) % (maxcpu + 1);
@@ -372,7 +372,7 @@ torture_onoff(void *arg)
torture_online(cpu,
&n_online_attempts, &n_online_successes,
&sum_online, &min_online, &max_online);
- schedule_timeout_interruptible(onoff_interval);
+ torture_hrtimeout_jiffies(onoff_interval, &rand);
}
stop:
--
2.40.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PATCH rcu 6/9] torture: Move torture_shuffle() timeouts to hrtimers
2023-07-17 18:20 [PATCH rcu 0/9] Torture-test updates for v6.6 Paul E. McKenney
` (4 preceding siblings ...)
2023-07-17 18:20 ` [PATCH rcu 5/9] torture: Move torture_onoff() timeouts to hrtimers Paul E. McKenney
@ 2023-07-17 18:20 ` Paul E. McKenney
2023-07-17 18:20 ` [PATCH rcu 7/9] torture: Move stutter_wait() " Paul E. McKenney
` (2 subsequent siblings)
8 siblings, 0 replies; 17+ messages in thread
From: Paul E. McKenney @ 2023-07-17 18:20 UTC (permalink / raw)
To: rcu; +Cc: linux-kernel, kernel-team, rostedt, Paul E. McKenney
In order to gain better race coverage, move the CPU-migration timed
waits in torture_shuffle() to torture_hrtimeout_jiffies().
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
kernel/torture.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/kernel/torture.c b/kernel/torture.c
index fc873116a399..3ab4930b9fdb 100644
--- a/kernel/torture.c
+++ b/kernel/torture.c
@@ -560,9 +560,11 @@ static void torture_shuffle_tasks(void)
*/
static int torture_shuffle(void *arg)
{
+ DEFINE_TORTURE_RANDOM(rand);
+
VERBOSE_TOROUT_STRING("torture_shuffle task started");
do {
- schedule_timeout_interruptible(shuffle_interval);
+ torture_hrtimeout_jiffies(shuffle_interval, &rand);
torture_shuffle_tasks();
torture_shutdown_absorb("torture_shuffle");
} while (!torture_must_stop());
--
2.40.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PATCH rcu 7/9] torture: Move stutter_wait() timeouts to hrtimers
2023-07-17 18:20 [PATCH rcu 0/9] Torture-test updates for v6.6 Paul E. McKenney
` (5 preceding siblings ...)
2023-07-17 18:20 ` [PATCH rcu 6/9] torture: Move torture_shuffle() " Paul E. McKenney
@ 2023-07-17 18:20 ` Paul E. McKenney
2023-07-17 18:20 ` [PATCH rcu 8/9] torture: Stop right-shifting torture_random() return values Paul E. McKenney
2023-07-17 18:20 ` [PATCH rcu 9/9] rcutorture: " Paul E. McKenney
8 siblings, 0 replies; 17+ messages in thread
From: Paul E. McKenney @ 2023-07-17 18:20 UTC (permalink / raw)
To: rcu; +Cc: linux-kernel, kernel-team, rostedt, Paul E. McKenney
In order to gain better race coverage, move the test start/stop
waits in stutter_wait() to torture_hrtimeout_jiffies().
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
kernel/torture.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/kernel/torture.c b/kernel/torture.c
index 3ab4930b9fdb..92704f04a141 100644
--- a/kernel/torture.c
+++ b/kernel/torture.c
@@ -745,7 +745,7 @@ bool stutter_wait(const char *title)
ret = true;
}
if (spt == 1) {
- schedule_timeout_interruptible(1);
+ torture_hrtimeout_jiffies(1, NULL);
} else if (spt == 2) {
while (READ_ONCE(stutter_pause_test)) {
if (!(i++ & 0xffff))
@@ -753,7 +753,7 @@ bool stutter_wait(const char *title)
cond_resched();
}
} else {
- schedule_timeout_interruptible(round_jiffies_relative(HZ));
+ torture_hrtimeout_jiffies(round_jiffies_relative(HZ), NULL);
}
torture_shutdown_absorb(title);
}
--
2.40.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PATCH rcu 8/9] torture: Stop right-shifting torture_random() return values
2023-07-17 18:20 [PATCH rcu 0/9] Torture-test updates for v6.6 Paul E. McKenney
` (6 preceding siblings ...)
2023-07-17 18:20 ` [PATCH rcu 7/9] torture: Move stutter_wait() " Paul E. McKenney
@ 2023-07-17 18:20 ` Paul E. McKenney
2023-07-17 18:20 ` [PATCH rcu 9/9] rcutorture: " Paul E. McKenney
8 siblings, 0 replies; 17+ messages in thread
From: Paul E. McKenney @ 2023-07-17 18:20 UTC (permalink / raw)
To: rcu; +Cc: linux-kernel, kernel-team, rostedt, Paul E. McKenney
Now that torture_random() uses swahw32(), its callers no longer see
not-so-random low-order bits, as these are now swapped up into the upper
16 bits of the torture_random() function's return value. This commit
therefore removes the right-shifting of torture_random() return values.
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
kernel/torture.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/kernel/torture.c b/kernel/torture.c
index 92704f04a141..b59eb6048eab 100644
--- a/kernel/torture.c
+++ b/kernel/torture.c
@@ -95,7 +95,7 @@ int torture_hrtimeout_ns(ktime_t baset_ns, u32 fuzzt_ns, struct torture_random_s
ktime_t hto = baset_ns;
if (trsp)
- hto += (torture_random(trsp) >> 3) % fuzzt_ns;
+ hto += torture_random(trsp) % fuzzt_ns;
set_current_state(TASK_IDLE);
return schedule_hrtimeout(&hto, HRTIMER_MODE_REL);
}
@@ -365,7 +365,7 @@ torture_onoff(void *arg)
torture_hrtimeout_jiffies(HZ / 10, &rand);
continue;
}
- cpu = (torture_random(&rand) >> 4) % (maxcpu + 1);
+ cpu = torture_random(&rand) % (maxcpu + 1);
if (!torture_offline(cpu,
&n_offline_attempts, &n_offline_successes,
&sum_offline, &min_offline, &max_offline))
--
2.40.1
^ permalink raw reply related [flat|nested] 17+ messages in thread* [PATCH rcu 9/9] rcutorture: Stop right-shifting torture_random() return values
2023-07-17 18:20 [PATCH rcu 0/9] Torture-test updates for v6.6 Paul E. McKenney
` (7 preceding siblings ...)
2023-07-17 18:20 ` [PATCH rcu 8/9] torture: Stop right-shifting torture_random() return values Paul E. McKenney
@ 2023-07-17 18:20 ` Paul E. McKenney
8 siblings, 0 replies; 17+ messages in thread
From: Paul E. McKenney @ 2023-07-17 18:20 UTC (permalink / raw)
To: rcu; +Cc: linux-kernel, kernel-team, rostedt, Paul E. McKenney
Now that torture_random() uses swahw32(), its callers no longer see
not-so-random low-order bits, as these are now swapped up into the upper
16 bits of the torture_random() function's return value. This commit
therefore removes the right-shifting of torture_random() return values.
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
kernel/rcu/rcutorture.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/kernel/rcu/rcutorture.c b/kernel/rcu/rcutorture.c
index d291a1438c30..ade42d6a9d9b 100644
--- a/kernel/rcu/rcutorture.c
+++ b/kernel/rcu/rcutorture.c
@@ -1877,7 +1877,7 @@ static int
rcutorture_extend_mask(int oldmask, struct torture_random_state *trsp)
{
int mask = rcutorture_extend_mask_max();
- unsigned long randmask1 = torture_random(trsp) >> 8;
+ unsigned long randmask1 = torture_random(trsp);
unsigned long randmask2 = randmask1 >> 3;
unsigned long preempts = RCUTORTURE_RDR_PREEMPT | RCUTORTURE_RDR_SCHED;
unsigned long preempts_irq = preempts | RCUTORTURE_RDR_IRQ;
@@ -1936,7 +1936,7 @@ rcutorture_loop_extend(int *readstate, struct torture_random_state *trsp,
if (!((mask - 1) & mask))
return rtrsp; /* Current RCU reader not extendable. */
/* Bias towards larger numbers of loops. */
- i = (torture_random(trsp) >> 3);
+ i = torture_random(trsp);
i = ((i | (i >> 3)) & RCUTORTURE_RDR_MAX_LOOPS) + 1;
for (j = 0; j < i; j++) {
mask = rcutorture_extend_mask(*readstate, trsp);
@@ -2137,7 +2137,7 @@ static int rcu_nocb_toggle(void *arg)
toggle_fuzz = NSEC_PER_USEC;
do {
r = torture_random(&rand);
- cpu = (r >> 4) % (maxcpu + 1);
+ cpu = (r >> 1) % (maxcpu + 1);
if (r & 0x1) {
rcu_nocb_cpu_offload(cpu);
atomic_long_inc(&n_nocb_offload);
--
2.40.1
^ permalink raw reply related [flat|nested] 17+ messages in thread