Commit Graph

25 Commits

Author SHA1 Message Date
Waiman Long f0b3881028 refscale: Print out additional module parameters
JIRA: https://issues.redhat.com/browse/RHEL-34076

commit d6fea1dde2064c8f298dbe872587c7ace7701b3f
Author: Paul E. McKenney <paulmck@kernel.org>
Date:   Wed, 16 Aug 2023 11:27:26 -0700

    refscale: Print out additional module parameters

    The refscale.verbose_batched and refscale.lookup_instances module
    parameters are omitted from the ref_scale_print_module_parms()
    beginning-of-test output.  This commit therefore adds them.

    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    Signed-off-by: Frederic Weisbecker <frederic@kernel.org>

Signed-off-by: Waiman Long <longman@redhat.com>
2024-05-31 10:56:17 -04:00
Waiman Long 2018d3ea93 refscale: Fix misplaced data re-read
JIRA: https://issues.redhat.com/browse/RHEL-34076

commit 730c3ed4ba30feadfb20b4d4d18e869bc00348f6
Author: Paul E. McKenney <paulmck@kernel.org>
Date:   Tue, 1 Aug 2023 09:30:18 -0700

    refscale: Fix misplaced data re-read

    This commit fixes a misplaced data re-read in the typesafe code.
    The reason that this was not noticed is that this is a performance test
    with no writers, so a mismatch could not occur.

    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    Signed-off-by: Frederic Weisbecker <frederic@kernel.org>

Signed-off-by: Waiman Long <longman@redhat.com>
2024-05-31 10:56:17 -04:00
Waiman Long e729e7e50c refscale: Add a "jiffies" test
JIRA: https://issues.redhat.com/browse/RHEL-34076

commit b5a2801fc05350b3b81e6fdcefddd6cfdbf8b238
Author: Paul E. McKenney <paulmck@kernel.org>
Date:   Tue, 11 Jul 2023 18:01:38 -0700

    refscale: Add a "jiffies" test

    This commit adds a "jiffies" test to refscale, allowing use of jiffies
    to be compared to ktime_get_real_fast_ns().  On my x86 laptop, jiffies
    is more than 20x faster.  (Though for many uses, the tens-of-nanoseconds
    overhead of ktime_get_real_fast_ns() will be just fine.)

    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>

Signed-off-by: Waiman Long <longman@redhat.com>
2024-05-31 10:56:15 -04:00
Scott Weaver c007b2ed95 Merge: rcu: Backport upstream RCU commits up to v6.4
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/3099

JIRA: https://issues.redhat.com/browse/RHEL-5228
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/3099
Omitted-fix: 4d09caec2fab ("arm64: kcsan: Support detecting more missing memory barriers")

This MR backports upstream RCU commits up to v6.1 with related fixes,
if applicable. It also includes a number of KCSAN commits which provide
helpers and APIs that may be referenced by commits from other subsystems.

Signed-off-by: Waiman Long <longman@redhat.com>

Approved-by: Prarit Bhargava <prarit@redhat.com>
Approved-by: David Arcari <darcari@redhat.com>

Signed-off-by: Scott Weaver <scweaver@redhat.com>
2023-10-17 09:01:45 -04:00
Waiman Long 7d24a01bfb refscale: Move shutdown from wait_event() to wait_event_idle()
JIRA: https://issues.redhat.com/browse/RHEL-5228

commit 6bc6e6b27524304aadb9c04611ddb1c84dd7617a
Author: Paul E. McKenney <paulmck@kernel.org>
Date:   Tue, 31 Jan 2023 16:12:18 -0800

    refscale: Move shutdown from wait_event() to wait_event_idle()

    The ref_scale_shutdown() kthread/function uses wait_event() to wait for
    the refscale test to complete.  However, although the read-side tests
    are normally extremely fast, there is no law against specifying a very
    large value for the refscale.loops module parameter or against having
    a slow read-side primitive.  Either way, this might well trigger the
    hung-task timeout.

    This commit therefore replaces those wait_event() calls with calls to
    wait_event_idle(), which do not trigger the hung-task timeout.

    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
    Signed-off-by: Boqun Feng <boqun.feng@gmail.com>

Signed-off-by: Waiman Long <longman@redhat.com>
2023-09-22 13:21:45 -04:00
Waiman Long f2f132617e refscale: Add tests using SLAB_TYPESAFE_BY_RCU
JIRA: https://issues.redhat.com/browse/RHEL-5228

commit a6889becb05394255c80b62103677e3b095726a9
Author: Paul E. McKenney <paulmck@kernel.org>
Date:   Tue, 8 Nov 2022 08:18:06 -0800

    refscale: Add tests using SLAB_TYPESAFE_BY_RCU

    This commit adds three read-side-only tests of three use cases featuring
    SLAB_TYPESAFE_BY_RCU: One using per-object reference counting, one using
    per-object locking, and one using per-object sequence locking.

    [ paulmck: Apply feedback from kernel test robot. ]

    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>

Signed-off-by: Waiman Long <longman@redhat.com>
2023-09-22 13:21:36 -04:00
Waiman Long 354b086b1c refscale: Provide for initialization failure
JIRA: https://issues.redhat.com/browse/RHEL-5228

commit 3c6496c86e484be94cd8d69e604566dfeaa726a2
Author: Paul E. McKenney <paulmck@kernel.org>
Date:   Sun, 6 Nov 2022 20:58:15 -0800

    refscale: Provide for initialization failure

    Current tests all have init() functions that are guaranteed to succeed.
    But upcoming tests will need to allocate memory, thus possibly failing.
    This commit therefore handles init() function failure.

    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>

Signed-off-by: Waiman Long <longman@redhat.com>
2023-09-22 13:21:35 -04:00
Waiman Long 951cae089b refscale: Fix uninitalized use of wait_queue_head_t
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2189183

commit f5063e8948dad7f31adb007284a5d5038ae31bb8
Author: Waiman Long <longman@redhat.com>
Date:   Fri, 7 Jul 2023 13:53:55 -0400

    refscale: Fix uninitalized use of wait_queue_head_t

    Running the refscale test occasionally crashes the kernel with the
    following error:

    [ 8569.952896] BUG: unable to handle page fault for address: ffffffffffffffe8
    [ 8569.952900] #PF: supervisor read access in kernel mode
    [ 8569.952902] #PF: error_code(0x0000) - not-present page
    [ 8569.952904] PGD c4b048067 P4D c4b049067 PUD c4b04b067 PMD 0
    [ 8569.952910] Oops: 0000 [#1] PREEMPT_RT SMP NOPTI
    [ 8569.952916] Hardware name: Dell Inc. PowerEdge R750/0WMWCR, BIOS 1.2.4 05/28/2021
    [ 8569.952917] RIP: 0010:prepare_to_wait_event+0x101/0x190
      :
    [ 8569.952940] Call Trace:
    [ 8569.952941]  <TASK>
    [ 8569.952944]  ref_scale_reader+0x380/0x4a0 [refscale]
    [ 8569.952959]  kthread+0x10e/0x130
    [ 8569.952966]  ret_from_fork+0x1f/0x30
    [ 8569.952973]  </TASK>

    The likely cause is that init_waitqueue_head() is called after the call to
    the torture_create_kthread() function that creates the ref_scale_reader
    kthread.  Although this init_waitqueue_head() call will very likely
    complete before this kthread is created and starts running, it is
    possible that the calling kthread will be delayed between the calls to
    torture_create_kthread() and init_waitqueue_head().  In this case, the
    new kthread will use the waitqueue head before it is properly initialized,
    which is not good for the kernel's health and well-being.

    The above crash happened here:

            static inline void __add_wait_queue(...)
            {
                    :
                    if (!(wq->flags & WQ_FLAG_PRIORITY)) <=== Crash here

    The offset of flags from list_head entry in wait_queue_entry is
    -0x18. If reader_tasks[i].wq.head.next is NULL as allocated reader_task
    structure is zero initialized, the instruction will try to access address
    0xffffffffffffffe8, which is exactly the fault address listed above.

    This commit therefore invokes init_waitqueue_head() before creating
    the kthread.

    Fixes: 653ed64b01 ("refperf: Add a test to measure performance of read-side synchronization")
    Signed-off-by: Waiman Long <longman@redhat.com>
    Reviewed-by: Qiuxu Zhuo <qiuxu.zhuo@intel.com>
    Reviewed-by: Davidlohr Bueso <dave@stgolabs.net>
    Acked-by: Joel Fernandes (Google) <joel@joelfernandes.org>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>

Signed-off-by: Waiman Long <longman@redhat.com>
2023-09-06 13:42:23 -04:00
Waiman Long ba39932d2a refscale: Convert test_lock spinlock to raw_spinlock
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2169516

commit 7bf336fb8dac718febb7bf4fe79e1be0c5e4a631
Author: Zqiang <qiang1.zhang@intel.com>
Date:   Sun, 12 Jun 2022 10:02:25 +0800

    refscale: Convert test_lock spinlock to raw_spinlock

    In kernels built with CONFIG_PREEMPT_RT=y, spinlocks are replaced by
    rt_mutex, which can sleep.  This means that acquiring a non-raw spinlock
    in a critical section where preemption is disabled can trigger the
    following BUG:

    BUG: scheduling while atomic: ref_scale_reade/76/0x00000002
    Preemption disabled at:
    ref_lock_section+0x16/0x80
    Call Trace:
    <TASK>
    dump_stack_lvl+0x5b/0x82
    dump_stack+0x10/0x12
    __schedule_bug.cold+0x9c/0xad
    __schedule+0x839/0xc00
    schedule_rtlock+0x22/0x40
    rtlock_slowlock_locked+0x460/0x1350
    rt_spin_lock+0x61/0xe0
    ref_lock_section+0x29/0x80
    rcu_scale_one_reader+0x52/0x60
    ref_scale_reader+0x28d/0x490
    kthread+0x128/0x150
    ret_from_fork+0x22/0x30
    </TASK>

    This commit therefore converts spinlock to raw_spinlock.

    Signed-off-by: Zqiang <qiang1.zhang@intel.com>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>

Signed-off-by: Waiman Long <longman@redhat.com>
2023-03-30 08:36:15 -04:00
Waiman Long 1268ada4f9 refscale: Allow refscale without RCU Tasks Rude/Trace
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2117491

commit dec86781a54f4a527386a0b86b22e99e2ac67a09
Author: Paul E. McKenney <paulmck@kernel.org>
Date:   Fri, 25 Mar 2022 15:21:07 -0700

    refscale: Allow refscale without RCU Tasks Rude/Trace

    Currently, a CONFIG_PREEMPT_NONE=y kernel substitutes normal RCU for
    RCU Tasks Rude and RCU Tasks Trace.  Unless that kernel builds refscale,
    whether built-in or as a module, in which case these RCU Tasks flavors are
    (unnecessarily) built in.  This both increases kernel size and increases
    the complexity of certain tracing operations.  This commit therefore
    decouples the presence of refscale from the presence of RCU Tasks Rude
    and RCU Tasks Trace.

    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>

Signed-off-by: Waiman Long <longman@redhat.com>
2022-08-30 17:22:17 -04:00
Waiman Long 34f1f8b147 refscale: Allow refscale without RCU Tasks
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2117491

commit 5f654af150fd5aeb9fff138c7cbd72cea016b863
Author: Paul E. McKenney <paulmck@kernel.org>
Date:   Fri, 25 Mar 2022 14:39:54 -0700

    refscale: Allow refscale without RCU Tasks

    Currently, a CONFIG_PREEMPT_NONE=y kernel substitutes normal RCU for
    RCU Tasks.  Unless that kernel builds refscale, whether built-in or as a
    module, in which case RCU Tasks is (unnecessarily) built in.  This both
    increases kernel size and increases the complexity of certain tracing
    operations.  This commit therefore decouples the presence of refscale
    from the presence of RCU Tasks.

    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>

Signed-off-by: Waiman Long <longman@redhat.com>
2022-08-30 17:22:17 -04:00
Waiman Long dfd93953ce refscale: Warn on individual ref_scale_init() error conditions
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2076713

commit ed60ad733aa49b70720c9d8dded1b18374ec5022
Author: Paul E. McKenney <paulmck@kernel.org>
Date:   Thu, 5 Aug 2021 15:57:12 -0700

    refscale: Warn on individual ref_scale_init() error conditions

    When running refscale as a module, any ref_scale_init() issues will be
    reflected in the error code from modprobe or insmod, as the case may be.
    However, these error codes are not available when running refscale
    built-in, for example, when using the kvm.sh script.  This commit
    therefore adds WARN_ON_ONCE() to allow distinguishing ref_scale_init()
    errors when running refscale built-in.

    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>

Signed-off-by: Waiman Long <longman@redhat.com>
2022-05-12 08:19:38 -04:00
Waiman Long fac89b34ab refscale: Add missing '\n' to flush message
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2065994

commit f71f22b67d37c91a5c4320f6e821f64eb189627d
Author: Li Zhijian <zhijianx.li@intel.com>
Date:   Fri, 29 Oct 2021 17:40:24 +0800

    refscale: Add missing '\n' to flush message

    Add '\n' to macros to flush message for each call.

    Acked-by: Davidlohr Bueso <dbueso@suse.de>
    Signed-off-by: Li Zhijian <zhijianx.li@intel.com>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>

Signed-off-by: Waiman Long <longman@redhat.com>
2022-03-24 17:16:07 -04:00
Waiman Long ae2ce8d851 refscale: Always log the error message
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2065994

commit 4feeb9d5f82229bf39621be755bda81521539476
Author: Li Zhijian <lizhijian@cn.fujitsu.com>
Date:   Mon, 25 Oct 2021 11:26:58 +0800

    refscale: Always log the error message

    An OOM is a serious error that should be logged even in non-verbose runs.
    This commit therefore adds an unconditional SCALEOUT_ERRSTRING() macro
    and uses it instead of VERBOSE_SCALEOUT_ERRSTRING() when reporting an OOM.

    [ paulmck: Drop do-while from SCALEOUT_ERRSTRING() due to only single statement. ]

    Signed-off-by: Li Zhijian <lizhijian@cn.fujitsu.com>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>

Signed-off-by: Waiman Long <longman@redhat.com>
2022-03-24 17:16:06 -04:00
Waiman Long 2f416cf616 refscale: Prevent buffer to pr_alert() being too long
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2065994

commit 9880eb878c315b241002d43d7ff89df23713a51b
Author: Li Zhijian <lizhijian@cn.fujitsu.com>
Date:   Mon, 25 Oct 2021 11:26:57 +0800

    refscale: Prevent buffer to pr_alert() being too long

    0Day/LKP observed that the refscale results fail to complete when larger
    values of nrun (such as 300) are specified.  The problem is that printk()
    can accept at most a 1024-byte buffer.  This commit therefore prints
    the buffer whenever its length exceeds 800 bytes.

    CC: Philip Li <philip.li@intel.com>
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Li Zhijian <lizhijian@cn.fujitsu.com>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>

Signed-off-by: Waiman Long <longman@redhat.com>
2022-03-24 17:16:05 -04:00
Waiman Long 213042d87d refscale: Simplify the errexit checkpoint
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2065994

commit c30c876312f66b0422a1d632b8c45b6416deeec0
Author: Li Zhijian <lizhijian@cn.fujitsu.com>
Date:   Mon, 25 Oct 2021 11:26:56 +0800

    refscale: Simplify the errexit checkpoint

    There is only the one OOM error case in main_func(), so this commit
    eliminates the errexit local variable in favor of a branch to cleanup
    code.

    Signed-off-by: Li Zhijian <lizhijian@cn.fujitsu.com>
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>

Signed-off-by: Waiman Long <longman@redhat.com>
2022-03-24 17:16:05 -04:00
Waiman Long ecc0bc26a7 refscale: Add measurement of clock readout
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2022806

commit 25f6fa53a07422e2bb004229eefd32760c469fb0
Author: Paul E. McKenney <paulmck@kernel.org>
Date:   Mon, 3 May 2021 17:04:57 -0700

    refscale: Add measurement of clock readout

    This commit adds a "clock" type to refscale, which checks the performance
    of ktime_get_real_fast_ns().  Use the "clocksource=" kernel boot parameter
    to select the underlying clock source.

    [ paulmck: Work around compiler false positive per kernel test robot. ]
    Signed-off-by: Paul E. McKenney <paulmck@kernel.org>

Signed-off-by: Waiman Long <longman@redhat.com>
2021-11-12 14:22:50 -05:00
Paul E. McKenney 05bc276cf2 refscale: Avoid false-positive warnings in ref_scale_reader()
If the call to set_cpus_allowed_ptr() in ref_scale_reader()
fails, a later WARN_ONCE() complains.  But with the advent of
570a752b7a ("lib/smp_processor_id: Use is_percpu_thread() instead of
nr_cpus_allowed"), this complaint can be drowned out by complaints from
smp_processor_id().  The rationale for this change is that refscale's
kthreads are not marked with PF_NO_SETAFFINITY, which means that a system
administrator could change affinity at any time.

However, refscale is a performance/stress test, and the system
administrator might well have a valid test-the-test reason for changing
affinity.  This commit therefore changes to raw_smp_processor_id()
in order to avoid the noise, and also adds a WARN_ON_ONCE() to the
call to set_cpus_allowed_ptr() in order to directly detect immediate
failure.  There is no WARN_ON_ONCE() within the test loop, allowing
human-reflex-based affinity resetting, if desired.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
2021-07-06 12:38:08 -07:00
Paul E. McKenney e9b800db96 refscale: Add acqrel, lock, and lock-irq
This commit adds scale_type of acqrel, lock, and lock-irq to
test acquisition and release.  Note that the refscale.nreaders=1
module parameter is required if you wish to test uncontended locking.
In contrast, acqrel uses a per-CPU variable, so should be just fine with
large values of the refscale.nreaders=1 module parameter.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
2021-05-10 16:05:05 -07:00
Paul E. McKenney 414c116e01 torture: Make refscale throttle high-rate printk()s
This commit adds a short delay for verbose_batched-throttled printk()s
to further decrease console flooding.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
2021-01-06 17:17:20 -08:00
Paul E. McKenney e76506f0e8 refscale: Allow summarization of verbose output
The refscale test prints enough per-kthread console output to provoke RCU
CPU stall warnings on large systems.  This commit therefore allows this
output to be summarized.  For example, the refscale.verbose_batched=32
boot parameter would causes only every 32nd line of output to be logged.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
2021-01-06 17:08:09 -08:00
Paul E. McKenney bc80d353b3 refscale: Prevent hangs for invalid arguments
If an refscale torture-test run is given a bad kvm.sh argument, the
test will complain to the console, which is good.  What is bad is that
from the user's perspective, it will just hang for the time specified
by the --duration argument.  This commit therefore forces an immediate
kernel shutdown if a ref_scale_init()-time error occurs, thus avoiding
the appearance of a hang.  It also forces a console splat in this case
to clearly indicate the presence of an error.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
2020-11-06 17:13:51 -08:00
Paul E. McKenney 0c6d18d84d refscale: Bounds-check module parameters
The default value for refscale.nreaders is -1, which results in the code
setting the value to three-quarters of the number of CPUs.  On single-CPU
systems, this results in three-quarters of the value one, which the C
language's integer arithmetic rounds to zero.  This in turn results in
a divide-by-zero error.

This commit therefore adds bounds checking to the refscale module
parameters, so that if they are less than one, they are set to the
value one.

Reported-by: kernel test robot <lkp@intel.com>
Tested-by "Chen, Rong A" <rong.a.chen@intel.com>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
2020-11-02 17:13:29 -08:00
Colin Ian King 58db5785b0 refperf: Avoid null pointer dereference when buf fails to allocate
Currently in the unlikely event that buf fails to be allocated it
is dereferenced a few times.  Use the errexit flag to determine if
buf should be written to to avoid the null pointer dereferences.

Addresses-Coverity: ("Dereference after null check")
Fixes: f518f154ec ("refperf: Dynamically allocate experiment-summary output buffer")
Signed-off-by: Colin Ian King <colin.king@canonical.com>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
2020-08-24 18:45:35 -07:00
Paul E. McKenney 1fbeb3a8c4 refperf: Rename refperf.c to refscale.c and change internal names
This commit further avoids conflation of refperf with the kernel's perf
feature by renaming kernel/rcu/refperf.c to kernel/rcu/refscale.c,
and also by similarly renaming the functions and variables inside
this file.  This has the side effect of changing the names of the
kernel boot parameters, so kernel-parameters.txt and ver_functions.sh
are also updated.

The rcutorture --torture type remains refperf, and this will be
addressed in a separate commit.

Reported-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
2020-06-29 12:00:46 -07:00