diff options
Diffstat (limited to 'include/linux/srcu.h')
| -rw-r--r-- | include/linux/srcu.h | 48 |
1 files changed, 39 insertions, 9 deletions
diff --git a/include/linux/srcu.h b/include/linux/srcu.h index d3d5fa54f25..55a5c52cbb2 100644 --- a/include/linux/srcu.h +++ b/include/linux/srcu.h | |||
| @@ -29,26 +29,35 @@ | |||
| 29 | 29 | ||
| 30 | #include <linux/mutex.h> | 30 | #include <linux/mutex.h> |
| 31 | #include <linux/rcupdate.h> | 31 | #include <linux/rcupdate.h> |
| 32 | #include <linux/workqueue.h> | ||
| 32 | 33 | ||
| 33 | struct srcu_struct_array { | 34 | struct srcu_struct_array { |
| 34 | int c[2]; | 35 | unsigned long c[2]; |
| 36 | unsigned long seq[2]; | ||
| 37 | }; | ||
| 38 | |||
| 39 | struct rcu_batch { | ||
| 40 | struct rcu_head *head, **tail; | ||
| 35 | }; | 41 | }; |
| 36 | 42 | ||
| 37 | struct srcu_struct { | 43 | struct srcu_struct { |
| 38 | int completed; | 44 | unsigned completed; |
| 39 | struct srcu_struct_array __percpu *per_cpu_ref; | 45 | struct srcu_struct_array __percpu *per_cpu_ref; |
| 40 | struct mutex mutex; | 46 | spinlock_t queue_lock; /* protect ->batch_queue, ->running */ |
| 47 | bool running; | ||
| 48 | /* callbacks just queued */ | ||
| 49 | struct rcu_batch batch_queue; | ||
| 50 | /* callbacks try to do the first check_zero */ | ||
| 51 | struct rcu_batch batch_check0; | ||
| 52 | /* callbacks done with the first check_zero and the flip */ | ||
| 53 | struct rcu_batch batch_check1; | ||
| 54 | struct rcu_batch batch_done; | ||
| 55 | struct delayed_work work; | ||
| 41 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | 56 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
| 42 | struct lockdep_map dep_map; | 57 | struct lockdep_map dep_map; |
| 43 | #endif /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ | 58 | #endif /* #ifdef CONFIG_DEBUG_LOCK_ALLOC */ |
| 44 | }; | 59 | }; |
| 45 | 60 | ||
| 46 | #ifndef CONFIG_PREEMPT | ||
| 47 | #define srcu_barrier() barrier() | ||
| 48 | #else /* #ifndef CONFIG_PREEMPT */ | ||
| 49 | #define srcu_barrier() | ||
| 50 | #endif /* #else #ifndef CONFIG_PREEMPT */ | ||
| 51 | |||
| 52 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | 61 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
| 53 | 62 | ||
| 54 | int __init_srcu_struct(struct srcu_struct *sp, const char *name, | 63 | int __init_srcu_struct(struct srcu_struct *sp, const char *name, |
| @@ -67,12 +76,33 @@ int init_srcu_struct(struct srcu_struct *sp); | |||
| 67 | 76 | ||
| 68 | #endif /* #else #ifdef CONFIG_DEBUG_LOCK_ALLOC */ | 77 | #endif /* #else #ifdef CONFIG_DEBUG_LOCK_ALLOC */ |
| 69 | 78 | ||
| 79 | /** | ||
| 80 | * call_srcu() - Queue a callback for invocation after an SRCU grace period | ||
| 81 | * @sp: srcu_struct in queue the callback | ||
| 82 | * @head: structure to be used for queueing the SRCU callback. | ||
| 83 | * @func: function to be invoked after the SRCU grace period | ||
| 84 | * | ||
| 85 | * The callback function will be invoked some time after a full SRCU | ||
| 86 | * grace period elapses, in other words after all pre-existing SRCU | ||
| 87 | * read-side critical sections have completed. However, the callback | ||
| 88 | * function might well execute concurrently with other SRCU read-side | ||
| 89 | * critical sections that started after call_srcu() was invoked. SRCU | ||
| 90 | * read-side critical sections are delimited by srcu_read_lock() and | ||
| 91 | * srcu_read_unlock(), and may be nested. | ||
| 92 | * | ||
| 93 | * The callback will be invoked from process context, but must nevertheless | ||
| 94 | * be fast and must not block. | ||
| 95 | */ | ||
| 96 | void call_srcu(struct srcu_struct *sp, struct rcu_head *head, | ||
| 97 | void (*func)(struct rcu_head *head)); | ||
| 98 | |||
| 70 | void cleanup_srcu_struct(struct srcu_struct *sp); | 99 | void cleanup_srcu_struct(struct srcu_struct *sp); |
| 71 | int __srcu_read_lock(struct srcu_struct *sp) __acquires(sp); | 100 | int __srcu_read_lock(struct srcu_struct *sp) __acquires(sp); |
| 72 | void __srcu_read_unlock(struct srcu_struct *sp, int idx) __releases(sp); | 101 | void __srcu_read_unlock(struct srcu_struct *sp, int idx) __releases(sp); |
| 73 | void synchronize_srcu(struct srcu_struct *sp); | 102 | void synchronize_srcu(struct srcu_struct *sp); |
| 74 | void synchronize_srcu_expedited(struct srcu_struct *sp); | 103 | void synchronize_srcu_expedited(struct srcu_struct *sp); |
| 75 | long srcu_batches_completed(struct srcu_struct *sp); | 104 | long srcu_batches_completed(struct srcu_struct *sp); |
| 105 | void srcu_barrier(struct srcu_struct *sp); | ||
| 76 | 106 | ||
| 77 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | 107 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
| 78 | 108 | ||
