linux/include/linux/rcutiny.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+ */
   2/*
   3 * Read-Copy Update mechanism for mutual exclusion, the Bloatwatch edition.
   4 *
   5 * Copyright IBM Corporation, 2008
   6 *
   7 * Author: Paul E. McKenney <paulmck@linux.ibm.com>
   8 *
   9 * For detailed explanation of Read-Copy Update mechanism see -
  10 *              Documentation/RCU
  11 */
  12#ifndef __LINUX_TINY_H
  13#define __LINUX_TINY_H
  14
  15#include <asm/param.h> /* for HZ */
  16
  17/* Never flag non-existent other CPUs! */
  18static inline bool rcu_eqs_special_set(int cpu) { return false; }
  19
  20unsigned long get_state_synchronize_rcu(void);
  21unsigned long start_poll_synchronize_rcu(void);
  22bool poll_state_synchronize_rcu(unsigned long oldstate);
  23
  24static inline void cond_synchronize_rcu(unsigned long oldstate)
  25{
  26        might_sleep();
  27}
  28
  29extern void rcu_barrier(void);
  30
  31static inline void synchronize_rcu_expedited(void)
  32{
  33        synchronize_rcu();
  34}
  35
  36/*
  37 * Add one more declaration of kvfree() here. It is
  38 * not so straight forward to just include <linux/mm.h>
  39 * where it is defined due to getting many compile
  40 * errors caused by that include.
  41 */
  42extern void kvfree(const void *addr);
  43
  44static inline void kvfree_call_rcu(struct rcu_head *head, rcu_callback_t func)
  45{
  46        if (head) {
  47                call_rcu(head, func);
  48                return;
  49        }
  50
  51        // kvfree_rcu(one_arg) call.
  52        might_sleep();
  53        synchronize_rcu();
  54        kvfree((void *) func);
  55}
  56
  57void rcu_qs(void);
  58
  59static inline void rcu_softirq_qs(void)
  60{
  61        rcu_qs();
  62}
  63
  64#define rcu_note_context_switch(preempt) \
  65        do { \
  66                rcu_qs(); \
  67                rcu_tasks_qs(current, (preempt)); \
  68        } while (0)
  69
  70static inline int rcu_needs_cpu(u64 basemono, u64 *nextevt)
  71{
  72        *nextevt = KTIME_MAX;
  73        return 0;
  74}
  75
  76/*
  77 * Take advantage of the fact that there is only one CPU, which
  78 * allows us to ignore virtualization-based context switches.
  79 */
  80static inline void rcu_virt_note_context_switch(int cpu) { }
  81static inline void rcu_cpu_stall_reset(void) { }
  82static inline int rcu_jiffies_till_stall_check(void) { return 21 * HZ; }
  83static inline void rcu_idle_enter(void) { }
  84static inline void rcu_idle_exit(void) { }
  85static inline void rcu_irq_enter(void) { }
  86static inline void rcu_irq_exit_irqson(void) { }
  87static inline void rcu_irq_enter_irqson(void) { }
  88static inline void rcu_irq_exit(void) { }
  89static inline void rcu_irq_exit_preempt(void) { }
  90static inline void rcu_irq_exit_check_preempt(void) { }
  91#define rcu_is_idle_cpu(cpu) \
  92        (is_idle_task(current) && !in_nmi() && !in_irq() && !in_serving_softirq())
  93static inline void exit_rcu(void) { }
  94static inline bool rcu_preempt_need_deferred_qs(struct task_struct *t)
  95{
  96        return false;
  97}
  98static inline void rcu_preempt_deferred_qs(struct task_struct *t) { }
  99#ifdef CONFIG_SRCU
 100void rcu_scheduler_starting(void);
 101#else /* #ifndef CONFIG_SRCU */
 102static inline void rcu_scheduler_starting(void) { }
 103#endif /* #else #ifndef CONFIG_SRCU */
 104static inline void rcu_end_inkernel_boot(void) { }
 105static inline bool rcu_inkernel_boot_has_ended(void) { return true; }
 106static inline bool rcu_is_watching(void) { return true; }
 107static inline void rcu_momentary_dyntick_idle(void) { }
 108static inline void kfree_rcu_scheduler_running(void) { }
 109static inline bool rcu_gp_might_be_stalled(void) { return false; }
 110
 111/* Avoid RCU read-side critical sections leaking across. */
 112static inline void rcu_all_qs(void) { barrier(); }
 113
 114/* RCUtree hotplug events */
 115#define rcutree_prepare_cpu      NULL
 116#define rcutree_online_cpu       NULL
 117#define rcutree_offline_cpu      NULL
 118#define rcutree_dead_cpu         NULL
 119#define rcutree_dying_cpu        NULL
 120static inline void rcu_cpu_starting(unsigned int cpu) { }
 121
 122#endif /* __LINUX_RCUTINY_H */
 123