xref: /openbmc/linux/kernel/notifier.c (revision be122522)
1 // SPDX-License-Identifier: GPL-2.0-only
2 #include <linux/kdebug.h>
3 #include <linux/kprobes.h>
4 #include <linux/export.h>
5 #include <linux/notifier.h>
6 #include <linux/rcupdate.h>
7 #include <linux/vmalloc.h>
8 #include <linux/reboot.h>
9 
10 /*
11  *	Notifier list for kernel code which wants to be called
12  *	at shutdown. This is used to stop any idling DMA operations
13  *	and the like.
14  */
15 BLOCKING_NOTIFIER_HEAD(reboot_notifier_list);
16 
17 /*
18  *	Notifier chain core routines.  The exported routines below
19  *	are layered on top of these, with appropriate locking added.
20  */
21 
22 static int notifier_chain_register(struct notifier_block **nl,
23 		struct notifier_block *n)
24 {
25 	while ((*nl) != NULL) {
26 		if (unlikely((*nl) == n)) {
27 			WARN(1, "double register detected");
28 			return 0;
29 		}
30 		if (n->priority > (*nl)->priority)
31 			break;
32 		nl = &((*nl)->next);
33 	}
34 	n->next = *nl;
35 	rcu_assign_pointer(*nl, n);
36 	return 0;
37 }
38 
39 static int notifier_chain_unregister(struct notifier_block **nl,
40 		struct notifier_block *n)
41 {
42 	while ((*nl) != NULL) {
43 		if ((*nl) == n) {
44 			rcu_assign_pointer(*nl, n->next);
45 			return 0;
46 		}
47 		nl = &((*nl)->next);
48 	}
49 	return -ENOENT;
50 }
51 
52 /**
53  * notifier_call_chain - Informs the registered notifiers about an event.
54  *	@nl:		Pointer to head of the blocking notifier chain
55  *	@val:		Value passed unmodified to notifier function
56  *	@v:		Pointer passed unmodified to notifier function
57  *	@nr_to_call:	Number of notifier functions to be called. Don't care
58  *			value of this parameter is -1.
59  *	@nr_calls:	Records the number of notifications sent. Don't care
60  *			value of this field is NULL.
61  *	@returns:	notifier_call_chain returns the value returned by the
62  *			last notifier function called.
63  */
64 static int notifier_call_chain(struct notifier_block **nl,
65 			       unsigned long val, void *v,
66 			       int nr_to_call, int *nr_calls)
67 {
68 	int ret = NOTIFY_DONE;
69 	struct notifier_block *nb, *next_nb;
70 
71 	nb = rcu_dereference_raw(*nl);
72 
73 	while (nb && nr_to_call) {
74 		next_nb = rcu_dereference_raw(nb->next);
75 
76 #ifdef CONFIG_DEBUG_NOTIFIERS
77 		if (unlikely(!func_ptr_is_kernel_text(nb->notifier_call))) {
78 			WARN(1, "Invalid notifier called!");
79 			nb = next_nb;
80 			continue;
81 		}
82 #endif
83 		ret = nb->notifier_call(nb, val, v);
84 
85 		if (nr_calls)
86 			(*nr_calls)++;
87 
88 		if (ret & NOTIFY_STOP_MASK)
89 			break;
90 		nb = next_nb;
91 		nr_to_call--;
92 	}
93 	return ret;
94 }
95 NOKPROBE_SYMBOL(notifier_call_chain);
96 
97 /*
98  *	Atomic notifier chain routines.  Registration and unregistration
99  *	use a spinlock, and call_chain is synchronized by RCU (no locks).
100  */
101 
102 /**
103  *	atomic_notifier_chain_register - Add notifier to an atomic notifier chain
104  *	@nh: Pointer to head of the atomic notifier chain
105  *	@n: New entry in notifier chain
106  *
107  *	Adds a notifier to an atomic notifier chain.
108  *
109  *	Currently always returns zero.
110  */
111 int atomic_notifier_chain_register(struct atomic_notifier_head *nh,
112 		struct notifier_block *n)
113 {
114 	unsigned long flags;
115 	int ret;
116 
117 	spin_lock_irqsave(&nh->lock, flags);
118 	ret = notifier_chain_register(&nh->head, n);
119 	spin_unlock_irqrestore(&nh->lock, flags);
120 	return ret;
121 }
122 EXPORT_SYMBOL_GPL(atomic_notifier_chain_register);
123 
124 /**
125  *	atomic_notifier_chain_unregister - Remove notifier from an atomic notifier chain
126  *	@nh: Pointer to head of the atomic notifier chain
127  *	@n: Entry to remove from notifier chain
128  *
129  *	Removes a notifier from an atomic notifier chain.
130  *
131  *	Returns zero on success or %-ENOENT on failure.
132  */
133 int atomic_notifier_chain_unregister(struct atomic_notifier_head *nh,
134 		struct notifier_block *n)
135 {
136 	unsigned long flags;
137 	int ret;
138 
139 	spin_lock_irqsave(&nh->lock, flags);
140 	ret = notifier_chain_unregister(&nh->head, n);
141 	spin_unlock_irqrestore(&nh->lock, flags);
142 	synchronize_rcu();
143 	return ret;
144 }
145 EXPORT_SYMBOL_GPL(atomic_notifier_chain_unregister);
146 
147 /**
148  *	__atomic_notifier_call_chain - Call functions in an atomic notifier chain
149  *	@nh: Pointer to head of the atomic notifier chain
150  *	@val: Value passed unmodified to notifier function
151  *	@v: Pointer passed unmodified to notifier function
152  *	@nr_to_call: See the comment for notifier_call_chain.
153  *	@nr_calls: See the comment for notifier_call_chain.
154  *
155  *	Calls each function in a notifier chain in turn.  The functions
156  *	run in an atomic context, so they must not block.
157  *	This routine uses RCU to synchronize with changes to the chain.
158  *
159  *	If the return value of the notifier can be and'ed
160  *	with %NOTIFY_STOP_MASK then atomic_notifier_call_chain()
161  *	will return immediately, with the return value of
162  *	the notifier function which halted execution.
163  *	Otherwise the return value is the return value
164  *	of the last notifier function called.
165  */
166 int __atomic_notifier_call_chain(struct atomic_notifier_head *nh,
167 				 unsigned long val, void *v,
168 				 int nr_to_call, int *nr_calls)
169 {
170 	int ret;
171 
172 	rcu_read_lock();
173 	ret = notifier_call_chain(&nh->head, val, v, nr_to_call, nr_calls);
174 	rcu_read_unlock();
175 	return ret;
176 }
177 EXPORT_SYMBOL_GPL(__atomic_notifier_call_chain);
178 NOKPROBE_SYMBOL(__atomic_notifier_call_chain);
179 
180 int atomic_notifier_call_chain(struct atomic_notifier_head *nh,
181 			       unsigned long val, void *v)
182 {
183 	return __atomic_notifier_call_chain(nh, val, v, -1, NULL);
184 }
185 EXPORT_SYMBOL_GPL(atomic_notifier_call_chain);
186 NOKPROBE_SYMBOL(atomic_notifier_call_chain);
187 
188 /*
189  *	Blocking notifier chain routines.  All access to the chain is
190  *	synchronized by an rwsem.
191  */
192 
193 /**
194  *	blocking_notifier_chain_register - Add notifier to a blocking notifier chain
195  *	@nh: Pointer to head of the blocking notifier chain
196  *	@n: New entry in notifier chain
197  *
198  *	Adds a notifier to a blocking notifier chain.
199  *	Must be called in process context.
200  *
201  *	Currently always returns zero.
202  */
203 int blocking_notifier_chain_register(struct blocking_notifier_head *nh,
204 		struct notifier_block *n)
205 {
206 	int ret;
207 
208 	/*
209 	 * This code gets used during boot-up, when task switching is
210 	 * not yet working and interrupts must remain disabled.  At
211 	 * such times we must not call down_write().
212 	 */
213 	if (unlikely(system_state == SYSTEM_BOOTING))
214 		return notifier_chain_register(&nh->head, n);
215 
216 	down_write(&nh->rwsem);
217 	ret = notifier_chain_register(&nh->head, n);
218 	up_write(&nh->rwsem);
219 	return ret;
220 }
221 EXPORT_SYMBOL_GPL(blocking_notifier_chain_register);
222 
223 /**
224  *	blocking_notifier_chain_unregister - Remove notifier from a blocking notifier chain
225  *	@nh: Pointer to head of the blocking notifier chain
226  *	@n: Entry to remove from notifier chain
227  *
228  *	Removes a notifier from a blocking notifier chain.
229  *	Must be called from process context.
230  *
231  *	Returns zero on success or %-ENOENT on failure.
232  */
233 int blocking_notifier_chain_unregister(struct blocking_notifier_head *nh,
234 		struct notifier_block *n)
235 {
236 	int ret;
237 
238 	/*
239 	 * This code gets used during boot-up, when task switching is
240 	 * not yet working and interrupts must remain disabled.  At
241 	 * such times we must not call down_write().
242 	 */
243 	if (unlikely(system_state == SYSTEM_BOOTING))
244 		return notifier_chain_unregister(&nh->head, n);
245 
246 	down_write(&nh->rwsem);
247 	ret = notifier_chain_unregister(&nh->head, n);
248 	up_write(&nh->rwsem);
249 	return ret;
250 }
251 EXPORT_SYMBOL_GPL(blocking_notifier_chain_unregister);
252 
253 /**
254  *	__blocking_notifier_call_chain - Call functions in a blocking notifier chain
255  *	@nh: Pointer to head of the blocking notifier chain
256  *	@val: Value passed unmodified to notifier function
257  *	@v: Pointer passed unmodified to notifier function
258  *	@nr_to_call: See comment for notifier_call_chain.
259  *	@nr_calls: See comment for notifier_call_chain.
260  *
261  *	Calls each function in a notifier chain in turn.  The functions
262  *	run in a process context, so they are allowed to block.
263  *
264  *	If the return value of the notifier can be and'ed
265  *	with %NOTIFY_STOP_MASK then blocking_notifier_call_chain()
266  *	will return immediately, with the return value of
267  *	the notifier function which halted execution.
268  *	Otherwise the return value is the return value
269  *	of the last notifier function called.
270  */
271 int __blocking_notifier_call_chain(struct blocking_notifier_head *nh,
272 				   unsigned long val, void *v,
273 				   int nr_to_call, int *nr_calls)
274 {
275 	int ret = NOTIFY_DONE;
276 
277 	/*
278 	 * We check the head outside the lock, but if this access is
279 	 * racy then it does not matter what the result of the test
280 	 * is, we re-check the list after having taken the lock anyway:
281 	 */
282 	if (rcu_access_pointer(nh->head)) {
283 		down_read(&nh->rwsem);
284 		ret = notifier_call_chain(&nh->head, val, v, nr_to_call,
285 					nr_calls);
286 		up_read(&nh->rwsem);
287 	}
288 	return ret;
289 }
290 EXPORT_SYMBOL_GPL(__blocking_notifier_call_chain);
291 
292 int blocking_notifier_call_chain(struct blocking_notifier_head *nh,
293 		unsigned long val, void *v)
294 {
295 	return __blocking_notifier_call_chain(nh, val, v, -1, NULL);
296 }
297 EXPORT_SYMBOL_GPL(blocking_notifier_call_chain);
298 
299 /*
300  *	Raw notifier chain routines.  There is no protection;
301  *	the caller must provide it.  Use at your own risk!
302  */
303 
304 /**
305  *	raw_notifier_chain_register - Add notifier to a raw notifier chain
306  *	@nh: Pointer to head of the raw notifier chain
307  *	@n: New entry in notifier chain
308  *
309  *	Adds a notifier to a raw notifier chain.
310  *	All locking must be provided by the caller.
311  *
312  *	Currently always returns zero.
313  */
314 int raw_notifier_chain_register(struct raw_notifier_head *nh,
315 		struct notifier_block *n)
316 {
317 	return notifier_chain_register(&nh->head, n);
318 }
319 EXPORT_SYMBOL_GPL(raw_notifier_chain_register);
320 
321 /**
322  *	raw_notifier_chain_unregister - Remove notifier from a raw notifier chain
323  *	@nh: Pointer to head of the raw notifier chain
324  *	@n: Entry to remove from notifier chain
325  *
326  *	Removes a notifier from a raw notifier chain.
327  *	All locking must be provided by the caller.
328  *
329  *	Returns zero on success or %-ENOENT on failure.
330  */
331 int raw_notifier_chain_unregister(struct raw_notifier_head *nh,
332 		struct notifier_block *n)
333 {
334 	return notifier_chain_unregister(&nh->head, n);
335 }
336 EXPORT_SYMBOL_GPL(raw_notifier_chain_unregister);
337 
338 /**
339  *	__raw_notifier_call_chain - Call functions in a raw notifier chain
340  *	@nh: Pointer to head of the raw notifier chain
341  *	@val: Value passed unmodified to notifier function
342  *	@v: Pointer passed unmodified to notifier function
343  *	@nr_to_call: See comment for notifier_call_chain.
344  *	@nr_calls: See comment for notifier_call_chain
345  *
346  *	Calls each function in a notifier chain in turn.  The functions
347  *	run in an undefined context.
348  *	All locking must be provided by the caller.
349  *
350  *	If the return value of the notifier can be and'ed
351  *	with %NOTIFY_STOP_MASK then raw_notifier_call_chain()
352  *	will return immediately, with the return value of
353  *	the notifier function which halted execution.
354  *	Otherwise the return value is the return value
355  *	of the last notifier function called.
356  */
357 int __raw_notifier_call_chain(struct raw_notifier_head *nh,
358 			      unsigned long val, void *v,
359 			      int nr_to_call, int *nr_calls)
360 {
361 	return notifier_call_chain(&nh->head, val, v, nr_to_call, nr_calls);
362 }
363 EXPORT_SYMBOL_GPL(__raw_notifier_call_chain);
364 
365 int raw_notifier_call_chain(struct raw_notifier_head *nh,
366 		unsigned long val, void *v)
367 {
368 	return __raw_notifier_call_chain(nh, val, v, -1, NULL);
369 }
370 EXPORT_SYMBOL_GPL(raw_notifier_call_chain);
371 
372 #ifdef CONFIG_SRCU
373 /*
374  *	SRCU notifier chain routines.    Registration and unregistration
375  *	use a mutex, and call_chain is synchronized by SRCU (no locks).
376  */
377 
378 /**
379  *	srcu_notifier_chain_register - Add notifier to an SRCU notifier chain
380  *	@nh: Pointer to head of the SRCU notifier chain
381  *	@n: New entry in notifier chain
382  *
383  *	Adds a notifier to an SRCU notifier chain.
384  *	Must be called in process context.
385  *
386  *	Currently always returns zero.
387  */
388 int srcu_notifier_chain_register(struct srcu_notifier_head *nh,
389 		struct notifier_block *n)
390 {
391 	int ret;
392 
393 	/*
394 	 * This code gets used during boot-up, when task switching is
395 	 * not yet working and interrupts must remain disabled.  At
396 	 * such times we must not call mutex_lock().
397 	 */
398 	if (unlikely(system_state == SYSTEM_BOOTING))
399 		return notifier_chain_register(&nh->head, n);
400 
401 	mutex_lock(&nh->mutex);
402 	ret = notifier_chain_register(&nh->head, n);
403 	mutex_unlock(&nh->mutex);
404 	return ret;
405 }
406 EXPORT_SYMBOL_GPL(srcu_notifier_chain_register);
407 
408 /**
409  *	srcu_notifier_chain_unregister - Remove notifier from an SRCU notifier chain
410  *	@nh: Pointer to head of the SRCU notifier chain
411  *	@n: Entry to remove from notifier chain
412  *
413  *	Removes a notifier from an SRCU notifier chain.
414  *	Must be called from process context.
415  *
416  *	Returns zero on success or %-ENOENT on failure.
417  */
418 int srcu_notifier_chain_unregister(struct srcu_notifier_head *nh,
419 		struct notifier_block *n)
420 {
421 	int ret;
422 
423 	/*
424 	 * This code gets used during boot-up, when task switching is
425 	 * not yet working and interrupts must remain disabled.  At
426 	 * such times we must not call mutex_lock().
427 	 */
428 	if (unlikely(system_state == SYSTEM_BOOTING))
429 		return notifier_chain_unregister(&nh->head, n);
430 
431 	mutex_lock(&nh->mutex);
432 	ret = notifier_chain_unregister(&nh->head, n);
433 	mutex_unlock(&nh->mutex);
434 	synchronize_srcu(&nh->srcu);
435 	return ret;
436 }
437 EXPORT_SYMBOL_GPL(srcu_notifier_chain_unregister);
438 
439 /**
440  *	__srcu_notifier_call_chain - Call functions in an SRCU notifier chain
441  *	@nh: Pointer to head of the SRCU notifier chain
442  *	@val: Value passed unmodified to notifier function
443  *	@v: Pointer passed unmodified to notifier function
444  *	@nr_to_call: See comment for notifier_call_chain.
445  *	@nr_calls: See comment for notifier_call_chain
446  *
447  *	Calls each function in a notifier chain in turn.  The functions
448  *	run in a process context, so they are allowed to block.
449  *
450  *	If the return value of the notifier can be and'ed
451  *	with %NOTIFY_STOP_MASK then srcu_notifier_call_chain()
452  *	will return immediately, with the return value of
453  *	the notifier function which halted execution.
454  *	Otherwise the return value is the return value
455  *	of the last notifier function called.
456  */
457 int __srcu_notifier_call_chain(struct srcu_notifier_head *nh,
458 			       unsigned long val, void *v,
459 			       int nr_to_call, int *nr_calls)
460 {
461 	int ret;
462 	int idx;
463 
464 	idx = srcu_read_lock(&nh->srcu);
465 	ret = notifier_call_chain(&nh->head, val, v, nr_to_call, nr_calls);
466 	srcu_read_unlock(&nh->srcu, idx);
467 	return ret;
468 }
469 EXPORT_SYMBOL_GPL(__srcu_notifier_call_chain);
470 
471 int srcu_notifier_call_chain(struct srcu_notifier_head *nh,
472 		unsigned long val, void *v)
473 {
474 	return __srcu_notifier_call_chain(nh, val, v, -1, NULL);
475 }
476 EXPORT_SYMBOL_GPL(srcu_notifier_call_chain);
477 
478 /**
479  *	srcu_init_notifier_head - Initialize an SRCU notifier head
480  *	@nh: Pointer to head of the srcu notifier chain
481  *
482  *	Unlike other sorts of notifier heads, SRCU notifier heads require
483  *	dynamic initialization.  Be sure to call this routine before
484  *	calling any of the other SRCU notifier routines for this head.
485  *
486  *	If an SRCU notifier head is deallocated, it must first be cleaned
487  *	up by calling srcu_cleanup_notifier_head().  Otherwise the head's
488  *	per-cpu data (used by the SRCU mechanism) will leak.
489  */
490 void srcu_init_notifier_head(struct srcu_notifier_head *nh)
491 {
492 	mutex_init(&nh->mutex);
493 	if (init_srcu_struct(&nh->srcu) < 0)
494 		BUG();
495 	nh->head = NULL;
496 }
497 EXPORT_SYMBOL_GPL(srcu_init_notifier_head);
498 
499 #endif /* CONFIG_SRCU */
500 
501 static ATOMIC_NOTIFIER_HEAD(die_chain);
502 
503 int notrace notify_die(enum die_val val, const char *str,
504 	       struct pt_regs *regs, long err, int trap, int sig)
505 {
506 	struct die_args args = {
507 		.regs	= regs,
508 		.str	= str,
509 		.err	= err,
510 		.trapnr	= trap,
511 		.signr	= sig,
512 
513 	};
514 	RCU_LOCKDEP_WARN(!rcu_is_watching(),
515 			   "notify_die called but RCU thinks we're quiescent");
516 	return atomic_notifier_call_chain(&die_chain, val, &args);
517 }
518 NOKPROBE_SYMBOL(notify_die);
519 
520 int register_die_notifier(struct notifier_block *nb)
521 {
522 	vmalloc_sync_all();
523 	return atomic_notifier_chain_register(&die_chain, nb);
524 }
525 EXPORT_SYMBOL_GPL(register_die_notifier);
526 
527 int unregister_die_notifier(struct notifier_block *nb)
528 {
529 	return atomic_notifier_chain_unregister(&die_chain, nb);
530 }
531 EXPORT_SYMBOL_GPL(unregister_die_notifier);
532