Hi,

kernel test robot noticed the following build warnings:

[auto build test WARNING on trace/for-next]
[also build test WARNING on shuah-kselftest/next shuah-kselftest/fixes 
linus/master v7.3-rc6 next-20261009]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    
https://github.com/intel-lab-lkp/linux/commits/wen-yang-linux-dev/rv-Force-environment-reset-action-on-HA-monitor-start/20261012-033907
base:   https://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace 
for-next
patch link:    
https://lore.kernel.org/r/cdaf33af866392428f1942cef4e442b1d106989c.1791745088.git.wen.yang%40linux.dev
patch subject: [PATCH v7 03/14] rv: Add a KUnit test for the HA timer underflow
config: x86_64-rhel-9.4-kunit 
(https://download.01.org/0day-ci/archive/20261012/[email protected]/config)
compiler: gcc-14 (Debian 14.2.0-19) 14.2.0
reproduce (this is a W=1 build): 
(https://download.01.org/0day-ci/archive/20261012/[email protected]/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: 
https://lore.kernel.org/oe-kbuild-all/[email protected]/

All warnings (new ones prefixed by >>):

         |                                  ^~~~~~~~
   include/rv/ha_monitor.h:430:37: note: in expansion of macro 'container_of'
     430 |         struct ha_monitor *ha_mon = container_of(timer, struct 
ha_monitor, timer);
         |                                     ^~~~~~~~~~~~
   include/rv/ha_monitor.h: In function 'ha_setup_timer':
   include/rv/ha_monitor.h:440:28: error: 'struct ha_monitor' has no member 
named 'timer'
     440 |         timer_setup(&ha_mon->timer, ha_monitor_timer_callback, mode);
         |                            ^~
   include/linux/timer.h:105:25: note: in definition of macro '__timer_init'
     105 |         timer_init_key((_timer), (_fn), (_flags), NULL, NULL)
         |                         ^~~~~~
   include/rv/ha_monitor.h:440:9: note: in expansion of macro 'timer_setup'
     440 |         timer_setup(&ha_mon->timer, ha_monitor_timer_callback, mode);
         |         ^~~~~~~~~~~
   include/rv/ha_monitor.h: In function 'ha_start_timer_jiffy':
   include/rv/ha_monitor.h:447:26: error: 'struct ha_monitor' has no member 
named 'timer'
     447 |         mod_timer(&ha_mon->timer,
         |                          ^~
   include/rv/ha_monitor.h: In function 'ha_cancel_timer':
   include/rv/ha_monitor.h:468:36: error: 'struct ha_monitor' has no member 
named 'timer'
     468 |         return timer_delete(&ha_mon->timer);
         |                                    ^~
   include/rv/ha_monitor.h: In function 'ha_cancel_timer_sync':
   include/rv/ha_monitor.h:472:34: error: 'struct ha_monitor' has no member 
named 'timer'
     472 |         timer_delete_sync(&ha_mon->timer);
         |                                  ^~
   kernel/trace/rv/rv_monitors_test.c: In function 'rv_test_rvtest_underflow':
   include/linux/container_of.h:8:47: error: 'struct ha_monitor' has no member 
named 'da_mon'
       8 | #define typeof_member(T, m)     typeof(((T*)0)->m)
         |                                               ^~
   include/linux/build_bug.h:80:56: note: in definition of macro 
'__static_assert'
      80 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
         |                                                        ^~~~
   include/linux/container_of.h:20:9: note: in expansion of macro 
'static_assert'
      20 |         static_assert(__same_type(*(ptr), typeof_member(type, 
member)) || \
         |         ^~~~~~~~~~~~~
   include/linux/container_of.h:20:23: note: in expansion of macro '__same_type'
      20 |         static_assert(__same_type(*(ptr), typeof_member(type, 
member)) || \
         |                       ^~~~~~~~~~~
   include/linux/container_of.h:20:43: note: in expansion of macro 
'typeof_member'
      20 |         static_assert(__same_type(*(ptr), typeof_member(type, 
member)) || \
         |                                           ^~~~~~~~~~~~~
   include/rv/ha_monitor.h:68:27: note: in expansion of macro 'container_of'
      68 | #define to_ha_monitor(da) container_of(da, struct ha_monitor, da_mon)
         |                           ^~~~~~~~~~~~
   kernel/trace/rv/rv_monitors_test.c:248:18: note: in expansion of macro 
'to_ha_monitor'
     248 |         ha_mon = to_ha_monitor(da_mon);
         |                  ^~~~~~~~~~~~~
   include/linux/compiler_types.h:610:27: error: expression in static assertion 
is not an integer
     610 | #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), 
typeof(b))
         |                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:80:56: note: in definition of macro 
'__static_assert'
      80 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
         |                                                        ^~~~
   include/linux/container_of.h:20:9: note: in expansion of macro 
'static_assert'
      20 |         static_assert(__same_type(*(ptr), typeof_member(type, 
member)) || \
         |         ^~~~~~~~~~~~~
   include/linux/container_of.h:20:23: note: in expansion of macro '__same_type'
      20 |         static_assert(__same_type(*(ptr), typeof_member(type, 
member)) || \
         |                       ^~~~~~~~~~~
   include/rv/ha_monitor.h:68:27: note: in expansion of macro 'container_of'
      68 | #define to_ha_monitor(da) container_of(da, struct ha_monitor, da_mon)
         |                           ^~~~~~~~~~~~
   kernel/trace/rv/rv_monitors_test.c:248:18: note: in expansion of macro 
'to_ha_monitor'
     248 |         ha_mon = to_ha_monitor(da_mon);
         |                  ^~~~~~~~~~~~~
   include/linux/stddef.h:16:33: error: 'struct ha_monitor' has no member named 
'da_mon'
      16 | #define offsetof(TYPE, MEMBER)  __builtin_offsetof(TYPE, MEMBER)
         |                                 ^~~~~~~~~~~~~~~~~~
   include/linux/container_of.h:23:34: note: in expansion of macro 'offsetof'
      23 |         (type *)((void *)(ptr) - offsetof(type, member)); })
         |                                  ^~~~~~~~
   include/rv/ha_monitor.h:68:27: note: in expansion of macro 'container_of'
      68 | #define to_ha_monitor(da) container_of(da, struct ha_monitor, da_mon)
         |                           ^~~~~~~~~~~~
   kernel/trace/rv/rv_monitors_test.c:248:18: note: in expansion of macro 
'to_ha_monitor'
     248 |         ha_mon = to_ha_monitor(da_mon);
         |                  ^~~~~~~~~~~~~
   kernel/trace/rv/rv_monitors_test.c:259:33: error: 'struct ha_monitor' has no 
member named 'da_mon'
     259 |         da_monitor_reset(&ha_mon->da_mon);
         |                                 ^~
   kernel/trace/rv/rv_monitors_test.c:264:67: error: 'struct ha_monitor' has no 
member named 'hrtimer'
     264 |                           
ktime_before(hrtimer_get_expires(&ha_mon->hrtimer),
         |                                                                   ^~
   include/linux/compiler.h:76:45: note: in definition of macro 'likely'
      76 | # define likely(x)      __builtin_expect(!!(x), 1)
         |                                             ^
   include/kunit/test.h:802:9: note: in expansion of macro 
'KUNIT_UNARY_ASSERTION'
     802 |         KUNIT_UNARY_ASSERTION(test,                                  
          \
         |         ^~~~~~~~~~~~~~~~~~~~~
   include/kunit/test.h:998:9: note: in expansion of macro 
'KUNIT_TRUE_MSG_ASSERTION'
     998 |         KUNIT_TRUE_MSG_ASSERTION(test,                               
          \
         |         ^~~~~~~~~~~~~~~~~~~~~~~~
   include/kunit/test.h:995:9: note: in expansion of macro 
'KUNIT_EXPECT_TRUE_MSG'
     995 |         KUNIT_EXPECT_TRUE_MSG(test, condition, NULL)
         |         ^~~~~~~~~~~~~~~~~~~~~
   kernel/trace/rv/rv_monitors_test.c:263:9: note: in expansion of macro 
'KUNIT_EXPECT_TRUE'
     263 |         KUNIT_EXPECT_TRUE(test,
         |         ^~~~~~~~~~~~~~~~~
   include/rv/ha_monitor.h: In function 'ha_cancel_timer':
>> include/rv/ha_monitor.h:469:1: warning: control reaches end of non-void 
>> function [-Wreturn-type]
     469 | }
         | ^
   include/rv/ha_monitor.h: In function 'ha_get_clk_ns':
   include/rv/ha_monitor.h:346:1: warning: control reaches end of non-void 
function [-Wreturn-type]
     346 | }
         | ^
   include/rv/ha_monitor.h: In function 'ha_check_invariant_ns':
   include/rv/ha_monitor.h:355:1: warning: control reaches end of non-void 
function [-Wreturn-type]
     355 | }
         | ^
   include/rv/ha_monitor.h: In function 'ha_monitor_env_invalid':
   include/rv/ha_monitor.h:220:1: warning: control reaches end of non-void 
function [-Wreturn-type]
     220 | }
         | ^
--
         |                                  ^~~~~~~~
   include/rv/ha_monitor.h:430:37: note: in expansion of macro 'container_of'
     430 |         struct ha_monitor *ha_mon = container_of(timer, struct 
ha_monitor, timer);
         |                                     ^~~~~~~~~~~~
   include/rv/ha_monitor.h: In function 'ha_setup_timer':
   include/rv/ha_monitor.h:440:28: error: 'struct ha_monitor' has no member 
named 'timer'
     440 |         timer_setup(&ha_mon->timer, ha_monitor_timer_callback, mode);
         |                            ^~
   include/linux/timer.h:105:25: note: in definition of macro '__timer_init'
     105 |         timer_init_key((_timer), (_fn), (_flags), NULL, NULL)
         |                         ^~~~~~
   include/rv/ha_monitor.h:440:9: note: in expansion of macro 'timer_setup'
     440 |         timer_setup(&ha_mon->timer, ha_monitor_timer_callback, mode);
         |         ^~~~~~~~~~~
   include/rv/ha_monitor.h: In function 'ha_start_timer_jiffy':
   include/rv/ha_monitor.h:447:26: error: 'struct ha_monitor' has no member 
named 'timer'
     447 |         mod_timer(&ha_mon->timer,
         |                          ^~
   include/rv/ha_monitor.h: In function 'ha_cancel_timer':
   include/rv/ha_monitor.h:468:36: error: 'struct ha_monitor' has no member 
named 'timer'
     468 |         return timer_delete(&ha_mon->timer);
         |                                    ^~
   include/rv/ha_monitor.h: In function 'ha_cancel_timer_sync':
   include/rv/ha_monitor.h:472:34: error: 'struct ha_monitor' has no member 
named 'timer'
     472 |         timer_delete_sync(&ha_mon->timer);
         |                                  ^~
   rv_monitors_test.c: In function 'rv_test_rvtest_underflow':
   include/linux/container_of.h:8:47: error: 'struct ha_monitor' has no member 
named 'da_mon'
       8 | #define typeof_member(T, m)     typeof(((T*)0)->m)
         |                                               ^~
   include/linux/build_bug.h:80:56: note: in definition of macro 
'__static_assert'
      80 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
         |                                                        ^~~~
   include/linux/container_of.h:20:9: note: in expansion of macro 
'static_assert'
      20 |         static_assert(__same_type(*(ptr), typeof_member(type, 
member)) || \
         |         ^~~~~~~~~~~~~
   include/linux/container_of.h:20:23: note: in expansion of macro '__same_type'
      20 |         static_assert(__same_type(*(ptr), typeof_member(type, 
member)) || \
         |                       ^~~~~~~~~~~
   include/linux/container_of.h:20:43: note: in expansion of macro 
'typeof_member'
      20 |         static_assert(__same_type(*(ptr), typeof_member(type, 
member)) || \
         |                                           ^~~~~~~~~~~~~
   include/rv/ha_monitor.h:68:27: note: in expansion of macro 'container_of'
      68 | #define to_ha_monitor(da) container_of(da, struct ha_monitor, da_mon)
         |                           ^~~~~~~~~~~~
   rv_monitors_test.c:248:18: note: in expansion of macro 'to_ha_monitor'
     248 |         ha_mon = to_ha_monitor(da_mon);
         |                  ^~~~~~~~~~~~~
   include/linux/compiler_types.h:610:27: error: expression in static assertion 
is not an integer
     610 | #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), 
typeof(b))
         |                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:80:56: note: in definition of macro 
'__static_assert'
      80 | #define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
         |                                                        ^~~~
   include/linux/container_of.h:20:9: note: in expansion of macro 
'static_assert'
      20 |         static_assert(__same_type(*(ptr), typeof_member(type, 
member)) || \
         |         ^~~~~~~~~~~~~
   include/linux/container_of.h:20:23: note: in expansion of macro '__same_type'
      20 |         static_assert(__same_type(*(ptr), typeof_member(type, 
member)) || \
         |                       ^~~~~~~~~~~
   include/rv/ha_monitor.h:68:27: note: in expansion of macro 'container_of'
      68 | #define to_ha_monitor(da) container_of(da, struct ha_monitor, da_mon)
         |                           ^~~~~~~~~~~~
   rv_monitors_test.c:248:18: note: in expansion of macro 'to_ha_monitor'
     248 |         ha_mon = to_ha_monitor(da_mon);
         |                  ^~~~~~~~~~~~~
   include/linux/stddef.h:16:33: error: 'struct ha_monitor' has no member named 
'da_mon'
      16 | #define offsetof(TYPE, MEMBER)  __builtin_offsetof(TYPE, MEMBER)
         |                                 ^~~~~~~~~~~~~~~~~~
   include/linux/container_of.h:23:34: note: in expansion of macro 'offsetof'
      23 |         (type *)((void *)(ptr) - offsetof(type, member)); })
         |                                  ^~~~~~~~
   include/rv/ha_monitor.h:68:27: note: in expansion of macro 'container_of'
      68 | #define to_ha_monitor(da) container_of(da, struct ha_monitor, da_mon)
         |                           ^~~~~~~~~~~~
   rv_monitors_test.c:248:18: note: in expansion of macro 'to_ha_monitor'
     248 |         ha_mon = to_ha_monitor(da_mon);
         |                  ^~~~~~~~~~~~~
   rv_monitors_test.c:259:33: error: 'struct ha_monitor' has no member named 
'da_mon'
     259 |         da_monitor_reset(&ha_mon->da_mon);
         |                                 ^~
   rv_monitors_test.c:264:67: error: 'struct ha_monitor' has no member named 
'hrtimer'
     264 |                           
ktime_before(hrtimer_get_expires(&ha_mon->hrtimer),
         |                                                                   ^~
   include/linux/compiler.h:76:45: note: in definition of macro 'likely'
      76 | # define likely(x)      __builtin_expect(!!(x), 1)
         |                                             ^
   include/kunit/test.h:802:9: note: in expansion of macro 
'KUNIT_UNARY_ASSERTION'
     802 |         KUNIT_UNARY_ASSERTION(test,                                  
          \
         |         ^~~~~~~~~~~~~~~~~~~~~
   include/kunit/test.h:998:9: note: in expansion of macro 
'KUNIT_TRUE_MSG_ASSERTION'
     998 |         KUNIT_TRUE_MSG_ASSERTION(test,                               
          \
         |         ^~~~~~~~~~~~~~~~~~~~~~~~
   include/kunit/test.h:995:9: note: in expansion of macro 
'KUNIT_EXPECT_TRUE_MSG'
     995 |         KUNIT_EXPECT_TRUE_MSG(test, condition, NULL)
         |         ^~~~~~~~~~~~~~~~~~~~~
   rv_monitors_test.c:263:9: note: in expansion of macro 'KUNIT_EXPECT_TRUE'
     263 |         KUNIT_EXPECT_TRUE(test,
         |         ^~~~~~~~~~~~~~~~~
   include/rv/ha_monitor.h: In function 'ha_cancel_timer':
>> include/rv/ha_monitor.h:469:1: warning: control reaches end of non-void 
>> function [-Wreturn-type]
     469 | }
         | ^
   include/rv/ha_monitor.h: In function 'ha_get_clk_ns':
   include/rv/ha_monitor.h:346:1: warning: control reaches end of non-void 
function [-Wreturn-type]
     346 | }
         | ^
   include/rv/ha_monitor.h: In function 'ha_check_invariant_ns':
   include/rv/ha_monitor.h:355:1: warning: control reaches end of non-void 
function [-Wreturn-type]
     355 | }
         | ^
   include/rv/ha_monitor.h: In function 'ha_monitor_env_invalid':
   include/rv/ha_monitor.h:220:1: warning: control reaches end of non-void 
function [-Wreturn-type]
     220 | }
         | ^


vim +469 include/rv/ha_monitor.h

d68b31ce9bd4dda Wen Yang        2026-10-12  417  
f5587d1b6ec938a Gabriele Monaco 2026-03-30  418  #if HA_TIMER_TYPE == 
HA_TIMER_WHEEL
f5587d1b6ec938a Gabriele Monaco 2026-03-30  419  /*
f5587d1b6ec938a Gabriele Monaco 2026-03-30  420   * Helper functions to handle 
the monitor timer.
f5587d1b6ec938a Gabriele Monaco 2026-03-30  421   * Not all monitors require a 
timer, in such case the timer will be set up but
f5587d1b6ec938a Gabriele Monaco 2026-03-30  422   * never armed.
f5587d1b6ec938a Gabriele Monaco 2026-03-30  423   * Timers start since the last 
reset of the supplied env or from now if env is
f5587d1b6ec938a Gabriele Monaco 2026-03-30  424   * not an environment 
variable. If env was not initialised no timer starts.
f5587d1b6ec938a Gabriele Monaco 2026-03-30  425   * Timers can expire on any 
CPU unless the monitor is per-cpu,
f5587d1b6ec938a Gabriele Monaco 2026-03-30  426   * where we assume every event 
occurs on the local CPU.
f5587d1b6ec938a Gabriele Monaco 2026-03-30  427   */
f5587d1b6ec938a Gabriele Monaco 2026-03-30  428  static void 
ha_monitor_timer_callback(struct timer_list *timer)
f5587d1b6ec938a Gabriele Monaco 2026-03-30  429  {
f5587d1b6ec938a Gabriele Monaco 2026-03-30  430         struct ha_monitor 
*ha_mon = container_of(timer, struct ha_monitor, timer);
f5587d1b6ec938a Gabriele Monaco 2026-03-30  431  
f5587d1b6ec938a Gabriele Monaco 2026-03-30  432         
__ha_monitor_timer_callback(ha_mon);
f5587d1b6ec938a Gabriele Monaco 2026-03-30  433  }
f5587d1b6ec938a Gabriele Monaco 2026-03-30  434  static inline void 
ha_setup_timer(struct ha_monitor *ha_mon)
f5587d1b6ec938a Gabriele Monaco 2026-03-30  435  {
f5587d1b6ec938a Gabriele Monaco 2026-03-30  436         int mode = 0;
f5587d1b6ec938a Gabriele Monaco 2026-03-30  437  
f5587d1b6ec938a Gabriele Monaco 2026-03-30  438         if (RV_MON_TYPE == 
RV_MON_PER_CPU)
f5587d1b6ec938a Gabriele Monaco 2026-03-30  439                 mode |= 
TIMER_PINNED;
f5587d1b6ec938a Gabriele Monaco 2026-03-30  440         
timer_setup(&ha_mon->timer, ha_monitor_timer_callback, mode);
f5587d1b6ec938a Gabriele Monaco 2026-03-30  441  }
f5587d1b6ec938a Gabriele Monaco 2026-03-30  442  static inline void 
ha_start_timer_jiffy(struct ha_monitor *ha_mon, enum envs env,
f5587d1b6ec938a Gabriele Monaco 2026-03-30  443                                 
        u64 expire, u64 time_ns)
f5587d1b6ec938a Gabriele Monaco 2026-03-30  444  {
ab2900ae252b2a3 Nam Cao         2026-06-19  445         u64 passed = 
ha_invariant_passed_jiffy(ha_mon, env, time_ns);
f5587d1b6ec938a Gabriele Monaco 2026-03-30  446  
d68b31ce9bd4dda Wen Yang        2026-10-12  447         
mod_timer(&ha_mon->timer,
d68b31ce9bd4dda Wen Yang        2026-10-12  448                   
get_jiffies_64() + ha_time_left(passed, expire));
f5587d1b6ec938a Gabriele Monaco 2026-03-30  449  }
f5587d1b6ec938a Gabriele Monaco 2026-03-30  450  static inline void 
ha_start_timer_ns(struct ha_monitor *ha_mon, enum envs env,
f5587d1b6ec938a Gabriele Monaco 2026-03-30  451                                 
     u64 expire, u64 time_ns)
f5587d1b6ec938a Gabriele Monaco 2026-03-30  452  {
ab2900ae252b2a3 Nam Cao         2026-06-19  453         u64 passed = 
ha_invariant_passed_ns(ha_mon, env, time_ns);
d68b31ce9bd4dda Wen Yang        2026-10-12  454         u64 delay = 
ha_time_left(passed, expire);
f5587d1b6ec938a Gabriele Monaco 2026-03-30  455  
f5587d1b6ec938a Gabriele Monaco 2026-03-30  456         
ha_start_timer_jiffy(ha_mon, ENV_MAX_STORED,
d68b31ce9bd4dda Wen Yang        2026-10-12  457                              
nsecs_to_jiffies(delay + TICK_NSEC - 1), time_ns);
f5587d1b6ec938a Gabriele Monaco 2026-03-30  458  }
f5587d1b6ec938a Gabriele Monaco 2026-03-30  459  /*
f5587d1b6ec938a Gabriele Monaco 2026-03-30  460   * ha_cancel_timer - Cancel 
the timer
f5587d1b6ec938a Gabriele Monaco 2026-03-30  461   *
f5587d1b6ec938a Gabriele Monaco 2026-03-30  462   * Returns:
f5587d1b6ec938a Gabriele Monaco 2026-03-30  463   *  *  1 when the timer was 
active
f5587d1b6ec938a Gabriele Monaco 2026-03-30  464   *  *  0 when the timer was 
not active or running a callback
f5587d1b6ec938a Gabriele Monaco 2026-03-30  465   */
f5587d1b6ec938a Gabriele Monaco 2026-03-30  466  static inline bool 
ha_cancel_timer(struct ha_monitor *ha_mon)
f5587d1b6ec938a Gabriele Monaco 2026-03-30  467  {
f5587d1b6ec938a Gabriele Monaco 2026-03-30  468         return 
timer_delete(&ha_mon->timer);
f5587d1b6ec938a Gabriele Monaco 2026-03-30 @469  }
700782ec8f6589c Gabriele Monaco 2026-06-01  470  static inline void 
ha_cancel_timer_sync(struct ha_monitor *ha_mon)
700782ec8f6589c Gabriele Monaco 2026-06-01  471  {
700782ec8f6589c Gabriele Monaco 2026-06-01  472         
timer_delete_sync(&ha_mon->timer);
700782ec8f6589c Gabriele Monaco 2026-06-01  473  }
f5587d1b6ec938a Gabriele Monaco 2026-03-30  474  #elif HA_TIMER_TYPE == 
HA_TIMER_HRTIMER
f5587d1b6ec938a Gabriele Monaco 2026-03-30  475  /*
f5587d1b6ec938a Gabriele Monaco 2026-03-30  476   * Helper functions to handle 
the monitor timer.
f5587d1b6ec938a Gabriele Monaco 2026-03-30  477   * Not all monitors require a 
timer, in such case the timer will be set up but
f5587d1b6ec938a Gabriele Monaco 2026-03-30  478   * never armed.
f5587d1b6ec938a Gabriele Monaco 2026-03-30  479   * Timers start since the last 
reset of the supplied env or from now if env is
f5587d1b6ec938a Gabriele Monaco 2026-03-30  480   * not an environment 
variable. If env was not initialised no timer starts.
f5587d1b6ec938a Gabriele Monaco 2026-03-30  481   * Timers can expire on any 
CPU unless the monitor is per-cpu,
f5587d1b6ec938a Gabriele Monaco 2026-03-30  482   * where we assume every event 
occurs on the local CPU.
f5587d1b6ec938a Gabriele Monaco 2026-03-30  483   */
f5587d1b6ec938a Gabriele Monaco 2026-03-30  484  static enum hrtimer_restart 
ha_monitor_timer_callback(struct hrtimer *hrtimer)
f5587d1b6ec938a Gabriele Monaco 2026-03-30  485  {
f5587d1b6ec938a Gabriele Monaco 2026-03-30  486         struct ha_monitor 
*ha_mon = container_of(hrtimer, struct ha_monitor, hrtimer);
f5587d1b6ec938a Gabriele Monaco 2026-03-30  487  
f5587d1b6ec938a Gabriele Monaco 2026-03-30  488         
__ha_monitor_timer_callback(ha_mon);
f5587d1b6ec938a Gabriele Monaco 2026-03-30  489         return 
HRTIMER_NORESTART;
f5587d1b6ec938a Gabriele Monaco 2026-03-30  490  }
f5587d1b6ec938a Gabriele Monaco 2026-03-30  491  static inline void 
ha_setup_timer(struct ha_monitor *ha_mon)
f5587d1b6ec938a Gabriele Monaco 2026-03-30  492  {
f5587d1b6ec938a Gabriele Monaco 2026-03-30  493         
hrtimer_setup(&ha_mon->hrtimer, ha_monitor_timer_callback,
f5587d1b6ec938a Gabriele Monaco 2026-03-30  494                       
CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD);
f5587d1b6ec938a Gabriele Monaco 2026-03-30  495  }
f5587d1b6ec938a Gabriele Monaco 2026-03-30  496  static inline void 
ha_start_timer_ns(struct ha_monitor *ha_mon, enum envs env,
f5587d1b6ec938a Gabriele Monaco 2026-03-30  497                                 
     u64 expire, u64 time_ns)
f5587d1b6ec938a Gabriele Monaco 2026-03-30  498  {
f5587d1b6ec938a Gabriele Monaco 2026-03-30  499         int mode = 
HRTIMER_MODE_REL_HARD;
ab2900ae252b2a3 Nam Cao         2026-06-19  500         u64 passed = 
ha_invariant_passed_ns(ha_mon, env, time_ns);
f5587d1b6ec938a Gabriele Monaco 2026-03-30  501  
f5587d1b6ec938a Gabriele Monaco 2026-03-30  502         if (RV_MON_TYPE == 
RV_MON_PER_CPU)
f5587d1b6ec938a Gabriele Monaco 2026-03-30  503                 mode |= 
HRTIMER_MODE_PINNED;
d68b31ce9bd4dda Wen Yang        2026-10-12  504         
hrtimer_start(&ha_mon->hrtimer,
d68b31ce9bd4dda Wen Yang        2026-10-12  505                       
ns_to_ktime(ha_time_left(passed, expire)), mode);
f5587d1b6ec938a Gabriele Monaco 2026-03-30  506  }
f5587d1b6ec938a Gabriele Monaco 2026-03-30  507  static inline void 
ha_start_timer_jiffy(struct ha_monitor *ha_mon, enum envs env,
f5587d1b6ec938a Gabriele Monaco 2026-03-30  508                                 
        u64 expire, u64 time_ns)
f5587d1b6ec938a Gabriele Monaco 2026-03-30  509  {
ab2900ae252b2a3 Nam Cao         2026-06-19  510         u64 passed = 
ha_invariant_passed_jiffy(ha_mon, env, time_ns);
f5587d1b6ec938a Gabriele Monaco 2026-03-30  511  
f5587d1b6ec938a Gabriele Monaco 2026-03-30  512         
ha_start_timer_ns(ha_mon, ENV_MAX_STORED,
d68b31ce9bd4dda Wen Yang        2026-10-12  513                           
jiffies_to_nsecs(ha_time_left(passed, expire)),
d68b31ce9bd4dda Wen Yang        2026-10-12  514                           
time_ns);
f5587d1b6ec938a Gabriele Monaco 2026-03-30  515  }
f5587d1b6ec938a Gabriele Monaco 2026-03-30  516  /*
f5587d1b6ec938a Gabriele Monaco 2026-03-30  517   * ha_cancel_timer - Cancel 
the timer
f5587d1b6ec938a Gabriele Monaco 2026-03-30  518   *
f5587d1b6ec938a Gabriele Monaco 2026-03-30  519   * Returns:
f5587d1b6ec938a Gabriele Monaco 2026-03-30  520   *  *  1 when the timer was 
active
f5587d1b6ec938a Gabriele Monaco 2026-03-30  521   *  *  0 when the timer was 
not active or running a callback
f5587d1b6ec938a Gabriele Monaco 2026-03-30  522   */
f5587d1b6ec938a Gabriele Monaco 2026-03-30  523  static inline bool 
ha_cancel_timer(struct ha_monitor *ha_mon)
f5587d1b6ec938a Gabriele Monaco 2026-03-30  524  {
f5587d1b6ec938a Gabriele Monaco 2026-03-30  525         return 
hrtimer_try_to_cancel(&ha_mon->hrtimer) == 1;
f5587d1b6ec938a Gabriele Monaco 2026-03-30  526  }
700782ec8f6589c Gabriele Monaco 2026-06-01  527  static inline void 
ha_cancel_timer_sync(struct ha_monitor *ha_mon)
700782ec8f6589c Gabriele Monaco 2026-06-01  528  {
700782ec8f6589c Gabriele Monaco 2026-06-01  529         
hrtimer_cancel(&ha_mon->hrtimer);
700782ec8f6589c Gabriele Monaco 2026-06-01  530  }
f5587d1b6ec938a Gabriele Monaco 2026-03-30  531  #else /* HA_TIMER_NONE */
f5587d1b6ec938a Gabriele Monaco 2026-03-30  532  /*
f5587d1b6ec938a Gabriele Monaco 2026-03-30  533   * Start function is 
intentionally not defined, monitors using timers must
f5587d1b6ec938a Gabriele Monaco 2026-03-30  534   * set HA_TIMER_TYPE to either 
HA_TIMER_WHEEL or HA_TIMER_HRTIMER.
f5587d1b6ec938a Gabriele Monaco 2026-03-30  535   */
f5587d1b6ec938a Gabriele Monaco 2026-03-30  536  static inline void 
ha_setup_timer(struct ha_monitor *ha_mon) { }
f5587d1b6ec938a Gabriele Monaco 2026-03-30  537  static inline bool 
ha_cancel_timer(struct ha_monitor *ha_mon)
f5587d1b6ec938a Gabriele Monaco 2026-03-30  538  {
f5587d1b6ec938a Gabriele Monaco 2026-03-30  539         return false;
f5587d1b6ec938a Gabriele Monaco 2026-03-30  540  }
700782ec8f6589c Gabriele Monaco 2026-06-01  541  static inline void 
ha_cancel_timer_sync(struct ha_monitor *ha_mon) { }
f5587d1b6ec938a Gabriele Monaco 2026-03-30  542  #endif
f5587d1b6ec938a Gabriele Monaco 2026-03-30  543  

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

Reply via email to