diff --git a/drivers/gpu/nvgpu/common/linux/timers.c b/drivers/gpu/nvgpu/common/linux/timers.c index 140ae80ea..cfebb7998 100644 --- a/drivers/gpu/nvgpu/common/linux/timers.c +++ b/drivers/gpu/nvgpu/common/linux/timers.c @@ -14,7 +14,7 @@ * along with this program. If not, see . */ -#include +#include #include #include @@ -54,6 +54,9 @@ static int nvgpu_timeout_is_pre_silicon(struct nvgpu_timeout *timeout) * * If neither %NVGPU_TIMER_CPU_TIMER or %NVGPU_TIMER_RETRY_TIMER is passed then * a CPU timer is used by default. + * + * A negative duration is interpreted as the maximum possible, which for our + * purposes means infinite wait. */ int nvgpu_timeout_init(struct gk20a *g, struct nvgpu_timeout *timeout, int duration, unsigned long flags) @@ -66,10 +69,14 @@ int nvgpu_timeout_init(struct gk20a *g, struct nvgpu_timeout *timeout, timeout->g = g; timeout->flags = flags; + if (duration < 0) + duration = INT_MAX; + if (flags & NVGPU_TIMER_RETRY_TIMER) timeout->retries.max = duration; else - timeout->time = jiffies + msecs_to_jiffies(duration); + timeout->time = ktime_to_ns(ktime_add_ns(ktime_get(), + (s64)NSEC_PER_MSEC * duration)); return 0; } @@ -79,12 +86,12 @@ static int __nvgpu_timeout_expired_msg_cpu(struct nvgpu_timeout *timeout, const char *fmt, va_list args) { struct gk20a *g = timeout->g; - unsigned long now = jiffies; + ktime_t now = ktime_get(); if (nvgpu_timeout_is_pre_silicon(timeout)) return 0; - if (time_after(now, (unsigned long)timeout->time)) { + if (ktime_after(now, ns_to_ktime(timeout->time))) { if (!(timeout->flags & NVGPU_TIMER_SILENT_TIMEOUT)) { char buf[128]; @@ -176,7 +183,7 @@ int nvgpu_timeout_peek_expired(struct nvgpu_timeout *timeout) if (timeout->flags & NVGPU_TIMER_RETRY_TIMER) return timeout->retries.attempted >= timeout->retries.max; else - return time_after(jiffies, (unsigned long)timeout->time); + return ktime_after(ktime_get(), ns_to_ktime(timeout->time)); } /** diff --git a/drivers/gpu/nvgpu/include/nvgpu/timers.h b/drivers/gpu/nvgpu/include/nvgpu/timers.h index be903e54a..5265437e9 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/timers.h +++ b/drivers/gpu/nvgpu/include/nvgpu/timers.h @@ -50,7 +50,7 @@ struct nvgpu_timeout { unsigned int flags; union { - unsigned long time; + s64 time; struct { int max; int attempted;