Document grace period polling in rcu-api.md
[urcu.git] / doc / rcu-api.md
CommitLineData
dcb9c05a
PP
1Userspace RCU API
2=================
3
4by Mathieu Desnoyers and Paul E. McKenney
5
6
7API
8---
9
10```c
11void rcu_init(void);
12```
13
14This must be called before any of the following functions
15are invoked.
16
17
18```c
19void rcu_read_lock(void);
20```
21
22Begin an RCU read-side critical section. These critical
23sections may be nested.
24
25
26```c
27void rcu_read_unlock(void);
28```
29
30End an RCU read-side critical section.
31
32
33```c
34void rcu_register_thread(void);
35```
36
37Each thread must invoke this function before its first call to
38`rcu_read_lock()`. Threads that never call `rcu_read_lock()` need
39not invoke this function. In addition, `rcu-bp` ("bullet proof"
40RCU) does not require any thread to invoke `rcu_register_thread()`.
41
42
43```c
44void rcu_unregister_thread(void);
45```
46
47Each thread that invokes `rcu_register_thread()` must invoke
48`rcu_unregister_thread()` before `invoking pthread_exit()`
49or before returning from its top-level function.
50
51
52```c
53void synchronize_rcu(void);
54```
55
56Wait until every pre-existing RCU read-side critical section
57has completed. Note that this primitive will not necessarily
58wait for RCU read-side critical sections that have not yet
59started: this is not a reader-writer lock. The duration
60actually waited is called an RCU grace period.
61
62
a88a3a86
MD
63```c
64struct urcu_gp_poll_state start_poll_synchronize_rcu(void);
65```
66
67Start polling on grace period. The returned poll state should be
68queried using `poll_state_synchronize_rcu` to check whether the
69grace period has completed.
70
71`start_poll_synchronize_rcu` should be called from registered RCU
72read-side threads. For the QSBR flavor, the caller should be online.
73
74
75```c
76bool poll_state_synchronize_rcu(struct urcu_gp_poll_state state);
77```
78
79Poll the grace period state. Return true if quiescence was reached since
80the grace period was started, return false otherwise.
81
82
dcb9c05a
PP
83```c
84void call_rcu(struct rcu_head *head,
85 void (*func)(struct rcu_head *head));
86```
87
88Registers the callback indicated by "head". This means
89that `func` will be invoked after the end of a future
90RCU grace period. The `rcu_head` structure referenced
91by `head` will normally be a field in a larger RCU-protected
92structure. A typical implementation of `func` is as
93follows:
94
95```c
96void func(struct rcu_head *head)
97{
98 struct foo *p = container_of(head, struct foo, rcu);
99
100 free(p);
101}
102```
103
104This RCU callback function can be registered as follows
105given a pointer `p` to the enclosing structure:
106
107```c
108call_rcu(&p->rcu, func);
109```
110
111`call_rcu` should be called from registered RCU read-side threads.
112For the QSBR flavor, the caller should be online.
113
114
115```c
116void rcu_barrier(void);
117```
118
119Wait for all `call_rcu()` work initiated prior to `rcu_barrier()` by
120_any_ thread on the system to have completed before `rcu_barrier()`
121returns. `rcu_barrier()` should never be called from a `call_rcu()`
122thread. This function can be used, for instance, to ensure that
123all memory reclaim involving a shared object has completed
124before allowing `dlclose()` of this shared object to complete.
125
126
127```c
128struct call_rcu_data *create_call_rcu_data(unsigned long flags,
129 int cpu_affinity);
130```
131
132Returns a handle that can be passed to the following
133primitives. The `flags` argument can be zero, or can be
134`URCU_CALL_RCU_RT` if the worker threads associated with the
135new helper thread are to get real-time response. The argument
136`cpu_affinity` specifies a CPU on which the `call_rcu` thread should
137be affined to. It is ignored if negative.
138
139
140```c
141void call_rcu_data_free(struct call_rcu_data *crdp);
142```
143
144Terminates a `call_rcu()` helper thread and frees its associated
145data. The caller must have ensured that this thread is no longer
146in use, for example, by passing `NULL` to `set_thread_call_rcu_data()`
147and `set_cpu_call_rcu_data()` as required.
148
149
150```c
151struct call_rcu_data *get_default_call_rcu_data(void);
152```
153
154Returns the handle for the default `call_rcu()` helper thread.
155Creates it if necessary.
156
157
158```c
159struct call_rcu_data *get_cpu_call_rcu_data(int cpu);
160```
161
162Returns the handle for the current CPU's `call_rcu()` helper
163thread, or `NULL` if the current CPU has no helper thread
164currently assigned. The call to this function and use of the
165returned `call_rcu_data` should be protected by RCU read-side
166lock.
167
168
169```c
170struct call_rcu_data *get_thread_call_rcu_data(void);
171```
172
173Returns the handle for the current thread's hard-assigned
174`call_rcu()` helper thread, or `NULL` if the current thread is
175instead using a per-CPU or the default helper thread.
176
177
178```c
179struct call_rcu_data *get_call_rcu_data(void);
180```
181
182Returns the handle for the current thread's `call_rcu()` helper
183thread, which is either, in increasing order of preference:
184per-thread hard-assigned helper thread, per-CPU helper thread,
185or default helper thread. `get_call_rcu_data` should be called
186from registered RCU read-side threads. For the QSBR flavor, the
187caller should be online.
188
189
190```c
191pthread_t get_call_rcu_thread(struct call_rcu_data *crdp);
192```
193
194Returns the helper thread's pthread identifier linked to a call
195rcu helper thread data.
196
197
198```c
199void set_thread_call_rcu_data(struct call_rcu_data *crdp);
200```
201
202Sets the current thread's hard-assigned `call_rcu()` helper to the
203handle specified by `crdp`. Note that `crdp` can be `NULL` to
204disassociate this thread from its helper. Once a thread is
205disassociated from its helper, further `call_rcu()` invocations
206use the current CPU's helper if there is one and the default
207helper otherwise.
208
209
210```c
211int set_cpu_call_rcu_data(int cpu, struct call_rcu_data *crdp);
212```
213
214Sets the specified CPU's `call_rcu()` helper to the handle
215specified by `crdp`. Again, `crdp` can be `NULL` to disassociate
216this CPU from its helper thread. Once a CPU has been
217disassociated from its helper, further `call_rcu()` invocations
218that would otherwise have used this CPU's helper will instead
219use the default helper.
220
221The caller must wait for a grace-period to pass between return from
222`set_cpu_call_rcu_data()` and call to `call_rcu_data_free()` passing the
223previous call rcu data as argument.
224
225
226```c
227int create_all_cpu_call_rcu_data(unsigned long flags);
228```
229
230Creates a separate `call_rcu()` helper thread for each CPU.
231After this primitive is invoked, the global default `call_rcu()`
232helper thread will not be called.
233
234The `set_thread_call_rcu_data()`, `set_cpu_call_rcu_data()`, and
235`create_all_cpu_call_rcu_data()` functions may be combined to set up
236pretty much any desired association between worker and `call_rcu()`
237helper threads. If a given executable calls only `call_rcu()`,
238then that executable will have only the single global default
239`call_rcu()` helper thread. This will suffice in most cases.
240
241
242```c
243void free_all_cpu_call_rcu_data(void);
244```
245
246Clean up all the per-CPU `call_rcu` threads. Should be paired with
247`create_all_cpu_call_rcu_data()` to perform teardown. Note that
248this function invokes `synchronize_rcu()` internally, so the
249caller should be careful not to hold mutexes (or mutexes within a
250dependency chain) that are also taken within a RCU read-side
251critical section, or in a section where QSBR threads are online.
252
253
254```c
ceb592f9
MD
255void call_rcu_before_fork_parent(void);
256void call_rcu_after_fork_parent(void);
dcb9c05a
PP
257void call_rcu_after_fork_child(void);
258```
259
260Should be used as `pthread_atfork()` handler for programs using
261`call_rcu` and performing `fork()` or `clone()` without a following
262`exec()`.
This page took 0.042189 seconds and 4 git commands to generate.