xref: /openbmc/linux/kernel/rcu/rcu_segcblist.c (revision 5d0e4d78)
1 /*
2  * RCU segmented callback lists, function definitions
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, you can access it online at
16  * http://www.gnu.org/licenses/gpl-2.0.html.
17  *
18  * Copyright IBM Corporation, 2017
19  *
20  * Authors: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
21  */
22 
23 #include <linux/types.h>
24 #include <linux/kernel.h>
25 #include <linux/interrupt.h>
26 
27 #include "rcu_segcblist.h"
28 
29 /* Initialize simple callback list. */
30 void rcu_cblist_init(struct rcu_cblist *rclp)
31 {
32 	rclp->head = NULL;
33 	rclp->tail = &rclp->head;
34 	rclp->len = 0;
35 	rclp->len_lazy = 0;
36 }
37 
38 /*
39  * Debug function to actually count the number of callbacks.
40  * If the number exceeds the limit specified, return -1.
41  */
42 long rcu_cblist_count_cbs(struct rcu_cblist *rclp, long lim)
43 {
44 	int cnt = 0;
45 	struct rcu_head **rhpp = &rclp->head;
46 
47 	for (;;) {
48 		if (!*rhpp)
49 			return cnt;
50 		if (++cnt > lim)
51 			return -1;
52 		rhpp = &(*rhpp)->next;
53 	}
54 }
55 
56 /*
57  * Dequeue the oldest rcu_head structure from the specified callback
58  * list.  This function assumes that the callback is non-lazy, but
59  * the caller can later invoke rcu_cblist_dequeued_lazy() if it
60  * finds otherwise (and if it cares about laziness).  This allows
61  * different users to have different ways of determining laziness.
62  */
63 struct rcu_head *rcu_cblist_dequeue(struct rcu_cblist *rclp)
64 {
65 	struct rcu_head *rhp;
66 
67 	rhp = rclp->head;
68 	if (!rhp)
69 		return NULL;
70 	rclp->len--;
71 	rclp->head = rhp->next;
72 	if (!rclp->head)
73 		rclp->tail = &rclp->head;
74 	return rhp;
75 }
76 
77 /*
78  * Initialize an rcu_segcblist structure.
79  */
80 void rcu_segcblist_init(struct rcu_segcblist *rsclp)
81 {
82 	int i;
83 
84 	BUILD_BUG_ON(RCU_NEXT_TAIL + 1 != ARRAY_SIZE(rsclp->gp_seq));
85 	BUILD_BUG_ON(ARRAY_SIZE(rsclp->tails) != ARRAY_SIZE(rsclp->gp_seq));
86 	rsclp->head = NULL;
87 	for (i = 0; i < RCU_CBLIST_NSEGS; i++)
88 		rsclp->tails[i] = &rsclp->head;
89 	rsclp->len = 0;
90 	rsclp->len_lazy = 0;
91 }
92 
93 /*
94  * Disable the specified rcu_segcblist structure, so that callbacks can
95  * no longer be posted to it.  This structure must be empty.
96  */
97 void rcu_segcblist_disable(struct rcu_segcblist *rsclp)
98 {
99 	WARN_ON_ONCE(!rcu_segcblist_empty(rsclp));
100 	WARN_ON_ONCE(rcu_segcblist_n_cbs(rsclp));
101 	WARN_ON_ONCE(rcu_segcblist_n_lazy_cbs(rsclp));
102 	rsclp->tails[RCU_NEXT_TAIL] = NULL;
103 }
104 
105 /*
106  * Is the specified segment of the specified rcu_segcblist structure
107  * empty of callbacks?
108  */
109 bool rcu_segcblist_segempty(struct rcu_segcblist *rsclp, int seg)
110 {
111 	if (seg == RCU_DONE_TAIL)
112 		return &rsclp->head == rsclp->tails[RCU_DONE_TAIL];
113 	return rsclp->tails[seg - 1] == rsclp->tails[seg];
114 }
115 
116 /*
117  * Does the specified rcu_segcblist structure contain callbacks that
118  * are ready to be invoked?
119  */
120 bool rcu_segcblist_ready_cbs(struct rcu_segcblist *rsclp)
121 {
122 	return rcu_segcblist_is_enabled(rsclp) &&
123 	       &rsclp->head != rsclp->tails[RCU_DONE_TAIL];
124 }
125 
126 /*
127  * Does the specified rcu_segcblist structure contain callbacks that
128  * are still pending, that is, not yet ready to be invoked?
129  */
130 bool rcu_segcblist_pend_cbs(struct rcu_segcblist *rsclp)
131 {
132 	return rcu_segcblist_is_enabled(rsclp) &&
133 	       !rcu_segcblist_restempty(rsclp, RCU_DONE_TAIL);
134 }
135 
136 /*
137  * Dequeue and return the first ready-to-invoke callback.  If there
138  * are no ready-to-invoke callbacks, return NULL.  Disables interrupts
139  * to avoid interference.  Does not protect from interference from other
140  * CPUs or tasks.
141  */
142 struct rcu_head *rcu_segcblist_dequeue(struct rcu_segcblist *rsclp)
143 {
144 	unsigned long flags;
145 	int i;
146 	struct rcu_head *rhp;
147 
148 	local_irq_save(flags);
149 	if (!rcu_segcblist_ready_cbs(rsclp)) {
150 		local_irq_restore(flags);
151 		return NULL;
152 	}
153 	rhp = rsclp->head;
154 	BUG_ON(!rhp);
155 	rsclp->head = rhp->next;
156 	for (i = RCU_DONE_TAIL; i < RCU_CBLIST_NSEGS; i++) {
157 		if (rsclp->tails[i] != &rhp->next)
158 			break;
159 		rsclp->tails[i] = &rsclp->head;
160 	}
161 	smp_mb(); /* Dequeue before decrement for rcu_barrier(). */
162 	WRITE_ONCE(rsclp->len, rsclp->len - 1);
163 	local_irq_restore(flags);
164 	return rhp;
165 }
166 
167 /*
168  * Account for the fact that a previously dequeued callback turned out
169  * to be marked as lazy.
170  */
171 void rcu_segcblist_dequeued_lazy(struct rcu_segcblist *rsclp)
172 {
173 	unsigned long flags;
174 
175 	local_irq_save(flags);
176 	rsclp->len_lazy--;
177 	local_irq_restore(flags);
178 }
179 
180 /*
181  * Return a pointer to the first callback in the specified rcu_segcblist
182  * structure.  This is useful for diagnostics.
183  */
184 struct rcu_head *rcu_segcblist_first_cb(struct rcu_segcblist *rsclp)
185 {
186 	if (rcu_segcblist_is_enabled(rsclp))
187 		return rsclp->head;
188 	return NULL;
189 }
190 
191 /*
192  * Return a pointer to the first pending callback in the specified
193  * rcu_segcblist structure.  This is useful just after posting a given
194  * callback -- if that callback is the first pending callback, then
195  * you cannot rely on someone else having already started up the required
196  * grace period.
197  */
198 struct rcu_head *rcu_segcblist_first_pend_cb(struct rcu_segcblist *rsclp)
199 {
200 	if (rcu_segcblist_is_enabled(rsclp))
201 		return *rsclp->tails[RCU_DONE_TAIL];
202 	return NULL;
203 }
204 
205 /*
206  * Does the specified rcu_segcblist structure contain callbacks that
207  * have not yet been processed beyond having been posted, that is,
208  * does it contain callbacks in its last segment?
209  */
210 bool rcu_segcblist_new_cbs(struct rcu_segcblist *rsclp)
211 {
212 	return rcu_segcblist_is_enabled(rsclp) &&
213 	       !rcu_segcblist_restempty(rsclp, RCU_NEXT_READY_TAIL);
214 }
215 
216 /*
217  * Enqueue the specified callback onto the specified rcu_segcblist
218  * structure, updating accounting as needed.  Note that the ->len
219  * field may be accessed locklessly, hence the WRITE_ONCE().
220  * The ->len field is used by rcu_barrier() and friends to determine
221  * if it must post a callback on this structure, and it is OK
222  * for rcu_barrier() to sometimes post callbacks needlessly, but
223  * absolutely not OK for it to ever miss posting a callback.
224  */
225 void rcu_segcblist_enqueue(struct rcu_segcblist *rsclp,
226 			   struct rcu_head *rhp, bool lazy)
227 {
228 	WRITE_ONCE(rsclp->len, rsclp->len + 1); /* ->len sampled locklessly. */
229 	if (lazy)
230 		rsclp->len_lazy++;
231 	smp_mb(); /* Ensure counts are updated before callback is enqueued. */
232 	rhp->next = NULL;
233 	*rsclp->tails[RCU_NEXT_TAIL] = rhp;
234 	rsclp->tails[RCU_NEXT_TAIL] = &rhp->next;
235 }
236 
237 /*
238  * Entrain the specified callback onto the specified rcu_segcblist at
239  * the end of the last non-empty segment.  If the entire rcu_segcblist
240  * is empty, make no change, but return false.
241  *
242  * This is intended for use by rcu_barrier()-like primitives, -not-
243  * for normal grace-period use.  IMPORTANT:  The callback you enqueue
244  * will wait for all prior callbacks, NOT necessarily for a grace
245  * period.  You have been warned.
246  */
247 bool rcu_segcblist_entrain(struct rcu_segcblist *rsclp,
248 			   struct rcu_head *rhp, bool lazy)
249 {
250 	int i;
251 
252 	if (rcu_segcblist_n_cbs(rsclp) == 0)
253 		return false;
254 	WRITE_ONCE(rsclp->len, rsclp->len + 1);
255 	if (lazy)
256 		rsclp->len_lazy++;
257 	smp_mb(); /* Ensure counts are updated before callback is entrained. */
258 	rhp->next = NULL;
259 	for (i = RCU_NEXT_TAIL; i > RCU_DONE_TAIL; i--)
260 		if (rsclp->tails[i] != rsclp->tails[i - 1])
261 			break;
262 	*rsclp->tails[i] = rhp;
263 	for (; i <= RCU_NEXT_TAIL; i++)
264 		rsclp->tails[i] = &rhp->next;
265 	return true;
266 }
267 
268 /*
269  * Extract only the counts from the specified rcu_segcblist structure,
270  * and place them in the specified rcu_cblist structure.  This function
271  * supports both callback orphaning and invocation, hence the separation
272  * of counts and callbacks.  (Callbacks ready for invocation must be
273  * orphaned and adopted separately from pending callbacks, but counts
274  * apply to all callbacks.  Locking must be used to make sure that
275  * both orphaned-callbacks lists are consistent.)
276  */
277 void rcu_segcblist_extract_count(struct rcu_segcblist *rsclp,
278 					       struct rcu_cblist *rclp)
279 {
280 	rclp->len_lazy += rsclp->len_lazy;
281 	rclp->len += rsclp->len;
282 	rsclp->len_lazy = 0;
283 	WRITE_ONCE(rsclp->len, 0); /* ->len sampled locklessly. */
284 }
285 
286 /*
287  * Extract only those callbacks ready to be invoked from the specified
288  * rcu_segcblist structure and place them in the specified rcu_cblist
289  * structure.
290  */
291 void rcu_segcblist_extract_done_cbs(struct rcu_segcblist *rsclp,
292 				    struct rcu_cblist *rclp)
293 {
294 	int i;
295 
296 	if (!rcu_segcblist_ready_cbs(rsclp))
297 		return; /* Nothing to do. */
298 	*rclp->tail = rsclp->head;
299 	rsclp->head = *rsclp->tails[RCU_DONE_TAIL];
300 	*rsclp->tails[RCU_DONE_TAIL] = NULL;
301 	rclp->tail = rsclp->tails[RCU_DONE_TAIL];
302 	for (i = RCU_CBLIST_NSEGS - 1; i >= RCU_DONE_TAIL; i--)
303 		if (rsclp->tails[i] == rsclp->tails[RCU_DONE_TAIL])
304 			rsclp->tails[i] = &rsclp->head;
305 }
306 
307 /*
308  * Extract only those callbacks still pending (not yet ready to be
309  * invoked) from the specified rcu_segcblist structure and place them in
310  * the specified rcu_cblist structure.  Note that this loses information
311  * about any callbacks that might have been partway done waiting for
312  * their grace period.  Too bad!  They will have to start over.
313  */
314 void rcu_segcblist_extract_pend_cbs(struct rcu_segcblist *rsclp,
315 				    struct rcu_cblist *rclp)
316 {
317 	int i;
318 
319 	if (!rcu_segcblist_pend_cbs(rsclp))
320 		return; /* Nothing to do. */
321 	*rclp->tail = *rsclp->tails[RCU_DONE_TAIL];
322 	rclp->tail = rsclp->tails[RCU_NEXT_TAIL];
323 	*rsclp->tails[RCU_DONE_TAIL] = NULL;
324 	for (i = RCU_DONE_TAIL + 1; i < RCU_CBLIST_NSEGS; i++)
325 		rsclp->tails[i] = rsclp->tails[RCU_DONE_TAIL];
326 }
327 
328 /*
329  * Insert counts from the specified rcu_cblist structure in the
330  * specified rcu_segcblist structure.
331  */
332 void rcu_segcblist_insert_count(struct rcu_segcblist *rsclp,
333 				struct rcu_cblist *rclp)
334 {
335 	rsclp->len_lazy += rclp->len_lazy;
336 	/* ->len sampled locklessly. */
337 	WRITE_ONCE(rsclp->len, rsclp->len + rclp->len);
338 	rclp->len_lazy = 0;
339 	rclp->len = 0;
340 }
341 
342 /*
343  * Move callbacks from the specified rcu_cblist to the beginning of the
344  * done-callbacks segment of the specified rcu_segcblist.
345  */
346 void rcu_segcblist_insert_done_cbs(struct rcu_segcblist *rsclp,
347 				   struct rcu_cblist *rclp)
348 {
349 	int i;
350 
351 	if (!rclp->head)
352 		return; /* No callbacks to move. */
353 	*rclp->tail = rsclp->head;
354 	rsclp->head = rclp->head;
355 	for (i = RCU_DONE_TAIL; i < RCU_CBLIST_NSEGS; i++)
356 		if (&rsclp->head == rsclp->tails[i])
357 			rsclp->tails[i] = rclp->tail;
358 		else
359 			break;
360 	rclp->head = NULL;
361 	rclp->tail = &rclp->head;
362 }
363 
364 /*
365  * Move callbacks from the specified rcu_cblist to the end of the
366  * new-callbacks segment of the specified rcu_segcblist.
367  */
368 void rcu_segcblist_insert_pend_cbs(struct rcu_segcblist *rsclp,
369 				   struct rcu_cblist *rclp)
370 {
371 	if (!rclp->head)
372 		return; /* Nothing to do. */
373 	*rsclp->tails[RCU_NEXT_TAIL] = rclp->head;
374 	rsclp->tails[RCU_NEXT_TAIL] = rclp->tail;
375 	rclp->head = NULL;
376 	rclp->tail = &rclp->head;
377 }
378 
379 /*
380  * Advance the callbacks in the specified rcu_segcblist structure based
381  * on the current value passed in for the grace-period counter.
382  */
383 void rcu_segcblist_advance(struct rcu_segcblist *rsclp, unsigned long seq)
384 {
385 	int i, j;
386 
387 	WARN_ON_ONCE(!rcu_segcblist_is_enabled(rsclp));
388 	if (rcu_segcblist_restempty(rsclp, RCU_DONE_TAIL))
389 		return;
390 
391 	/*
392 	 * Find all callbacks whose ->gp_seq numbers indicate that they
393 	 * are ready to invoke, and put them into the RCU_DONE_TAIL segment.
394 	 */
395 	for (i = RCU_WAIT_TAIL; i < RCU_NEXT_TAIL; i++) {
396 		if (ULONG_CMP_LT(seq, rsclp->gp_seq[i]))
397 			break;
398 		rsclp->tails[RCU_DONE_TAIL] = rsclp->tails[i];
399 	}
400 
401 	/* If no callbacks moved, nothing more need be done. */
402 	if (i == RCU_WAIT_TAIL)
403 		return;
404 
405 	/* Clean up tail pointers that might have been misordered above. */
406 	for (j = RCU_WAIT_TAIL; j < i; j++)
407 		rsclp->tails[j] = rsclp->tails[RCU_DONE_TAIL];
408 
409 	/*
410 	 * Callbacks moved, so clean up the misordered ->tails[] pointers
411 	 * that now point into the middle of the list of ready-to-invoke
412 	 * callbacks.  The overall effect is to copy down the later pointers
413 	 * into the gap that was created by the now-ready segments.
414 	 */
415 	for (j = RCU_WAIT_TAIL; i < RCU_NEXT_TAIL; i++, j++) {
416 		if (rsclp->tails[j] == rsclp->tails[RCU_NEXT_TAIL])
417 			break;  /* No more callbacks. */
418 		rsclp->tails[j] = rsclp->tails[i];
419 		rsclp->gp_seq[j] = rsclp->gp_seq[i];
420 	}
421 }
422 
423 /*
424  * "Accelerate" callbacks based on more-accurate grace-period information.
425  * The reason for this is that RCU does not synchronize the beginnings and
426  * ends of grace periods, and that callbacks are posted locally.  This in
427  * turn means that the callbacks must be labelled conservatively early
428  * on, as getting exact information would degrade both performance and
429  * scalability.  When more accurate grace-period information becomes
430  * available, previously posted callbacks can be "accelerated", marking
431  * them to complete at the end of the earlier grace period.
432  *
433  * This function operates on an rcu_segcblist structure, and also the
434  * grace-period sequence number seq at which new callbacks would become
435  * ready to invoke.  Returns true if there are callbacks that won't be
436  * ready to invoke until seq, false otherwise.
437  */
438 bool rcu_segcblist_accelerate(struct rcu_segcblist *rsclp, unsigned long seq)
439 {
440 	int i;
441 
442 	WARN_ON_ONCE(!rcu_segcblist_is_enabled(rsclp));
443 	if (rcu_segcblist_restempty(rsclp, RCU_DONE_TAIL))
444 		return false;
445 
446 	/*
447 	 * Find the segment preceding the oldest segment of callbacks
448 	 * whose ->gp_seq[] completion is at or after that passed in via
449 	 * "seq", skipping any empty segments.  This oldest segment, along
450 	 * with any later segments, can be merged in with any newly arrived
451 	 * callbacks in the RCU_NEXT_TAIL segment, and assigned "seq"
452 	 * as their ->gp_seq[] grace-period completion sequence number.
453 	 */
454 	for (i = RCU_NEXT_READY_TAIL; i > RCU_DONE_TAIL; i--)
455 		if (rsclp->tails[i] != rsclp->tails[i - 1] &&
456 		    ULONG_CMP_LT(rsclp->gp_seq[i], seq))
457 			break;
458 
459 	/*
460 	 * If all the segments contain callbacks that correspond to
461 	 * earlier grace-period sequence numbers than "seq", leave.
462 	 * Assuming that the rcu_segcblist structure has enough
463 	 * segments in its arrays, this can only happen if some of
464 	 * the non-done segments contain callbacks that really are
465 	 * ready to invoke.  This situation will get straightened
466 	 * out by the next call to rcu_segcblist_advance().
467 	 *
468 	 * Also advance to the oldest segment of callbacks whose
469 	 * ->gp_seq[] completion is at or after that passed in via "seq",
470 	 * skipping any empty segments.
471 	 */
472 	if (++i >= RCU_NEXT_TAIL)
473 		return false;
474 
475 	/*
476 	 * Merge all later callbacks, including newly arrived callbacks,
477 	 * into the segment located by the for-loop above.  Assign "seq"
478 	 * as the ->gp_seq[] value in order to correctly handle the case
479 	 * where there were no pending callbacks in the rcu_segcblist
480 	 * structure other than in the RCU_NEXT_TAIL segment.
481 	 */
482 	for (; i < RCU_NEXT_TAIL; i++) {
483 		rsclp->tails[i] = rsclp->tails[RCU_NEXT_TAIL];
484 		rsclp->gp_seq[i] = seq;
485 	}
486 	return true;
487 }
488 
489 /*
490  * Scan the specified rcu_segcblist structure for callbacks that need
491  * a grace period later than the one specified by "seq".  We don't look
492  * at the RCU_DONE_TAIL or RCU_NEXT_TAIL segments because they don't
493  * have a grace-period sequence number.
494  */
495 bool rcu_segcblist_future_gp_needed(struct rcu_segcblist *rsclp,
496 				    unsigned long seq)
497 {
498 	int i;
499 
500 	for (i = RCU_WAIT_TAIL; i < RCU_NEXT_TAIL; i++)
501 		if (rsclp->tails[i - 1] != rsclp->tails[i] &&
502 		    ULONG_CMP_LT(seq, rsclp->gp_seq[i]))
503 			return true;
504 	return false;
505 }
506