UPSTREAM: nds32: Fix vDSO clock_getres()
clock_getres in the vDSO library has to preserve the same behaviour of posix_get_hrtimer_res(). In particular, posix_get_hrtimer_res() does: sec = 0; ns = hrtimer_resolution; and hrtimer_resolution depends on the enablement of the high resolution timers that can happen either at compile or at run time. Fix the nds32 vdso implementation of clock_getres keeping a copy of hrtimer_resolution in vdso data and using that directly. Cc: Greentime Hu <green.hu@gmail.com> Cc: Vincent Chen <deanbo422@gmail.com> Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com> Signed-off-by: Greentime Hu <greentime@andestech.com> (cherry picked from commit af9abd65983cf3602c03ef3d16fe549ba1f3eeed) Signed-off-by: Mark Salyzyn <salyzyn@google.com> Bug: 154668398 Change-Id: Ic66e6358c4f5f32abc968a6ebb4868eaa7d07a37
This commit is contained in:
parent
3d31057b51
commit
e3db5d1536
3 changed files with 5 additions and 1 deletions
|
@ -20,6 +20,7 @@ struct vdso_data {
|
||||||
u32 xtime_clock_sec; /* CLOCK_REALTIME - seconds */
|
u32 xtime_clock_sec; /* CLOCK_REALTIME - seconds */
|
||||||
u32 cs_mult; /* clocksource multiplier */
|
u32 cs_mult; /* clocksource multiplier */
|
||||||
u32 cs_shift; /* Cycle to nanosecond divisor (power of two) */
|
u32 cs_shift; /* Cycle to nanosecond divisor (power of two) */
|
||||||
|
u32 hrtimer_res; /* hrtimer resolution */
|
||||||
|
|
||||||
u64 cs_cycle_last; /* last cycle value */
|
u64 cs_cycle_last; /* last cycle value */
|
||||||
u64 cs_mask; /* clocksource mask */
|
u64 cs_mask; /* clocksource mask */
|
||||||
|
|
|
@ -220,6 +220,7 @@ void update_vsyscall(struct timekeeper *tk)
|
||||||
vdso_data->xtime_coarse_sec = tk->xtime_sec;
|
vdso_data->xtime_coarse_sec = tk->xtime_sec;
|
||||||
vdso_data->xtime_coarse_nsec = tk->tkr_mono.xtime_nsec >>
|
vdso_data->xtime_coarse_nsec = tk->tkr_mono.xtime_nsec >>
|
||||||
tk->tkr_mono.shift;
|
tk->tkr_mono.shift;
|
||||||
|
vdso_data->hrtimer_res = hrtimer_resolution;
|
||||||
vdso_write_end(vdso_data);
|
vdso_write_end(vdso_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -208,6 +208,8 @@ static notrace int clock_getres_fallback(clockid_t _clk_id,
|
||||||
|
|
||||||
notrace int __vdso_clock_getres(clockid_t clk_id, struct timespec *res)
|
notrace int __vdso_clock_getres(clockid_t clk_id, struct timespec *res)
|
||||||
{
|
{
|
||||||
|
struct vdso_data *vdata = __get_datapage();
|
||||||
|
|
||||||
if (res == NULL)
|
if (res == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
switch (clk_id) {
|
switch (clk_id) {
|
||||||
|
@ -215,7 +217,7 @@ notrace int __vdso_clock_getres(clockid_t clk_id, struct timespec *res)
|
||||||
case CLOCK_MONOTONIC:
|
case CLOCK_MONOTONIC:
|
||||||
case CLOCK_MONOTONIC_RAW:
|
case CLOCK_MONOTONIC_RAW:
|
||||||
res->tv_sec = 0;
|
res->tv_sec = 0;
|
||||||
res->tv_nsec = CLOCK_REALTIME_RES;
|
res->tv_nsec = vdata->hrtimer_res;
|
||||||
break;
|
break;
|
||||||
case CLOCK_REALTIME_COARSE:
|
case CLOCK_REALTIME_COARSE:
|
||||||
case CLOCK_MONOTONIC_COARSE:
|
case CLOCK_MONOTONIC_COARSE:
|
||||||
|
|
Loading…
Reference in a new issue