From: Sergei Shtylyov <sshtylyov@ru.mvista.com>
To: Wu Zhangjin <wuzhangjin@gmail.com>
Cc: Ralf Baechle <ralf@linux-mips.org>, Ingo Molnar <mingo@elte.hu>,
Thomas Gleixner <tglx@linutronix.de>,
linux-mips@linux-mips.org, Michal Simek <monstr@monstr.eu>
Subject: Re: [PATCH v3] MIPS: Add a high resolution sched_clock() via cnt32_to_63().
Date: Sun, 22 Nov 2009 22:03:00 +0300 [thread overview]
Message-ID: <4B098AE4.6090804@ru.mvista.com> (raw)
In-Reply-To: <b08d39e76685878bc91d9de906d155f1daa1c985.1258894783.git.wuzhangjin@gmail.com>
Hello.
Wu Zhangjin wrote:
> From: Wu Zhangjin <wuzhangjin@gmail.com>
>
> (This v3 revision incorporates with the feedbacks from Ingo, Ralf and Sergei.)
>
> This patch adds a cnt32_to_63() and MIPS c0 count based sched_clock(),
> which provides high resolution. and also, one new kernel option
> (HR_SCHED_CLOCK) is added to enable/disable this sched_clock().
>
> Without it, the Ftrace for MIPS will give useless timestamp information.
>
> Because cnt32_to_63() needs to be called at least once per half period
> to work properly, Differ from the old version, this v2 revision set up a
> kernel timer to ensure the requirement of some MIPSs which have short c0
> count period.
>
> Signed-off-by: Wu Zhangjin <wuzhangjin@gmail.com>
> ---
> arch/mips/Kconfig | 18 ++++++++++++++
> arch/mips/kernel/csrc-r4k.c | 55 +++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 73 insertions(+), 0 deletions(-)
>
> diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
> index b342197..5ea55f5 100644
> --- a/arch/mips/Kconfig
> +++ b/arch/mips/Kconfig
> @@ -1952,6 +1952,24 @@ config NR_CPUS
> source "kernel/time/Kconfig"
>
> #
> +# High Resolution sched_clock() Configuration
> +#
> +
> +config HR_SCHED_CLOCK
> + bool "High Resolution sched_clock()"
> + depends on CSRC_R4K
> + default n
> + help
> + This option enables the MIPS c0 count based high resolution
> + sched_clock().
> +
> + If you need a ns precision timestamp, you are recommended to enable
> + this option. For example, If you are using the Ftrace subsystem to do
> + real time tracing, this option is needed.
> +
> + If unsure, disable it.
> +
> +#
> # Timer Interrupt Frequency Configuration
> #
>
> diff --git a/arch/mips/kernel/csrc-r4k.c b/arch/mips/kernel/csrc-r4k.c
> index e95a3cd..e287f0d 100644
> --- a/arch/mips/kernel/csrc-r4k.c
> +++ b/arch/mips/kernel/csrc-r4k.c
> @@ -10,6 +10,57 @@
>
> #include <asm/time.h>
>
> +#ifdef CONFIG_HR_SCHED_CLOCK
> +#include <linux/cnt32_to_63.h>
> +#include <linux/timer.h>
> +
> +/*
> + * MIPS sched_clock implementation.
> + *
> + * because cnt32_to_63() needs to be called at least once per half period to
> + * work properly, and some of the MIPS frequency is high, perhaps a kernel
> + * timer is needed to be set up to ensure this requirement is always met.
> + * Please refer to arch/arm/plat-orion/time.c and include/linux/cnt32_to_63.h
> + */
> +static unsigned long __read_mostly tclk2ns_scale;
> +static unsigned long __read_mostly tclk2ns_scale_factor;
> +
> +unsigned long long notrace sched_clock(void)
> +{
> + unsigned long long v = cnt32_to_63(read_c0_count());
> + return (v * tclk2ns_scale) >> tclk2ns_scale_factor;
> +}
> +
> +static struct timer_list cnt32_to_63_keepwarm_timer;
> +
> +static void cnt32_to_63_keepwarm(unsigned long data)
> +{
> + mod_timer(&cnt32_to_63_keepwarm_timer, round_jiffies(jiffies + data));
> + (void) sched_clock();
> +}
> +
> +static void __init setup_sched_clock(struct clocksource *cs, unsigned long tclk)
> +{
> + unsigned long long v;
> + unsigned long data;
> +
> + v = cs->mult;
> + /*
> + * We want an even value to automatically clear the top bit
> + * returned by cnt32_to_63() without an additional run time
> + * instruction. So if the LSB is 1 then round it up.
> + */
> + if (v & 1)
> + v++;
> + tclk2ns_scale = v;
> + tclk2ns_scale_factor = cs->shift;
> +
> + data = 0x80000000 / tclk * HZ;
> + setup_timer(&cnt32_to_63_keepwarm_timer, cnt32_to_63_keepwarm, data);
> + mod_timer(&cnt32_to_63_keepwarm_timer, round_jiffies(jiffies + data));
> +}
> +#endif /* !CONFIG_HR_SCHED_CLOCK */
> +
> static cycle_t c0_hpt_read(struct clocksource *cs)
> {
> return read_c0_count();
> @@ -32,6 +83,10 @@ int __init init_r4k_clocksource(void)
>
> clocksource_set_clock(&clocksource_mips, mips_hpt_frequency);
>
> +#ifdef CONFIG_HR_SCHED_CLOCK
> + setup_sched_clock(&clocksource_mips, mips_hpt_frequency);
> +#endif
> +
>
According to CodingStyle #ifdef's in the code are frowned upon. I
suggest that you add an empty setup_sched_clock() definition under #else
above and have the call here without #ifdef. That's the preferred way of
doing such things...
WBR, Sergei
next prev parent reply other threads:[~2009-11-22 19:03 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-11-22 13:04 [PATCH v3] MIPS: Add a high resolution sched_clock() via cnt32_to_63() Wu Zhangjin
2009-11-22 19:03 ` Sergei Shtylyov [this message]
2009-11-23 1:00 ` Wu Zhangjin
2009-11-23 8:44 ` Ingo Molnar
2009-11-23 9:00 ` Wu Zhangjin
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=4B098AE4.6090804@ru.mvista.com \
--to=sshtylyov@ru.mvista.com \
--cc=linux-mips@linux-mips.org \
--cc=mingo@elte.hu \
--cc=monstr@monstr.eu \
--cc=ralf@linux-mips.org \
--cc=tglx@linutronix.de \
--cc=wuzhangjin@gmail.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.