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