Blame view

include/linux/rcu_sync.h 2.57 KB
cc44ca848   Oleg Nesterov   rcu: Create rcu_s...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
  /*
   * RCU-based infrastructure for lightweight reader-writer locking
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, you can access it online at
   * http://www.gnu.org/licenses/gpl-2.0.html.
   *
   * Copyright (c) 2015, Red Hat, Inc.
   *
   * Author: Oleg Nesterov <oleg@redhat.com>
   */
  
  #ifndef _LINUX_RCU_SYNC_H_
  #define _LINUX_RCU_SYNC_H_
  
  #include <linux/wait.h>
  #include <linux/rcupdate.h>
82e8c565b   Oleg Nesterov   rcu_sync: Simplif...
28
  enum rcu_sync_type { RCU_SYNC, RCU_SCHED_SYNC, RCU_BH_SYNC };
cc44ca848   Oleg Nesterov   rcu: Create rcu_s...
29
30
31
32
33
34
35
36
  /* Structure to mediate between updaters and fastpath-using readers.  */
  struct rcu_sync {
  	int			gp_state;
  	int			gp_count;
  	wait_queue_head_t	gp_wait;
  
  	int			cb_state;
  	struct rcu_head		cb_head;
82e8c565b   Oleg Nesterov   rcu_sync: Simplif...
37
  	enum rcu_sync_type	gp_type;
cc44ca848   Oleg Nesterov   rcu: Create rcu_s...
38
  };
4bace7344   Oleg Nesterov   rcu_sync: Cleanup...
39
  extern void rcu_sync_lockdep_assert(struct rcu_sync *);
3a518b76a   Oleg Nesterov   rcu_sync: Add CON...
40

cc44ca848   Oleg Nesterov   rcu: Create rcu_s...
41
42
43
44
45
46
47
48
49
50
  /**
   * rcu_sync_is_idle() - Are readers permitted to use their fastpaths?
   * @rsp: Pointer to rcu_sync structure to use for synchronization
   *
   * Returns true if readers are permitted to use their fastpaths.
   * Must be invoked within an RCU read-side critical section whose
   * flavor matches that of the rcu_sync struture.
   */
  static inline bool rcu_sync_is_idle(struct rcu_sync *rsp)
  {
3a518b76a   Oleg Nesterov   rcu_sync: Add CON...
51
  #ifdef CONFIG_PROVE_RCU
4bace7344   Oleg Nesterov   rcu_sync: Cleanup...
52
  	rcu_sync_lockdep_assert(rsp);
3a518b76a   Oleg Nesterov   rcu_sync: Add CON...
53
  #endif
4bace7344   Oleg Nesterov   rcu_sync: Cleanup...
54
  	return !rsp->gp_state; /* GP_IDLE */
cc44ca848   Oleg Nesterov   rcu: Create rcu_s...
55
  }
cc44ca848   Oleg Nesterov   rcu: Create rcu_s...
56
  extern void rcu_sync_init(struct rcu_sync *, enum rcu_sync_type);
3942a9bd7   Peter Zijlstra   locking, rcu, cgr...
57
  extern void rcu_sync_enter_start(struct rcu_sync *);
cc44ca848   Oleg Nesterov   rcu: Create rcu_s...
58
59
  extern void rcu_sync_enter(struct rcu_sync *);
  extern void rcu_sync_exit(struct rcu_sync *);
07899a6e5   Oleg Nesterov   rcu_sync: Introdu...
60
  extern void rcu_sync_dtor(struct rcu_sync *);
cc44ca848   Oleg Nesterov   rcu: Create rcu_s...
61

82e8c565b   Oleg Nesterov   rcu_sync: Simplif...
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
  #define __RCU_SYNC_INITIALIZER(name, type) {				\
  		.gp_state = 0,						\
  		.gp_count = 0,						\
  		.gp_wait = __WAIT_QUEUE_HEAD_INITIALIZER(name.gp_wait),	\
  		.cb_state = 0,						\
  		.gp_type = type,					\
  	}
  
  #define	__DEFINE_RCU_SYNC(name, type)	\
  	struct rcu_sync_struct name = __RCU_SYNC_INITIALIZER(name, type)
  
  #define DEFINE_RCU_SYNC(name)		\
  	__DEFINE_RCU_SYNC(name, RCU_SYNC)
  
  #define DEFINE_RCU_SCHED_SYNC(name)	\
  	__DEFINE_RCU_SYNC(name, RCU_SCHED_SYNC)
  
  #define DEFINE_RCU_BH_SYNC(name)	\
  	__DEFINE_RCU_SYNC(name, RCU_BH_SYNC)
cc44ca848   Oleg Nesterov   rcu: Create rcu_s...
81
  #endif /* _LINUX_RCU_SYNC_H_ */