root/kernel/notifier.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. notifier_chain_register
  2. notifier_chain_cond_register
  3. notifier_chain_unregister
  4. notifier_call_chain
  5. atomic_notifier_chain_register
  6. atomic_notifier_chain_unregister
  7. __atomic_notifier_call_chain
  8. atomic_notifier_call_chain
  9. blocking_notifier_chain_register
  10. blocking_notifier_chain_cond_register
  11. blocking_notifier_chain_unregister
  12. __blocking_notifier_call_chain
  13. blocking_notifier_call_chain
  14. raw_notifier_chain_register
  15. raw_notifier_chain_unregister
  16. __raw_notifier_call_chain
  17. raw_notifier_call_chain
  18. srcu_notifier_chain_register
  19. srcu_notifier_chain_unregister
  20. __srcu_notifier_call_chain
  21. srcu_notifier_call_chain
  22. srcu_init_notifier_head
  23. notify_die
  24. register_die_notifier
  25. unregister_die_notifier

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

/* [<][>][^][v][top][bottom][index][help] */