#define kfree_rcu(ptr, rcu_head)                                      \
        __kfree_rcu(&((ptr)->rcu_head), offsetof(typeof(*(ptr)), rcu_head))
  
 -#if defined(CONFIG_TINY_RCU) || defined(CONFIG_RCU_NOCB_CPU_ALL)
 +#ifdef CONFIG_TINY_RCU
- static inline int rcu_needs_cpu(unsigned long *delta_jiffies)
+ static inline int rcu_needs_cpu(u64 basemono, u64 *nextevt)
  {
-       *delta_jiffies = ULONG_MAX;
+       *nextevt = KTIME_MAX;
        return 0;
  }
 -#endif /* #if defined(CONFIG_TINY_RCU) || defined(CONFIG_RCU_NOCB_CPU_ALL) */
 +#endif /* #ifdef CONFIG_TINY_RCU */
  
  #if defined(CONFIG_RCU_NOCB_CPU_ALL)
  static inline bool rcu_is_nocb_cpu(int cpu) { return true; }
 
  #define __LINUX_RCUTREE_H
  
  void rcu_note_context_switch(void);
- int rcu_needs_cpu(unsigned long *delta_jiffies);
 -#ifndef CONFIG_RCU_NOCB_CPU_ALL
+ int rcu_needs_cpu(u64 basem, u64 *nextevt);
 -#endif /* #ifndef CONFIG_RCU_NOCB_CPU_ALL */
  void rcu_cpu_stall_reset(void);
  
  /*
 
   * Because we not have RCU_FAST_NO_HZ, just check whether this CPU needs
   * any flavor of RCU.
   */
- int rcu_needs_cpu(unsigned long *delta_jiffies)
 -#ifndef CONFIG_RCU_NOCB_CPU_ALL
+ int rcu_needs_cpu(u64 basemono, u64 *nextevt)
  {
-       *delta_jiffies = ULONG_MAX;
+       *nextevt = KTIME_MAX;
 -      return rcu_cpu_has_callbacks(NULL);
 +      return IS_ENABLED(CONFIG_RCU_NOCB_CPU_ALL)
 +             ? 0 : rcu_cpu_has_callbacks(NULL);
  }
 -#endif /* #ifndef CONFIG_RCU_NOCB_CPU_ALL */
  
  /*
   * Because we do not have RCU_FAST_NO_HZ, don't bother cleaning up
   *
   * The caller must have disabled interrupts.
   */
- int rcu_needs_cpu(unsigned long *dj)
 -#ifndef CONFIG_RCU_NOCB_CPU_ALL
+ int rcu_needs_cpu(u64 basemono, u64 *nextevt)
  {
        struct rcu_dynticks *rdtp = this_cpu_ptr(&rcu_dynticks);
+       unsigned long dj;
  
-               *dj = ULONG_MAX;
 +      if (IS_ENABLED(CONFIG_RCU_NOCB_CPU_ALL)) {
++              *nextevt = KTIME_MAX;
 +              return 0;
 +      }
 +
        /* Snapshot to detect later posting of non-lazy callback. */
        rdtp->nonlazy_posted_snap = rdtp->nonlazy_posted;
  
  
        /* Request timer delay depending on laziness, and round. */
        if (!rdtp->all_lazy) {
-               *dj = round_up(rcu_idle_gp_delay + jiffies,
+               dj = round_up(rcu_idle_gp_delay + jiffies,
                               rcu_idle_gp_delay) - jiffies;
        } else {
-               *dj = round_jiffies(rcu_idle_lazy_gp_delay + jiffies) - jiffies;
+               dj = round_jiffies(rcu_idle_lazy_gp_delay + jiffies) - jiffies;
        }
+       *nextevt = basemono + dj * TICK_NSEC;
        return 0;
  }
 -#endif /* #ifndef CONFIG_RCU_NOCB_CPU_ALL */
  
  /*
   * Prepare a CPU for idle from an RCU perspective.  The first major task