diff options
Diffstat (limited to 'drivers/gpu/nvgpu/common/linux')
-rw-r--r-- | drivers/gpu/nvgpu/common/linux/timers.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/drivers/gpu/nvgpu/common/linux/timers.c b/drivers/gpu/nvgpu/common/linux/timers.c index 140ae80e..cfebb799 100644 --- a/drivers/gpu/nvgpu/common/linux/timers.c +++ b/drivers/gpu/nvgpu/common/linux/timers.c | |||
@@ -14,7 +14,7 @@ | |||
14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
15 | */ | 15 | */ |
16 | 16 | ||
17 | #include <linux/jiffies.h> | 17 | #include <linux/ktime.h> |
18 | #include <linux/delay.h> | 18 | #include <linux/delay.h> |
19 | 19 | ||
20 | #include <nvgpu/timers.h> | 20 | #include <nvgpu/timers.h> |
@@ -54,6 +54,9 @@ static int nvgpu_timeout_is_pre_silicon(struct nvgpu_timeout *timeout) | |||
54 | * | 54 | * |
55 | * If neither %NVGPU_TIMER_CPU_TIMER or %NVGPU_TIMER_RETRY_TIMER is passed then | 55 | * If neither %NVGPU_TIMER_CPU_TIMER or %NVGPU_TIMER_RETRY_TIMER is passed then |
56 | * a CPU timer is used by default. | 56 | * a CPU timer is used by default. |
57 | * | ||
58 | * A negative duration is interpreted as the maximum possible, which for our | ||
59 | * purposes means infinite wait. | ||
57 | */ | 60 | */ |
58 | int nvgpu_timeout_init(struct gk20a *g, struct nvgpu_timeout *timeout, | 61 | int nvgpu_timeout_init(struct gk20a *g, struct nvgpu_timeout *timeout, |
59 | int duration, unsigned long flags) | 62 | int duration, unsigned long flags) |
@@ -66,10 +69,14 @@ int nvgpu_timeout_init(struct gk20a *g, struct nvgpu_timeout *timeout, | |||
66 | timeout->g = g; | 69 | timeout->g = g; |
67 | timeout->flags = flags; | 70 | timeout->flags = flags; |
68 | 71 | ||
72 | if (duration < 0) | ||
73 | duration = INT_MAX; | ||
74 | |||
69 | if (flags & NVGPU_TIMER_RETRY_TIMER) | 75 | if (flags & NVGPU_TIMER_RETRY_TIMER) |
70 | timeout->retries.max = duration; | 76 | timeout->retries.max = duration; |
71 | else | 77 | else |
72 | timeout->time = jiffies + msecs_to_jiffies(duration); | 78 | timeout->time = ktime_to_ns(ktime_add_ns(ktime_get(), |
79 | (s64)NSEC_PER_MSEC * duration)); | ||
73 | 80 | ||
74 | return 0; | 81 | return 0; |
75 | } | 82 | } |
@@ -79,12 +86,12 @@ static int __nvgpu_timeout_expired_msg_cpu(struct nvgpu_timeout *timeout, | |||
79 | const char *fmt, va_list args) | 86 | const char *fmt, va_list args) |
80 | { | 87 | { |
81 | struct gk20a *g = timeout->g; | 88 | struct gk20a *g = timeout->g; |
82 | unsigned long now = jiffies; | 89 | ktime_t now = ktime_get(); |
83 | 90 | ||
84 | if (nvgpu_timeout_is_pre_silicon(timeout)) | 91 | if (nvgpu_timeout_is_pre_silicon(timeout)) |
85 | return 0; | 92 | return 0; |
86 | 93 | ||
87 | if (time_after(now, (unsigned long)timeout->time)) { | 94 | if (ktime_after(now, ns_to_ktime(timeout->time))) { |
88 | if (!(timeout->flags & NVGPU_TIMER_SILENT_TIMEOUT)) { | 95 | if (!(timeout->flags & NVGPU_TIMER_SILENT_TIMEOUT)) { |
89 | char buf[128]; | 96 | char buf[128]; |
90 | 97 | ||
@@ -176,7 +183,7 @@ int nvgpu_timeout_peek_expired(struct nvgpu_timeout *timeout) | |||
176 | if (timeout->flags & NVGPU_TIMER_RETRY_TIMER) | 183 | if (timeout->flags & NVGPU_TIMER_RETRY_TIMER) |
177 | return timeout->retries.attempted >= timeout->retries.max; | 184 | return timeout->retries.attempted >= timeout->retries.max; |
178 | else | 185 | else |
179 | return time_after(jiffies, (unsigned long)timeout->time); | 186 | return ktime_after(ktime_get(), ns_to_ktime(timeout->time)); |
180 | } | 187 | } |
181 | 188 | ||
182 | /** | 189 | /** |