2020-01-14 19:50:25

by Thomas Gleixner

[permalink] [raw]
Subject: [patch 14/15] lib/vdso: Avoid highres update if clocksource is not VDSO capable

If the current clocksource is not VDSO capable there is no point in
updating the high resolution parts of the VDSO data.

Replace the architecture specific check with a check for a VDSO capable
clocksource and skip the update if there is none.

Signed-off-by: Thomas Gleixner <[email protected]>
---
arch/arm/include/asm/vdso/vsyscall.h | 7 -------
include/asm-generic/vdso/vsyscall.h | 7 -------
kernel/time/vsyscall.c | 14 +++++++-------
3 files changed, 7 insertions(+), 21 deletions(-)

--- a/arch/arm/include/asm/vdso/vsyscall.h
+++ b/arch/arm/include/asm/vdso/vsyscall.h
@@ -22,13 +22,6 @@ struct vdso_data *__arm_get_k_vdso_data(
#define __arch_get_k_vdso_data __arm_get_k_vdso_data

static __always_inline
-bool __arm_update_vdso_data(void)
-{
- return cntvct_ok;
-}
-#define __arch_update_vdso_data __arm_update_vdso_data
-
-static __always_inline
void __arm_sync_vdso_data(struct vdso_data *vdata)
{
flush_dcache_page(virt_to_page(vdata));
--- a/include/asm-generic/vdso/vsyscall.h
+++ b/include/asm-generic/vdso/vsyscall.h
@@ -11,13 +11,6 @@ static __always_inline struct vdso_data
}
#endif /* __arch_get_k_vdso_data */

-#ifndef __arch_update_vdso_data
-static __always_inline bool __arch_update_vdso_data(void)
-{
- return true;
-}
-#endif /* __arch_update_vdso_data */
-
#ifndef __arch_update_vsyscall
static __always_inline void __arch_update_vsyscall(struct vdso_data *vdata,
struct timekeeper *tk)
--- a/kernel/time/vsyscall.c
+++ b/kernel/time/vsyscall.c
@@ -71,15 +71,15 @@ void update_vsyscall(struct timekeeper *
{
struct vdso_data *vdata = __arch_get_k_vdso_data();
struct vdso_timestamp *vdso_ts;
+ s32 clock_mode;
u64 nsec;
- s32 mode;

/* copy vsyscall data */
vdso_write_begin(vdata);

- mode = tk->tkr_mono.clock->vdso_clock_mode;
- vdata[CS_HRES_COARSE].clock_mode = mode;
- vdata[CS_RAW].clock_mode = mode;
+ clock_mode = tk->tkr_mono.clock->vdso_clock_mode;
+ vdata[CS_HRES_COARSE].clock_mode = clock_mode;
+ vdata[CS_RAW].clock_mode = clock_mode;

/* CLOCK_REALTIME also required for time() */
vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_REALTIME];
@@ -105,10 +105,10 @@ void update_vsyscall(struct timekeeper *
WRITE_ONCE(vdata[CS_HRES_COARSE].hrtimer_res, hrtimer_resolution);

/*
- * Architectures can opt out of updating the high resolution part
- * of the VDSO.
+ * If the current clocksource is not VDSO capable, then spare the
+ * update of the high reolution parts.
*/
- if (__arch_update_vdso_data())
+ if (clock_mode != VDSO_CLOCKMODE_NONE)
update_vdso_data(vdata, tk);

__arch_update_vsyscall(vdata, tk);


2020-01-15 05:55:36

by Christophe Leroy

[permalink] [raw]
Subject: Re: [patch 14/15] lib/vdso: Avoid highres update if clocksource is not VDSO capable



Le 14/01/2020 à 19:52, Thomas Gleixner a écrit :
> If the current clocksource is not VDSO capable there is no point in
> updating the high resolution parts of the VDSO data.
>
> Replace the architecture specific check with a check for a VDSO capable
> clocksource and skip the update if there is none.
>
> Signed-off-by: Thomas Gleixner <[email protected]>
> ---
> arch/arm/include/asm/vdso/vsyscall.h | 7 -------
> include/asm-generic/vdso/vsyscall.h | 7 -------
> kernel/time/vsyscall.c | 14 +++++++-------
> 3 files changed, 7 insertions(+), 21 deletions(-)
>
> --- a/arch/arm/include/asm/vdso/vsyscall.h
> +++ b/arch/arm/include/asm/vdso/vsyscall.h
> @@ -22,13 +22,6 @@ struct vdso_data *__arm_get_k_vdso_data(
> #define __arch_get_k_vdso_data __arm_get_k_vdso_data
>
> static __always_inline
> -bool __arm_update_vdso_data(void)
> -{
> - return cntvct_ok;
> -}
> -#define __arch_update_vdso_data __arm_update_vdso_data
> -
> -static __always_inline
> void __arm_sync_vdso_data(struct vdso_data *vdata)
> {
> flush_dcache_page(virt_to_page(vdata));
> --- a/include/asm-generic/vdso/vsyscall.h
> +++ b/include/asm-generic/vdso/vsyscall.h
> @@ -11,13 +11,6 @@ static __always_inline struct vdso_data
> }
> #endif /* __arch_get_k_vdso_data */
>
> -#ifndef __arch_update_vdso_data
> -static __always_inline bool __arch_update_vdso_data(void)
> -{
> - return true;
> -}
> -#endif /* __arch_update_vdso_data */
> -
> #ifndef __arch_update_vsyscall
> static __always_inline void __arch_update_vsyscall(struct vdso_data *vdata,
> struct timekeeper *tk)
> --- a/kernel/time/vsyscall.c
> +++ b/kernel/time/vsyscall.c
> @@ -71,15 +71,15 @@ void update_vsyscall(struct timekeeper *
> {
> struct vdso_data *vdata = __arch_get_k_vdso_data();
> struct vdso_timestamp *vdso_ts;
> + s32 clock_mode;
> u64 nsec;
> - s32 mode;

Can we name is clock_mode in patch 9 instead of changing name here ?

Christophe

>
> /* copy vsyscall data */
> vdso_write_begin(vdata);
>
> - mode = tk->tkr_mono.clock->vdso_clock_mode;
> - vdata[CS_HRES_COARSE].clock_mode = mode;
> - vdata[CS_RAW].clock_mode = mode;
> + clock_mode = tk->tkr_mono.clock->vdso_clock_mode;
> + vdata[CS_HRES_COARSE].clock_mode = clock_mode;
> + vdata[CS_RAW].clock_mode = clock_mode;
>
> /* CLOCK_REALTIME also required for time() */
> vdso_ts = &vdata[CS_HRES_COARSE].basetime[CLOCK_REALTIME];
> @@ -105,10 +105,10 @@ void update_vsyscall(struct timekeeper *
> WRITE_ONCE(vdata[CS_HRES_COARSE].hrtimer_res, hrtimer_resolution);
>
> /*
> - * Architectures can opt out of updating the high resolution part
> - * of the VDSO.
> + * If the current clocksource is not VDSO capable, then spare the
> + * update of the high reolution parts.
> */
> - if (__arch_update_vdso_data())
> + if (clock_mode != VDSO_CLOCKMODE_NONE)
> update_vdso_data(vdata, tk);
>
> __arch_update_vsyscall(vdata, tk);
>