lkml.org 
[lkml]   [2020]   [Jan]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH v4 05/11] lib: vdso: allow arches to provide vdso data pointer
    Date
    On powerpc, __arch_get_vdso_data() clobbers the link register,
    requiring the caller to save it.

    As the parent function already has to set a stack frame and saves
    the link register before calling the C vdso function, retriving the
    vdso data pointer there is lighter.

    Give arches the opportunity to hand the vdso data pointer
    to C vdso functions.

    Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
    ---
    lib/vdso/gettimeofday.c | 83 +++++++++++++++++++++++++++++++++++++++----------
    1 file changed, 67 insertions(+), 16 deletions(-)

    diff --git a/lib/vdso/gettimeofday.c b/lib/vdso/gettimeofday.c
    index 8b3084d9a3ec..9fa249809399 100644
    --- a/lib/vdso/gettimeofday.c
    +++ b/lib/vdso/gettimeofday.c
    @@ -219,9 +219,9 @@ static __always_inline int do_coarse(const struct vdso_data *vd, clockid_t clk,
    }

    static __maybe_unused int
    -__cvdso_clock_gettime_common(clockid_t clock, struct __kernel_timespec *ts)
    +__cvdso_clock_gettime_common(const struct vdso_data *vd, clockid_t clock,
    + struct __kernel_timespec *ts)
    {
    - const struct vdso_data *vd = __arch_get_vdso_data();
    u32 msk;

    /* Check for negative values or invalid clocks */
    @@ -246,23 +246,33 @@ __cvdso_clock_gettime_common(clockid_t clock, struct __kernel_timespec *ts)
    }

    static __maybe_unused int
    -__cvdso_clock_gettime(clockid_t clock, struct __kernel_timespec *ts)
    +__cvdso_clock_gettime_data(const struct vdso_data *vd, clockid_t clock,
    + struct __kernel_timespec *ts)
    {
    - int ret = __cvdso_clock_gettime_common(clock, ts);
    + int ret = __cvdso_clock_gettime_common(vd, clock, ts);

    if (unlikely(ret))
    return clock_gettime_fallback(clock, ts);
    return 0;
    }

    +static __maybe_unused int
    +__cvdso_clock_gettime(clockid_t clock, struct __kernel_timespec *ts)
    +{
    + const struct vdso_data *vd = __arch_get_vdso_data();
    +
    + return __cvdso_clock_gettime_data(vd, clock, ts);
    +}
    +
    #ifdef BUILD_VDSO32
    static __maybe_unused int
    -__cvdso_clock_gettime32(clockid_t clock, struct old_timespec32 *res)
    +__cvdso_clock_gettime32_data(const struct vdso_data *vd, clockid_t clock,
    + struct old_timespec32 *res)
    {
    struct __kernel_timespec ts;
    int ret;

    - ret = __cvdso_clock_gettime_common(clock, &ts);
    + ret = __cvdso_clock_gettime_common(vd, clock, &ts);

    if (unlikely(ret))
    return clock_gettime32_fallback(clock, res);
    @@ -273,13 +283,21 @@ __cvdso_clock_gettime32(clockid_t clock, struct old_timespec32 *res)

    return ret;
    }
    -#endif /* BUILD_VDSO32 */

    static __maybe_unused int
    -__cvdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz)
    +__cvdso_clock_gettime32(clockid_t clock, struct old_timespec32 *res)
    {
    const struct vdso_data *vd = __arch_get_vdso_data();

    + return __cvdso_clock_gettime32_data(vd, clock, res);
    +}
    +#endif /* BUILD_VDSO32 */
    +
    +static __maybe_unused int
    +__cvdso_gettimeofday_data(const struct vdso_data *vd,
    + struct __kernel_old_timeval *tv, struct timezone *tz)
    +{
    +
    if (likely(tv != NULL)) {
    struct __kernel_timespec ts;

    @@ -302,10 +320,18 @@ __cvdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz)
    return 0;
    }

    -#ifdef VDSO_HAS_TIME
    -static __maybe_unused __kernel_old_time_t __cvdso_time(__kernel_old_time_t *time)
    +static __maybe_unused int
    +__cvdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz)
    {
    const struct vdso_data *vd = __arch_get_vdso_data();
    +
    + return __cvdso_gettimeofday_data(vd, tv, tz);
    +}
    +
    +#ifdef VDSO_HAS_TIME
    +static __maybe_unused __kernel_old_time_t
    +__cvdso_time_data(const struct vdso_data *vd, __kernel_old_time_t *time)
    +{
    __kernel_old_time_t t;

    if (IS_ENABLED(CONFIG_TIME_NS) &&
    @@ -319,13 +345,20 @@ static __maybe_unused __kernel_old_time_t __cvdso_time(__kernel_old_time_t *time

    return t;
    }
    +
    +static __maybe_unused __kernel_old_time_t __cvdso_time(__kernel_old_time_t *time)
    +{
    + const struct vdso_data *vd = __arch_get_vdso_data();
    +
    + return __cvdso_time_data(vd, time);
    +}
    #endif /* VDSO_HAS_TIME */

    #ifdef VDSO_HAS_CLOCK_GETRES
    static __maybe_unused
    -int __cvdso_clock_getres_common(clockid_t clock, struct __kernel_timespec *res)
    +int __cvdso_clock_getres_common(const struct vdso_data *vd, clockid_t clock,
    + struct __kernel_timespec *res)
    {
    - const struct vdso_data *vd = __arch_get_vdso_data();
    u32 msk;
    u64 ns;

    @@ -364,23 +397,33 @@ int __cvdso_clock_getres_common(clockid_t clock, struct __kernel_timespec *res)
    }

    static __maybe_unused
    -int __cvdso_clock_getres(clockid_t clock, struct __kernel_timespec *res)
    +int __cvdso_clock_getres_data(const struct vdso_data *vd, clockid_t clock,
    + struct __kernel_timespec *res)
    {
    - int ret = __cvdso_clock_getres_common(clock, res);
    + int ret = __cvdso_clock_getres_common(vd, clock, res);

    if (unlikely(ret))
    return clock_getres_fallback(clock, res);
    return 0;
    }

    +static __maybe_unused
    +int __cvdso_clock_getres(clockid_t clock, struct __kernel_timespec *res)
    +{
    + const struct vdso_data *vd = __arch_get_vdso_data();
    +
    + return __cvdso_clock_getres_data(vd, clock, res);
    +}
    +
    #ifdef BUILD_VDSO32
    static __maybe_unused int
    -__cvdso_clock_getres_time32(clockid_t clock, struct old_timespec32 *res)
    +__cvdso_clock_getres_time32_data(const struct vdso_data *vd, clockid_t clock,
    + struct old_timespec32 *res)
    {
    struct __kernel_timespec ts;
    int ret;

    - ret = __cvdso_clock_getres_common(clock, &ts);
    + ret = __cvdso_clock_getres_common(vd, clock, &ts);

    if (unlikely(ret))
    return clock_getres32_fallback(clock, res);
    @@ -391,5 +434,13 @@ __cvdso_clock_getres_time32(clockid_t clock, struct old_timespec32 *res)
    }
    return ret;
    }
    +
    +static __maybe_unused int
    +__cvdso_clock_getres_time32(clockid_t clock, struct old_timespec32 *res)
    +{
    + const struct vdso_data *vd = __arch_get_vdso_data();
    +
    + return __cvdso_clock_getres_time32_data(vd, clock, res);
    +}
    #endif /* BUILD_VDSO32 */
    #endif /* VDSO_HAS_CLOCK_GETRES */
    --
    2.13.3
    \
     
     \ /
      Last update: 2020-01-16 19:00    [W:5.216 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site