Re: [PATCH] x86: Export tsc related information in sysfs
From: Jaswinder Singh Rajput
Date: Sat May 15 2010 - 09:09:11 EST
Hello,
On Sat, May 15, 2010 at 7:10 AM, Venkatesh Pallipadi <venki@xxxxxxxxxx> wrote:
> From: Dan Magenheimer <dan.magenheimer@xxxxxxxxxx>
>
> Kernel information about calibrated value of tsc_khz and
> tsc_stability (result of tsc warp test) are useful bits of information
> for any app that wants to use TSC directly. Export this read_only
> information in sysfs.
>
> Signed-off-by: Venkatesh Pallipadi <venki@xxxxxxxxxx>
> Signed-off-by: Dan Magenheimer <dan.magenheimer@xxxxxxxxxx>
> ---
> arch/x86/kernel/tsc.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 76 insertions(+), 0 deletions(-)
>
> diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c
> index 9faf91a..24dd484 100644
> --- a/arch/x86/kernel/tsc.c
> +++ b/arch/x86/kernel/tsc.c
> @@ -10,6 +10,7 @@
> #include <linux/clocksource.h>
> #include <linux/percpu.h>
> #include <linux/timex.h>
> +#include <linux/sysdev.h>
>
> #include <asm/hpet.h>
> #include <asm/timer.h>
> @@ -857,6 +858,81 @@ static void __init init_tsc_clocksource(void)
> clocksource_register(&clocksource_tsc);
> }
>
> +#ifdef CONFIG_SYSFS
> +/*
> + * Export TSC related info to user land. This reflects kernel usage of TSC
> + * as hints to userspace users of TSC. The read_only info provided here:
> + * - tsc_stable: 1 implies system has TSC that always counts at a constant
> + * rate, sync across CPUs and has passed the kernel warp test.
> + * - tsc_khz: TSC frequency in khz.
> + * - tsc_mult and tsc_shift: multiplier and shift to optimally convert
> + * TSC delta to ns; ns = ((u64) delta * mult) >> shift
> + */
> +
> +#define define_show_var_function(_name, _var) \
> +static ssize_t show_##_name( \
> + struct sys_device *dev, struct sysdev_attribute *attr, char *buf) \
> +{ \
> + return sprintf(buf, "%u\n", (unsigned int) _var);\
> +}
> +
> +define_show_var_function(tsc_stable, !tsc_unstable);
> +define_show_var_function(tsc_khz, tsc_khz);
> +define_show_var_function(tsc_mult, clocksource_tsc.mult);
> +define_show_var_function(tsc_shift, clocksource_tsc.shift);
> +
> +static SYSDEV_ATTR(tsc_stable, 0444, show_tsc_stable, NULL);
> +static SYSDEV_ATTR(tsc_khz, 0444, show_tsc_khz, NULL);
> +static SYSDEV_ATTR(tsc_mult, 0444, show_tsc_mult, NULL);
> +static SYSDEV_ATTR(tsc_shift, 0444, show_tsc_shift, NULL);
> +
> +static struct sysdev_attribute *tsc_attrs[] = {
> + &attr_tsc_stable,
> + &attr_tsc_khz,
> + &attr_tsc_mult,
> + &attr_tsc_shift,
> +};
> +
> +static struct sysdev_class tsc_sysclass = {
> + .name = "tsc",
> +};
> +
> +static struct sys_device device_tsc = {
> + .id = 0,
> + .cls = &tsc_sysclass,
> +};
> +
> +static int __init init_tsc_sysfs(void)
> +{
> + int err, i = 0;
> +
> + err = sysdev_class_register(&tsc_sysclass);
> + if (err)
> + return err;
> +
> + err = sysdev_register(&device_tsc);
> + if (err)
> + goto fail;
fail will call sysdev_unregister(&device_tsc) which is not
appropriate, please fix this goto.
Thanks,
--
Jaswinder Singh.
> +
> + for (i = 0; i < ARRAY_SIZE(tsc_attrs); i++) {
> + err = sysdev_create_file(&device_tsc, tsc_attrs[i]);
> + if (err)
> + goto fail;
> + }
> +
> + return 0;
> +
> +fail:
> + while (--i >= 0)
> + sysdev_remove_file(&device_tsc, tsc_attrs[i]);
> +
> + sysdev_unregister(&device_tsc);
> + sysdev_class_unregister(&tsc_sysclass);
> + return err;
> +}
> +device_initcall(init_tsc_sysfs);
> +#endif
> +
> #ifdef CONFIG_X86_64
> /*
> * calibrate_cpu is used on systems with fixed rate TSCs to determine
> --
> 1.7.0.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/