| 1 | // SPDX-License-Identifier: MIT | 
|---|---|
| 2 | /* Copyright © 2025 Intel Corporation */ | 
| 3 | |
| 4 | #include <linux/jiffies.h> | 
| 5 | |
| 6 | #include "i915_timer_util.h" | 
| 7 | |
| 8 | void cancel_timer(struct timer_list *t) | 
| 9 | { | 
| 10 | if (!timer_active(t)) | 
| 11 | return; | 
| 12 | |
| 13 | timer_delete(timer: t); | 
| 14 | WRITE_ONCE(t->expires, 0); | 
| 15 | } | 
| 16 | |
| 17 | void set_timer_ms(struct timer_list *t, unsigned long timeout) | 
| 18 | { | 
| 19 | if (!timeout) { | 
| 20 | cancel_timer(t); | 
| 21 | return; | 
| 22 | } | 
| 23 | |
| 24 | timeout = msecs_to_jiffies(m: timeout); | 
| 25 | |
| 26 | /* | 
| 27 | * Paranoia to make sure the compiler computes the timeout before | 
| 28 | * loading 'jiffies' as jiffies is volatile and may be updated in | 
| 29 | * the background by a timer tick. All to reduce the complexity | 
| 30 | * of the addition and reduce the risk of losing a jiffy. | 
| 31 | */ | 
| 32 | barrier(); | 
| 33 | |
| 34 | /* Keep t->expires = 0 reserved to indicate a canceled timer. */ | 
| 35 | mod_timer(timer: t, expires: jiffies + timeout ?: 1); | 
| 36 | } | 
| 37 | 
