mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Daniel Lezcano <daniel.lezcano@linaro.org>
To: tglx@linutronix.de
Cc: linux-kernel@vger.kernel.org,
	Alexey Brodkin <alexey.brodkin@synopsys.com>,
	Alexey Brodkin <abrodkin@synopsys.com>,
	Vineet Gupta <vgupta@synopsys.com>,
	stable@vger.kernel.org,
	linux-snps-arc@lists.infradead.org (open list:SYNOPSYS ARC
	ARCHITECTURE)
Subject: [PATCH 12/25] clocksource/drivers/arc_timer: Utilize generic sched_clock
Date: Tue, 18 Dec 2018 22:28:30 +0100	[thread overview]
Message-ID: <20181218212844.30445-12-daniel.lezcano@linaro.org> (raw)
In-Reply-To: <20181218212844.30445-1-daniel.lezcano@linaro.org>

From: Alexey Brodkin <alexey.brodkin@synopsys.com>

It turned out we used to use default implementation of sched_clock()
from kernel/sched/clock.c which was as precise as 1/HZ, i.e.
by default we had 10 msec granularity of time measurement.

Now given ARC built-in timers are clocked with the same frequency as
CPU cores we may get much higher precision of time tracking.

Thus we switch to generic sched_clock which really reads ARC hardware
counters.

This is especially helpful for measuring short events.
That's what we used to have:
------------------------------>8------------------------
$ perf stat /bin/sh -c /root/lmbench-master/bin/arc/hello > /dev/null

 Performance counter stats for '/bin/sh -c /root/lmbench-master/bin/arc/hello':

         10.000000      task-clock (msec)         #    2.832 CPUs utilized
                 1      context-switches          #    0.100 K/sec
                 1      cpu-migrations            #    0.100 K/sec
                63      page-faults               #    0.006 M/sec
           3049480      cycles                    #    0.305 GHz
           1091259      instructions              #    0.36  insn per cycle
            256828      branches                  #   25.683 M/sec
             27026      branch-misses             #   10.52% of all branches

       0.003530687 seconds time elapsed

       0.000000000 seconds user
       0.010000000 seconds sys
------------------------------>8------------------------

And now we'll see:
------------------------------>8------------------------
$ perf stat /bin/sh -c /root/lmbench-master/bin/arc/hello > /dev/null

 Performance counter stats for '/bin/sh -c /root/lmbench-master/bin/arc/hello':

          3.004322      task-clock (msec)         #    0.865 CPUs utilized
                 1      context-switches          #    0.333 K/sec
                 1      cpu-migrations            #    0.333 K/sec
                63      page-faults               #    0.021 M/sec
           2986734      cycles                    #    0.994 GHz
           1087466      instructions              #    0.36  insn per cycle
            255209      branches                  #   84.947 M/sec
             26002      branch-misses             #   10.19% of all branches

       0.003474829 seconds time elapsed

       0.003519000 seconds user
       0.000000000 seconds sys
------------------------------>8------------------------

Note how much more meaningful is the second output - time spent for
execution pretty much matches number of cycles spent (we're runnign
@ 1GHz here).

Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
Cc: Vineet Gupta <vgupta@synopsys.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: stable@vger.kernel.org
Acked-by: Vineet Gupta <vgupta@synopsys.com>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 arch/arc/Kconfig                |  1 +
 drivers/clocksource/Kconfig     |  1 +
 drivers/clocksource/arc_timer.c | 22 ++++++++++++++++++++++
 3 files changed, 24 insertions(+)

diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig
index c9e2a1323536..74b5a654f664 100644
--- a/arch/arc/Kconfig
+++ b/arch/arc/Kconfig
@@ -26,6 +26,7 @@ config ARC
 	select GENERIC_IRQ_SHOW
 	select GENERIC_PCI_IOMAP
 	select GENERIC_PENDING_IRQ if SMP
+	select GENERIC_SCHED_CLOCK
 	select GENERIC_SMP_IDLE_THREAD
 	select HAVE_ARCH_KGDB
 	select HAVE_ARCH_TRACEHOOK
diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
index 8761a1c21b6c..c57b156f49a2 100644
--- a/drivers/clocksource/Kconfig
+++ b/drivers/clocksource/Kconfig
@@ -277,6 +277,7 @@ config CLKSRC_MPS2
 
 config ARC_TIMERS
 	bool "Support for 32-bit TIMERn counters in ARC Cores" if COMPILE_TEST
+	depends on GENERIC_SCHED_CLOCK
 	select TIMER_OF
 	help
 	  These are legacy 32-bit TIMER0 and TIMER1 counters found on all ARC cores
diff --git a/drivers/clocksource/arc_timer.c b/drivers/clocksource/arc_timer.c
index 20da9b1d7f7d..b28970ca4a7a 100644
--- a/drivers/clocksource/arc_timer.c
+++ b/drivers/clocksource/arc_timer.c
@@ -23,6 +23,7 @@
 #include <linux/cpu.h>
 #include <linux/of.h>
 #include <linux/of_irq.h>
+#include <linux/sched_clock.h>
 
 #include <soc/arc/timers.h>
 #include <soc/arc/mcip.h>
@@ -88,6 +89,11 @@ static u64 arc_read_gfrc(struct clocksource *cs)
 	return (((u64)h) << 32) | l;
 }
 
+static notrace u64 arc_gfrc_clock_read(void)
+{
+	return arc_read_gfrc(NULL);
+}
+
 static struct clocksource arc_counter_gfrc = {
 	.name   = "ARConnect GFRC",
 	.rating = 400,
@@ -111,6 +117,8 @@ static int __init arc_cs_setup_gfrc(struct device_node *node)
 	if (ret)
 		return ret;
 
+	sched_clock_register(arc_gfrc_clock_read, 64, arc_timer_freq);
+
 	return clocksource_register_hz(&arc_counter_gfrc, arc_timer_freq);
 }
 TIMER_OF_DECLARE(arc_gfrc, "snps,archs-timer-gfrc", arc_cs_setup_gfrc);
@@ -139,6 +147,11 @@ static u64 arc_read_rtc(struct clocksource *cs)
 	return (((u64)h) << 32) | l;
 }
 
+static notrace u64 arc_rtc_clock_read(void)
+{
+	return arc_read_rtc(NULL);
+}
+
 static struct clocksource arc_counter_rtc = {
 	.name   = "ARCv2 RTC",
 	.rating = 350,
@@ -170,6 +183,8 @@ static int __init arc_cs_setup_rtc(struct device_node *node)
 
 	write_aux_reg(AUX_RTC_CTRL, 1);
 
+	sched_clock_register(arc_rtc_clock_read, 64, arc_timer_freq);
+
 	return clocksource_register_hz(&arc_counter_rtc, arc_timer_freq);
 }
 TIMER_OF_DECLARE(arc_rtc, "snps,archs-timer-rtc", arc_cs_setup_rtc);
@@ -185,6 +200,11 @@ static u64 arc_read_timer1(struct clocksource *cs)
 	return (u64) read_aux_reg(ARC_REG_TIMER1_CNT);
 }
 
+static notrace u64 arc_timer1_clock_read(void)
+{
+	return arc_read_timer1(NULL);
+}
+
 static struct clocksource arc_counter_timer1 = {
 	.name   = "ARC Timer1",
 	.rating = 300,
@@ -209,6 +229,8 @@ static int __init arc_cs_setup_timer1(struct device_node *node)
 	write_aux_reg(ARC_REG_TIMER1_CNT, 0);
 	write_aux_reg(ARC_REG_TIMER1_CTRL, TIMER_CTRL_NH);
 
+	sched_clock_register(arc_timer1_clock_read, 32, arc_timer_freq);
+
 	return clocksource_register_hz(&arc_counter_timer1, arc_timer_freq);
 }
 
-- 
2.17.1


  parent reply	other threads:[~2018-12-18 21:29 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-18 21:27 [GIT PULL] timers for 4.21 Daniel Lezcano
2018-12-18 21:28 ` [PATCH 01/25] clocksource/drivers/timer-vt8500: Remove duplicate function name Daniel Lezcano
2018-12-18 21:28   ` [PATCH 02/25] clocksource/drivers/dbx500: Demote dbx500 PRCMU clocksource Daniel Lezcano
2018-12-18 21:28   ` [PATCH 03/25] clocksource/drivers/ux500: Drop Ux500 custom SCHED_CLOCK Daniel Lezcano
2018-12-18 21:28   ` [PATCH 04/25] clocksource/drivers/timer-ti-dm: Remove the early platform driver registration Daniel Lezcano
2018-12-18 21:28   ` [PATCH 05/25] clockevents/drivers/tegra20: Remove obsolete inclusion of <asm/smp_twd.h> Daniel Lezcano
2018-12-18 21:28   ` [PATCH 06/25] clocksource/drivers/meson6_timer: Use register names from the datasheet Daniel Lezcano
2018-12-18 21:28   ` [PATCH 07/25] clocksource/drivers/meson6_timer: Implement the ARM delay timer Daniel Lezcano
2018-12-18 21:28   ` [PATCH 08/25] clocksource/drivers/imx-gpt: Add support for ARM64 Daniel Lezcano
2018-12-18 21:28   ` [PATCH 09/25] clocksource/drivers/imx-gpt: Remove unnecessary irq protection Daniel Lezcano
2018-12-18 21:28   ` [PATCH 10/25] dt-bindings: timer: renesas, cmt: Document r8a7796 CMT support Daniel Lezcano
2018-12-18 21:28   ` [PATCH 11/25] dt-bindings: timer: renesas, cmt: Document r8a77470 " Daniel Lezcano
2018-12-18 21:28   ` Daniel Lezcano [this message]
     [not found]     ` <20181219012457.EC02721871@mail.kernel.org>
2018-12-19  9:06       ` [PATCH 12/25] clocksource/drivers/arc_timer: Utilize generic sched_clock Alexey Brodkin
2018-12-18 21:28   ` [PATCH 13/25] clocksource/drivers/timer-imx-tpm: Convert the driver to timer-of Daniel Lezcano
2018-12-18 21:28   ` [PATCH 14/25] dt-bindings: timer: renesas, cmt: Document r8a774a1 CMT support Daniel Lezcano
2018-12-18 21:28   ` [PATCH 15/25] clocksource/drivers/bcm2835: Switch to SPDX identifier Daniel Lezcano
2018-12-18 21:28   ` [PATCH 16/25] clocksource/drivers/integrator-ap: Add missing of_node_put() Daniel Lezcano
2018-12-18 21:28   ` [PATCH 17/25] clocksource/drivers/fttmr010: Fix invalid interrupt register access Daniel Lezcano
2018-12-18 21:28   ` [PATCH 18/25] clocksource/drivers/timer-imx-tpm: Specify clock name for timer-of Daniel Lezcano
2018-12-18 21:28   ` [PATCH 19/25] clocksource/drivers/riscv_timer: Provide the sched_clock Daniel Lezcano
2018-12-18 21:28   ` [PATCH 20/25] clocksource/drivers/riscv: Change name riscv_timer to timer-riscv Daniel Lezcano
2018-12-18 21:28   ` [PATCH 21/25] clocksource/drivers/rockchip: Change name rockchip_timer to timer-rockchip Daniel Lezcano
2018-12-18 21:28   ` [PATCH 22/25] clocksource/drivers/tegra20: Change name tegra20_timer to timer-tegra20 Daniel Lezcano
2018-12-18 21:28   ` [PATCH 23/25] clocksource/drivers/sun4i: Change name sun4i_timer to timer-sun4i Daniel Lezcano
2018-12-18 21:28   ` [PATCH 24/25] clocksource/drivers/meson6: Change name meson6_timer timer-meson6 Daniel Lezcano
2018-12-18 21:28   ` [PATCH 25/25] clocksource/drivers/rda: Add clock driver for RDA8810PL SoC Daniel Lezcano

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=20181218212844.30445-12-daniel.lezcano@linaro.org \
    --to=daniel.lezcano@linaro.org \
    --cc=abrodkin@synopsys.com \
    --cc=alexey.brodkin@synopsys.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-snps-arc@lists.infradead.org \
    --cc=stable@vger.kernel.org \
    --cc=tglx@linutronix.de \
    --cc=vgupta@synopsys.com \
    /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

Powered by JetHome