xref: /linux-6.15/kernel/notifier.c (revision 5adaabb6)
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_cond_register - Cond add notifier to a blocking notifier chain
225  *	@nh: Pointer to head of the blocking notifier chain
226  *	@n: New entry in notifier chain
227  *
228  *	Adds a notifier to a blocking notifier chain, only if not already
229  *	present in the chain.
230  *	Must be called in process context.
231  *
232  *	Currently always returns zero.
233  */
234 int blocking_notifier_chain_cond_register(struct blocking_notifier_head *nh,
235 		struct notifier_block *n)
236 {
237 	int ret;
238 
239 	down_write(&nh->rwsem);
240 	ret = notifier_chain_register(&nh->head, n);
241 	up_write(&nh->rwsem);
242 	return ret;
243 }
244 EXPORT_SYMBOL_GPL(blocking_notifier_chain_cond_register);
245 
246 /**
247  *	blocking_notifier_chain_unregister - Remove notifier from a blocking notifier chain
248  *	@nh: Pointer to head of the blocking notifier chain
249  *	@n: Entry to remove from notifier chain
250  *
251  *	Removes a notifier from a blocking notifier chain.
252  *	Must be called from process context.
253  *
254  *	Returns zero on success or %-ENOENT on failure.
255  */
256 int blocking_notifier_chain_unregister(struct blocking_notifier_head *nh,
257 		struct notifier_block *n)
258 {
259 	int ret;
260 
261 	/*
262 	 * This code gets used during boot-up, when task switching is
263 	 * not yet working and interrupts must remain disabled.  At
264 	 * such times we must not call down_write().
265 	 */
266 	if (unlikely(system_state == SYSTEM_BOOTING))
267 		return notifier_chain_unregister(&nh->head, n);
268 
269 	down_write(&nh->rwsem);
270 	ret = notifier_chain_unregister(&nh->head, n);
271 	up_write(&nh->rwsem);
272 	return ret;
273 }
274 EXPORT_SYMBOL_GPL(blocking_notifier_chain_unregister);
275 
276 /**
277  *	__blocking_notifier_call_chain - Call functions in a blocking notifier chain
278  *	@nh: Pointer to head of the blocking notifier chain
279  *	@val: Value passed unmodified to notifier function
280  *	@v: Pointer passed unmodified to notifier function
281  *	@nr_to_call: See comment for notifier_call_chain.
282  *	@nr_calls: See comment for notifier_call_chain.
283  *
284  *	Calls each function in a notifier chain in turn.  The functions
285  *	run in a process context, so they are allowed to block.
286  *
287  *	If the return value of the notifier can be and'ed
288  *	with %NOTIFY_STOP_MASK then blocking_notifier_call_chain()
289  *	will return immediately, with the return value of
290  *	the notifier function which halted execution.
291  *	Otherwise the return value is the return value
292  *	of the last notifier function called.
293  */
294 int __blocking_notifier_call_chain(struct blocking_notifier_head *nh,
295 				   unsigned long val, void *v,
296 				   int nr_to_call, int *nr_calls)
297 {
298 	int ret = NOTIFY_DONE;
299 
300 	/*
301 	 * We check the head outside the lock, but if this access is
302 	 * racy then it does not matter what the result of the test
303 	 * is, we re-check the list after having taken the lock anyway:
304 	 */
305 	if (rcu_access_pointer(nh->head)) {
306 		down_read(&nh->rwsem);
307 		ret = notifier_call_chain(&nh->head, val, v, nr_to_call,
308 					nr_calls);
309 		up_read(&nh->rwsem);
310 	}
311 	return ret;
312 }
313 EXPORT_SYMBOL_GPL(__blocking_notifier_call_chain);
314 
315 int blocking_notifier_call_chain(struct blocking_notifier_head *nh,
316 		unsigned long val, void *v)
317 {
318 	return __blocking_notifier_call_chain(nh, val, v, -1, NULL);
319 }
320 EXPORT_SYMBOL_GPL(blocking_notifier_call_chain);
321 
322 /*
323  *	Raw notifier chain routines.  There is no protection;
324  *	the caller must provide it.  Use at your own risk!
325  */
326 
327 /**
328  *	raw_notifier_chain_register - Add notifier to a raw notifier chain
329  *	@nh: Pointer to head of the raw notifier chain
330  *	@n: New entry in notifier chain
331  *
332  *	Adds a notifier to a raw notifier chain.
333  *	All locking must be provided by the caller.
334  *
335  *	Currently always returns zero.
336  */
337 int raw_notifier_chain_register(struct raw_notifier_head *nh,
338 		struct notifier_block *n)
339 {
340 	return notifier_chain_register(&nh->head, n);
341 }
342 EXPORT_SYMBOL_GPL(raw_notifier_chain_register);
343 
344 /**
345  *	raw_notifier_chain_unregister - Remove notifier from a raw notifier chain
346  *	@nh: Pointer to head of the raw notifier chain
347  *	@n: Entry to remove from notifier chain
348  *
349  *	Removes a notifier from a raw notifier chain.
350  *	All locking must be provided by the caller.
351  *
352  *	Returns zero on success or %-ENOENT on failure.
353  */
354 int raw_notifier_chain_unregister(struct raw_notifier_head *nh,
355 		struct notifier_block *n)
356 {
357 	return notifier_chain_unregister(&nh->head, n);
358 }
359 EXPORT_SYMBOL_GPL(raw_notifier_chain_unregister);
360 
361 /**
362  *	__raw_notifier_call_chain - Call functions in a raw notifier chain
363  *	@nh: Pointer to head of the raw notifier chain
364  *	@val: Value passed unmodified to notifier function
365  *	@v: Pointer passed unmodified to notifier function
366  *	@nr_to_call: See comment for notifier_call_chain.
367  *	@nr_calls: See comment for notifier_call_chain
368  *
369  *	Calls each function in a notifier chain in turn.  The functions
370  *	run in an undefined context.
371  *	All locking must be provided by the caller.
372  *
373  *	If the return value of the notifier can be and'ed
374  *	with %NOTIFY_STOP_MASK then raw_notifier_call_chain()
375  *	will return immediately, with the return value of
376  *	the notifier function which halted execution.
377  *	Otherwise the return value is the return value
378  *	of the last notifier function called.
379  */
380 int __raw_notifier_call_chain(struct raw_notifier_head *nh,
381 			      unsigned long val, void *v,
382 			      int nr_to_call, int *nr_calls)
383 {
384 	return notifier_call_chain(&nh->head, val, v, nr_to_call, nr_calls);
385 }
386 EXPORT_SYMBOL_GPL(__raw_notifier_call_chain);
387 
388 int raw_notifier_call_chain(struct raw_notifier_head *nh,
389 		unsigned long val, void *v)
390 {
391 	return __raw_notifier_call_chain(nh, val, v, -1, NULL);
392 }
393 EXPORT_SYMBOL_GPL(raw_notifier_call_chain);
394 
395 #ifdef CONFIG_SRCU
396 /*
397  *	SRCU notifier chain routines.    Registration and unregistration
398  *	use a mutex, and call_chain is synchronized by SRCU (no locks).
399  */
400 
401 /**
402  *	srcu_notifier_chain_register - Add notifier to an SRCU notifier chain
403  *	@nh: Pointer to head of the SRCU notifier chain
404  *	@n: New entry in notifier chain
405  *
406  *	Adds a notifier to an SRCU notifier chain.
407  *	Must be called in process context.
408  *
409  *	Currently always returns zero.
410  */
411 int srcu_notifier_chain_register(struct srcu_notifier_head *nh,
412 		struct notifier_block *n)
413 {
414 	int ret;
415 
416 	/*
417 	 * This code gets used during boot-up, when task switching is
418 	 * not yet working and interrupts must remain disabled.  At
419 	 * such times we must not call mutex_lock().
420 	 */
421 	if (unlikely(system_state == SYSTEM_BOOTING))
422 		return notifier_chain_register(&nh->head, n);
423 
424 	mutex_lock(&nh->mutex);
425 	ret = notifier_chain_register(&nh->head, n);
426 	mutex_unlock(&nh->mutex);
427 	return ret;
428 }
429 EXPORT_SYMBOL_GPL(srcu_notifier_chain_register);
430 
431 /**
432  *	srcu_notifier_chain_unregister - Remove notifier from an SRCU notifier chain
433  *	@nh: Pointer to head of the SRCU notifier chain
434  *	@n: Entry to remove from notifier chain
435  *
436  *	Removes a notifier from an SRCU notifier chain.
437  *	Must be called from process context.
438  *
439  *	Returns zero on success or %-ENOENT on failure.
440  */
441 int srcu_notifier_chain_unregister(struct srcu_notifier_head *nh,
442 		struct notifier_block *n)
443 {
444 	int ret;
445 
446 	/*
447 	 * This code gets used during boot-up, when task switching is
448 	 * not yet working and interrupts must remain disabled.  At
449 	 * such times we must not call mutex_lock().
450 	 */
451 	if (unlikely(system_state == SYSTEM_BOOTING))
452 		return notifier_chain_unregister(&nh->head, n);
453 
454 	mutex_lock(&nh->mutex);
455 	ret = notifier_chain_unregister(&nh->head, n);
456 	mutex_unlock(&nh->mutex);
457 	synchronize_srcu(&nh->srcu);
458 	return ret;
459 }
460 EXPORT_SYMBOL_GPL(srcu_notifier_chain_unregister);
461 
462 /**
463  *	__srcu_notifier_call_chain - Call functions in an SRCU notifier chain
464  *	@nh: Pointer to head of the SRCU notifier chain
465  *	@val: Value passed unmodified to notifier function
466  *	@v: Pointer passed unmodified to notifier function
467  *	@nr_to_call: See comment for notifier_call_chain.
468  *	@nr_calls: See comment for notifier_call_chain
469  *
470  *	Calls each function in a notifier chain in turn.  The functions
471  *	run in a process context, so they are allowed to block.
472  *
473  *	If the return value of the notifier can be and'ed
474  *	with %NOTIFY_STOP_MASK then srcu_notifier_call_chain()
475  *	will return immediately, with the return value of
476  *	the notifier function which halted execution.
477  *	Otherwise the return value is the return value
478  *	of the last notifier function called.
479  */
480 int __srcu_notifier_call_chain(struct srcu_notifier_head *nh,
481 			       unsigned long val, void *v,
482 			       int nr_to_call, int *nr_calls)
483 {
484 	int ret;
485 	int idx;
486 
487 	idx = srcu_read_lock(&nh->srcu);
488 	ret = notifier_call_chain(&nh->head, val, v, nr_to_call, nr_calls);
489 	srcu_read_unlock(&nh->srcu, idx);
490 	return ret;
491 }
492 EXPORT_SYMBOL_GPL(__srcu_notifier_call_chain);
493 
494 int srcu_notifier_call_chain(struct srcu_notifier_head *nh,
495 		unsigned long val, void *v)
496 {
497 	return __srcu_notifier_call_chain(nh, val, v, -1, NULL);
498 }
499 EXPORT_SYMBOL_GPL(srcu_notifier_call_chain);
500 
501 /**
502  *	srcu_init_notifier_head - Initialize an SRCU notifier head
503  *	@nh: Pointer to head of the srcu notifier chain
504  *
505  *	Unlike other sorts of notifier heads, SRCU notifier heads require
506  *	dynamic initialization.  Be sure to call this routine before
507  *	calling any of the other SRCU notifier routines for this head.
508  *
509  *	If an SRCU notifier head is deallocated, it must first be cleaned
510  *	up by calling srcu_cleanup_notifier_head().  Otherwise the head's
511  *	per-cpu data (used by the SRCU mechanism) will leak.
512  */
513 void srcu_init_notifier_head(struct srcu_notifier_head *nh)
514 {
515 	mutex_init(&nh->mutex);
516 	if (init_srcu_struct(&nh->srcu) < 0)
517 		BUG();
518 	nh->head = NULL;
519 }
520 EXPORT_SYMBOL_GPL(srcu_init_notifier_head);
521 
522 #endif /* CONFIG_SRCU */
523 
524 static ATOMIC_NOTIFIER_HEAD(die_chain);
525 
526 int notrace notify_die(enum die_val val, const char *str,
527 	       struct pt_regs *regs, long err, int trap, int sig)
528 {
529 	struct die_args args = {
530 		.regs	= regs,
531 		.str	= str,
532 		.err	= err,
533 		.trapnr	= trap,
534 		.signr	= sig,
535 
536 	};
537 	RCU_LOCKDEP_WARN(!rcu_is_watching(),
538 			   "notify_die called but RCU thinks we're quiescent");
539 	return atomic_notifier_call_chain(&die_chain, val, &args);
540 }
541 NOKPROBE_SYMBOL(notify_die);
542 
543 int register_die_notifier(struct notifier_block *nb)
544 {
545 	vmalloc_sync_all();
546 	return atomic_notifier_chain_register(&die_chain, nb);
547 }
548 EXPORT_SYMBOL_GPL(register_die_notifier);
549 
550 int unregister_die_notifier(struct notifier_block *nb)
551 {
552 	return atomic_notifier_chain_unregister(&die_chain, nb);
553 }
554 EXPORT_SYMBOL_GPL(unregister_die_notifier);
555