From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Davidlohr Bueso <dave@stgolabs.net>
Cc: peterz@infradead.org, mingo@kernel.org,
linux-kernel@vger.kernel.org, dbueso@suse.de
Subject: Re: [PATCH 8/9] locktorture: Support rwsems
Date: Fri, 12 Sep 2014 11:07:54 -0700 [thread overview]
Message-ID: <20140912180754.GG4775@linux.vnet.ibm.com> (raw)
In-Reply-To: <1410496890.2166.11.camel@linux-t7sj.site>
On Thu, Sep 11, 2014 at 09:41:30PM -0700, Davidlohr Bueso wrote:
> We can easily do so with our new reader lock support. Just an arbitrary
> design default: readers have higher (5x) critical region latencies than
> writers: 50 ms and 10 ms, respectively.
Except in the massive contention case, where the writers get longer
delays than the readers, correct?
I again am guessing that you are relying on stutter intervals to allow
the locks to be in any state other than massively contended.
And patch to add this to the default set run by the scripts below.
> Signed-off-by: Davidlohr Bueso <dbueso@suse.de>
> ---
> Documentation/locking/locktorture.txt | 2 ++
> kernel/locking/locktorture.c | 68 ++++++++++++++++++++++++++++++++++-
> 2 files changed, 69 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/locking/locktorture.txt b/Documentation/locking/locktorture.txt
> index 1bdeb71..f7d99e2 100644
> --- a/Documentation/locking/locktorture.txt
> +++ b/Documentation/locking/locktorture.txt
> @@ -47,6 +47,8 @@ torture_type Type of lock to torture. By default, only spinlocks will
>
> o "mutex_lock": mutex_lock() and mutex_unlock() pairs.
>
> + o "rwsem_lock": read/write down() and up() semaphore pairs.
> +
> torture_runnable Start locktorture at module init. By default it will begin
> once the module is loaded.
>
> diff --git a/kernel/locking/locktorture.c b/kernel/locking/locktorture.c
> index c1073d7..8480118 100644
> --- a/kernel/locking/locktorture.c
> +++ b/kernel/locking/locktorture.c
> @@ -265,6 +265,71 @@ static struct lock_torture_ops mutex_lock_ops = {
> .name = "mutex_lock"
> };
>
> +static DECLARE_RWSEM(torture_rwsem);
> +static int torture_rwsem_down_write(void) __acquires(torture_rwsem)
> +{
> + down_write(&torture_rwsem);
> + return 0;
> +}
> +
> +static void torture_rwsem_write_delay(struct torture_random_state *trsp)
> +{
> + const unsigned long longdelay_ms = 100;
> +
> + /* We want a long delay occasionally to force massive contention. */
> + if (!(torture_random(trsp) %
> + (nrealwriters_stress * 2000 * longdelay_ms)))
> + mdelay(longdelay_ms * 10);
> + else
> + mdelay(longdelay_ms / 10);
> +#ifdef CONFIG_PREEMPT
> + if (!(torture_random(trsp) % (nrealwriters_stress * 20000)))
> + preempt_schedule(); /* Allow test to be preempted. */
> +#endif
> +}
> +
> +static void torture_rwsem_up_write(void) __releases(torture_rwsem)
> +{
> + up_write(&torture_rwsem);
> +}
> +
> +static int torture_rwsem_down_read(void) __acquires(torture_rwsem)
> +{
> + down_read(&torture_rwsem);
> + return 0;
> +}
> +
> +static void torture_rwsem_read_delay(struct torture_random_state *trsp)
> +{
> + const unsigned long longdelay_ms = 100;
> +
> + /* We want a long delay occasionally to force massive contention. */
> + if (!(torture_random(trsp) %
> + (nrealwriters_stress * 2000 * longdelay_ms)))
> + mdelay(longdelay_ms * 2);
> + else
> + mdelay(longdelay_ms / 2);
> +#ifdef CONFIG_PREEMPT
> + if (!(torture_random(trsp) % (nrealreaders_stress * 20000)))
> + preempt_schedule(); /* Allow test to be preempted. */
> +#endif
> +}
> +
> +static void torture_rwsem_up_read(void) __releases(torture_rwsem)
> +{
> + up_read(&torture_rwsem);
> +}
> +
> +static struct lock_torture_ops rwsem_lock_ops = {
> + .writelock = torture_rwsem_down_write,
> + .write_delay = torture_rwsem_write_delay,
> + .writeunlock = torture_rwsem_up_write,
> + .readlock = torture_rwsem_down_read,
> + .read_delay = torture_rwsem_read_delay,
> + .readunlock = torture_rwsem_up_read,
> + .name = "rwsem_lock"
> +};
> +
> /*
> * Lock torture writer kthread. Repeatedly acquires and releases
> * the lock, checking for duplicate acquisitions.
> @@ -467,7 +532,8 @@ static int __init lock_torture_init(void)
> int i, j;
> int firsterr = 0;
> static struct lock_torture_ops *torture_ops[] = {
> - &lock_busted_ops, &spin_lock_ops, &spin_lock_irq_ops, &mutex_lock_ops,
> + &lock_busted_ops, &spin_lock_ops, &spin_lock_irq_ops,
> + &mutex_lock_ops, &rwsem_lock_ops,
> };
>
> if (!torture_init_begin(torture_type, verbose, &torture_runnable))
> --
> 1.8.4.5
------------------------------------------------------------------------
locktorture: Add test scenario for rwsem_lock
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
diff --git a/tools/testing/selftests/rcutorture/configs/lock/CFLIST b/tools/testing/selftests/rcutorture/configs/lock/CFLIST
index 901bafde4588..6108137da770 100644
--- a/tools/testing/selftests/rcutorture/configs/lock/CFLIST
+++ b/tools/testing/selftests/rcutorture/configs/lock/CFLIST
@@ -1,2 +1,3 @@
LOCK01
LOCK02
+LOCK03
diff --git a/tools/testing/selftests/rcutorture/configs/lock/LOCK03 b/tools/testing/selftests/rcutorture/configs/lock/LOCK03
new file mode 100644
index 000000000000..1d1da1477fc3
--- /dev/null
+++ b/tools/testing/selftests/rcutorture/configs/lock/LOCK03
@@ -0,0 +1,6 @@
+CONFIG_SMP=y
+CONFIG_NR_CPUS=4
+CONFIG_HOTPLUG_CPU=y
+CONFIG_PREEMPT_NONE=n
+CONFIG_PREEMPT_VOLUNTARY=n
+CONFIG_PREEMPT=y
diff --git a/tools/testing/selftests/rcutorture/configs/lock/LOCK03.boot b/tools/testing/selftests/rcutorture/configs/lock/LOCK03.boot
new file mode 100644
index 000000000000..a67bbe0245c9
--- /dev/null
+++ b/tools/testing/selftests/rcutorture/configs/lock/LOCK03.boot
@@ -0,0 +1 @@
+locktorture.torture_type=rwsem_lock
next prev parent reply other threads:[~2014-09-12 18:08 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-12 3:40 [PATCH -tip 0/9] locktorture: Improve and expand lock torturing Davidlohr Bueso
2014-09-12 3:40 ` [PATCH 1/9] locktorture: Rename locktorture_runnable parameter Davidlohr Bueso
2014-09-12 17:40 ` Paul E. McKenney
2014-09-12 17:51 ` Paul E. McKenney
2014-09-12 3:40 ` [PATCH 2/9] locktorture: Add documentation Davidlohr Bueso
2014-09-12 5:28 ` Davidlohr Bueso
2014-09-13 1:10 ` Randy Dunlap
2014-09-16 19:35 ` Paul E. McKenney
2014-09-12 3:40 ` [PATCH 3/9] locktorture: Support mutexes Davidlohr Bueso
2014-09-12 18:02 ` Paul E. McKenney
2014-09-12 18:56 ` Davidlohr Bueso
2014-09-12 19:12 ` Paul E. McKenney
2014-09-13 2:13 ` Davidlohr Bueso
2014-09-12 3:40 ` [PATCH 4/9] locktorture: Teach about lock debugging Davidlohr Bueso
2014-09-12 3:40 ` [PATCH 5/9] locktorture: Make statistics generic Davidlohr Bueso
2014-09-12 3:40 ` [PATCH 6/9] torture: Address race in module cleanup Davidlohr Bueso
2014-09-12 18:04 ` Paul E. McKenney
2014-09-12 18:28 ` Davidlohr Bueso
2014-09-12 19:03 ` Paul E. McKenney
2014-09-12 4:40 ` [PATCH 7/9] locktorture: Add infrastructure for torturing read locks Davidlohr Bueso
2014-09-12 16:06 ` Paul E. McKenney
2014-09-12 18:02 ` Davidlohr Bueso
2014-09-12 4:41 ` [PATCH 8/9] locktorture: Support rwsems Davidlohr Bueso
2014-09-12 7:37 ` Peter Zijlstra
2014-09-12 14:49 ` Davidlohr Bueso
2014-09-12 18:07 ` Paul E. McKenney [this message]
2014-09-12 4:42 ` [PATCH 9/9] locktorture: Introduce torture context Davidlohr Bueso
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140912180754.GG4775@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=dave@stgolabs.net \
--cc=dbueso@suse.de \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox