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