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