Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e3db5d15 authored by Vincenzo Frascino's avatar Vincenzo Frascino Committed by Alistair Delva
Browse files

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: default avatarVincenzo Frascino <vincenzo.frascino@arm.com>
Signed-off-by: default avatarGreentime Hu <greentime@andestech.com>
(cherry picked from commit af9abd65983cf3602c03ef3d16fe549ba1f3eeed)
Signed-off-by: default avatarMark Salyzyn <salyzyn@google.com>
Bug: 154668398
Change-Id: Ic66e6358c4f5f32abc968a6ebb4868eaa7d07a37
parent 3d31057b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ struct vdso_data {
	u32 xtime_clock_sec;	/* CLOCK_REALTIME - seconds */
	u32 cs_mult;		/* clocksource multiplier */
	u32 cs_shift;		/* Cycle to nanosecond divisor (power of two) */
	u32 hrtimer_res;	/* hrtimer resolution */

	u64 cs_cycle_last;	/* last cycle value */
	u64 cs_mask;		/* clocksource mask */
+1 −0
Original line number Diff line number Diff line
@@ -220,6 +220,7 @@ void update_vsyscall(struct timekeeper *tk)
	vdso_data->xtime_coarse_sec = tk->xtime_sec;
	vdso_data->xtime_coarse_nsec = tk->tkr_mono.xtime_nsec >>
	    tk->tkr_mono.shift;
	vdso_data->hrtimer_res = hrtimer_resolution;
	vdso_write_end(vdso_data);
}

+3 −1
Original line number Diff line number Diff line
@@ -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)
{
	struct vdso_data *vdata = __get_datapage();

	if (res == NULL)
		return 0;
	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_RAW:
		res->tv_sec = 0;
		res->tv_nsec = CLOCK_REALTIME_RES;
		res->tv_nsec = vdata->hrtimer_res;
		break;
	case CLOCK_REALTIME_COARSE:
	case CLOCK_MONOTONIC_COARSE: