diff options
| author | Paul E. McKenney <paulmck@kernel.org> | 2021-05-03 17:04:57 -0700 |
|---|---|---|
| committer | Paul E. McKenney <paulmck@kernel.org> | 2021-05-10 16:47:17 -0700 |
| commit | 4b46fcb7f1a6a202e3f77ce377079b4243d1be6f (patch) | |
| tree | 673ee34049515ffa144c12af54b8a82f2f4ed412 | |
| parent | 0fafd0f8558cfa54ffc9e4536afe816ed4c555b3 (diff) | |
| download | linux-next-4b46fcb7f1a6a202e3f77ce377079b4243d1be6f.tar.gz | |
refscale: Add measurement of clock readout
Notice: this object is not reachable from any branch.
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>
Notice: this object is not reachable from any branch.
| -rw-r--r-- | kernel/rcu/refscale.c | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/kernel/rcu/refscale.c b/kernel/rcu/refscale.c index 313d4547cbc7b..20e892b2502ca 100644 --- a/kernel/rcu/refscale.c +++ b/kernel/rcu/refscale.c @@ -467,6 +467,41 @@ static struct ref_scale_ops acqrel_ops = { .name = "acqrel" }; +static volatile u64 stopopts; + +static void ref_clock_section(const int nloops) +{ + u64 x; + int i; + + preempt_disable(); + for (i = nloops; i >= 0; i--) { + x += ktime_get_real_fast_ns(); + } + preempt_enable(); + stopopts = x; +} + +static void ref_clock_delay_section(const int nloops, const int udl, const int ndl) +{ + u64 x; + int i; + + preempt_disable(); + for (i = nloops; i >= 0; i--) { + x += ktime_get_real_fast_ns(); + un_delay(udl, ndl); + } + preempt_enable(); + stopopts = x; +} + +static struct ref_scale_ops clock_ops = { + .readsection = ref_clock_section, + .delaysection = ref_clock_delay_section, + .name = "clock" +}; + static void rcu_scale_one_reader(void) { if (readdelay <= 0) @@ -759,7 +794,7 @@ ref_scale_init(void) int firsterr = 0; static struct ref_scale_ops *scale_ops[] = { &rcu_ops, &srcu_ops, &rcu_trace_ops, &rcu_tasks_ops, &refcnt_ops, &rwlock_ops, - &rwsem_ops, &lock_ops, &lock_irq_ops, &acqrel_ops, + &rwsem_ops, &lock_ops, &lock_irq_ops, &acqrel_ops, &clock_ops, }; if (!torture_init_begin(scale_type, verbose)) |
