1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * jump label support 4 * 5 * Copyright (C) 2009 Jason Baron <jbaron@redhat.com> 6 * Copyright (C) 2011 Peter Zijlstra 7 * 8 */ 9 #include <linux/memory.h> 10 #include <linux/uaccess.h> 11 #include <linux/module.h> 12 #include <linux/list.h> 13 #include <linux/slab.h> 14 #include <linux/sort.h> 15 #include <linux/err.h> 16 #include <linux/static_key.h> 17 #include <linux/jump_label_ratelimit.h> 18 #include <linux/bug.h> 19 #include <linux/cpu.h> 20 #include <asm/sections.h> 21 22 /* mutex to protect coming/going of the jump_label table */ 23 static DEFINE_MUTEX(jump_label_mutex); 24 25 void jump_label_lock(void) 26 { 27 mutex_lock(&jump_label_mutex); 28 } 29 30 void jump_label_unlock(void) 31 { 32 mutex_unlock(&jump_label_mutex); 33 } 34 35 static int jump_label_cmp(const void *a, const void *b) 36 { 37 const struct jump_entry *jea = a; 38 const struct jump_entry *jeb = b; 39 40 /* 41 * Entrires are sorted by key. 42 */ 43 if (jump_entry_key(jea) < jump_entry_key(jeb)) 44 return -1; 45 46 if (jump_entry_key(jea) > jump_entry_key(jeb)) 47 return 1; 48 49 /* 50 * In the batching mode, entries should also be sorted by the code 51 * inside the already sorted list of entries, enabling a bsearch in 52 * the vector. 53 */ 54 if (jump_entry_code(jea) < jump_entry_code(jeb)) 55 return -1; 56 57 if (jump_entry_code(jea) > jump_entry_code(jeb)) 58 return 1; 59 60 return 0; 61 } 62 63 static void jump_label_swap(void *a, void *b, int size) 64 { 65 long delta = (unsigned long)a - (unsigned long)b; 66 struct jump_entry *jea = a; 67 struct jump_entry *jeb = b; 68 struct jump_entry tmp = *jea; 69 70 jea->code = jeb->code - delta; 71 jea->target = jeb->target - delta; 72 jea->key = jeb->key - delta; 73 74 jeb->code = tmp.code + delta; 75 jeb->target = tmp.target + delta; 76 jeb->key = tmp.key + delta; 77 } 78 79 static void 80 jump_label_sort_entries(struct jump_entry *start, struct jump_entry *stop) 81 { 82 unsigned long size; 83 void *swapfn = NULL; 84 85 if (IS_ENABLED(CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE)) 86 swapfn = jump_label_swap; 87 88 size = (((unsigned long)stop - (unsigned long)start) 89 / sizeof(struct jump_entry)); 90 sort(start, size, sizeof(struct jump_entry), jump_label_cmp, swapfn); 91 } 92 93 static void jump_label_update(struct static_key *key); 94 95 /* 96 * There are similar definitions for the !CONFIG_JUMP_LABEL case in jump_label.h. 97 * The use of 'atomic_read()' requires atomic.h and its problematic for some 98 * kernel headers such as kernel.h and others. Since static_key_count() is not 99 * used in the branch statements as it is for the !CONFIG_JUMP_LABEL case its ok 100 * to have it be a function here. Similarly, for 'static_key_enable()' and 101 * 'static_key_disable()', which require bug.h. This should allow jump_label.h 102 * to be included from most/all places for CONFIG_JUMP_LABEL. 103 */ 104 int static_key_count(struct static_key *key) 105 { 106 /* 107 * -1 means the first static_key_slow_inc() is in progress. 108 * static_key_enabled() must return true, so return 1 here. 109 */ 110 int n = atomic_read(&key->enabled); 111 112 return n >= 0 ? n : 1; 113 } 114 EXPORT_SYMBOL_GPL(static_key_count); 115 116 /* 117 * static_key_fast_inc_not_disabled - adds a user for a static key 118 * @key: static key that must be already enabled 119 * 120 * The caller must make sure that the static key can't get disabled while 121 * in this function. It doesn't patch jump labels, only adds a user to 122 * an already enabled static key. 123 * 124 * Returns true if the increment was done. Unlike refcount_t the ref counter 125 * is not saturated, but will fail to increment on overflow. 126 */ 127 bool static_key_fast_inc_not_disabled(struct static_key *key) 128 { 129 int v; 130 131 STATIC_KEY_CHECK_USE(key); 132 /* 133 * Negative key->enabled has a special meaning: it sends 134 * static_key_slow_inc/dec() down the slow path, and it is non-zero 135 * so it counts as "enabled" in jump_label_update(). Note that 136 * atomic_inc_unless_negative() checks >= 0, so roll our own. 137 */ 138 v = atomic_read(&key->enabled); 139 do { 140 if (v <= 0 || (v + 1) < 0) 141 return false; 142 } while (!likely(atomic_try_cmpxchg(&key->enabled, &v, v + 1))); 143 144 return true; 145 } 146 EXPORT_SYMBOL_GPL(static_key_fast_inc_not_disabled); 147 148 bool static_key_slow_inc_cpuslocked(struct static_key *key) 149 { 150 lockdep_assert_cpus_held(); 151 152 /* 153 * Careful if we get concurrent static_key_slow_inc/dec() calls; 154 * later calls must wait for the first one to _finish_ the 155 * jump_label_update() process. At the same time, however, 156 * the jump_label_update() call below wants to see 157 * static_key_enabled(&key) for jumps to be updated properly. 158 */ 159 if (static_key_fast_inc_not_disabled(key)) 160 return true; 161 162 guard(mutex)(&jump_label_mutex); 163 /* Try to mark it as 'enabling in progress. */ 164 if (!atomic_cmpxchg(&key->enabled, 0, -1)) { 165 jump_label_update(key); 166 /* 167 * Ensure that when static_key_fast_inc_not_disabled() or 168 * static_key_dec_not_one() observe the positive value, 169 * they must also observe all the text changes. 170 */ 171 atomic_set_release(&key->enabled, 1); 172 } else { 173 /* 174 * While holding the mutex this should never observe 175 * anything else than a value >= 1 and succeed 176 */ 177 if (WARN_ON_ONCE(!static_key_fast_inc_not_disabled(key))) 178 return false; 179 } 180 return true; 181 } 182 183 bool static_key_slow_inc(struct static_key *key) 184 { 185 bool ret; 186 187 cpus_read_lock(); 188 ret = static_key_slow_inc_cpuslocked(key); 189 cpus_read_unlock(); 190 return ret; 191 } 192 EXPORT_SYMBOL_GPL(static_key_slow_inc); 193 194 void static_key_enable_cpuslocked(struct static_key *key) 195 { 196 STATIC_KEY_CHECK_USE(key); 197 lockdep_assert_cpus_held(); 198 199 if (atomic_read(&key->enabled) > 0) { 200 WARN_ON_ONCE(atomic_read(&key->enabled) != 1); 201 return; 202 } 203 204 jump_label_lock(); 205 if (atomic_read(&key->enabled) == 0) { 206 atomic_set(&key->enabled, -1); 207 jump_label_update(key); 208 /* 209 * See static_key_slow_inc(). 210 */ 211 atomic_set_release(&key->enabled, 1); 212 } 213 jump_label_unlock(); 214 } 215 EXPORT_SYMBOL_GPL(static_key_enable_cpuslocked); 216 217 void static_key_enable(struct static_key *key) 218 { 219 cpus_read_lock(); 220 static_key_enable_cpuslocked(key); 221 cpus_read_unlock(); 222 } 223 EXPORT_SYMBOL_GPL(static_key_enable); 224 225 void static_key_disable_cpuslocked(struct static_key *key) 226 { 227 STATIC_KEY_CHECK_USE(key); 228 lockdep_assert_cpus_held(); 229 230 if (atomic_read(&key->enabled) != 1) { 231 WARN_ON_ONCE(atomic_read(&key->enabled) != 0); 232 return; 233 } 234 235 jump_label_lock(); 236 if (atomic_cmpxchg(&key->enabled, 1, 0) == 1) 237 jump_label_update(key); 238 jump_label_unlock(); 239 } 240 EXPORT_SYMBOL_GPL(static_key_disable_cpuslocked); 241 242 void static_key_disable(struct static_key *key) 243 { 244 cpus_read_lock(); 245 static_key_disable_cpuslocked(key); 246 cpus_read_unlock(); 247 } 248 EXPORT_SYMBOL_GPL(static_key_disable); 249 250 static bool static_key_dec_not_one(struct static_key *key) 251 { 252 int v; 253 254 /* 255 * Go into the slow path if key::enabled is less than or equal than 256 * one. One is valid to shut down the key, anything less than one 257 * is an imbalance, which is handled at the call site. 258 * 259 * That includes the special case of '-1' which is set in 260 * static_key_slow_inc_cpuslocked(), but that's harmless as it is 261 * fully serialized in the slow path below. By the time this task 262 * acquires the jump label lock the value is back to one and the 263 * retry under the lock must succeed. 264 */ 265 v = atomic_read(&key->enabled); 266 do { 267 /* 268 * Warn about the '-1' case though; since that means a 269 * decrement is concurrent with a first (0->1) increment. IOW 270 * people are trying to disable something that wasn't yet fully 271 * enabled. This suggests an ordering problem on the user side. 272 */ 273 WARN_ON_ONCE(v < 0); 274 275 /* 276 * Warn about underflow, and lie about success in an attempt to 277 * not make things worse. 278 */ 279 if (WARN_ON_ONCE(v == 0)) 280 return true; 281 282 if (v <= 1) 283 return false; 284 } while (!likely(atomic_try_cmpxchg(&key->enabled, &v, v - 1))); 285 286 return true; 287 } 288 289 static void __static_key_slow_dec_cpuslocked(struct static_key *key) 290 { 291 lockdep_assert_cpus_held(); 292 int val; 293 294 if (static_key_dec_not_one(key)) 295 return; 296 297 guard(mutex)(&jump_label_mutex); 298 val = atomic_read(&key->enabled); 299 /* 300 * It should be impossible to observe -1 with jump_label_mutex held, 301 * see static_key_slow_inc_cpuslocked(). 302 */ 303 if (WARN_ON_ONCE(val == -1)) 304 return; 305 /* 306 * Cannot already be 0, something went sideways. 307 */ 308 if (WARN_ON_ONCE(val == 0)) 309 return; 310 311 if (atomic_dec_and_test(&key->enabled)) 312 jump_label_update(key); 313 } 314 315 static void __static_key_slow_dec(struct static_key *key) 316 { 317 cpus_read_lock(); 318 __static_key_slow_dec_cpuslocked(key); 319 cpus_read_unlock(); 320 } 321 322 void jump_label_update_timeout(struct work_struct *work) 323 { 324 struct static_key_deferred *key = 325 container_of(work, struct static_key_deferred, work.work); 326 __static_key_slow_dec(&key->key); 327 } 328 EXPORT_SYMBOL_GPL(jump_label_update_timeout); 329 330 void static_key_slow_dec(struct static_key *key) 331 { 332 STATIC_KEY_CHECK_USE(key); 333 __static_key_slow_dec(key); 334 } 335 EXPORT_SYMBOL_GPL(static_key_slow_dec); 336 337 void static_key_slow_dec_cpuslocked(struct static_key *key) 338 { 339 STATIC_KEY_CHECK_USE(key); 340 __static_key_slow_dec_cpuslocked(key); 341 } 342 343 void __static_key_slow_dec_deferred(struct static_key *key, 344 struct delayed_work *work, 345 unsigned long timeout) 346 { 347 STATIC_KEY_CHECK_USE(key); 348 349 if (static_key_dec_not_one(key)) 350 return; 351 352 schedule_delayed_work(work, timeout); 353 } 354 EXPORT_SYMBOL_GPL(__static_key_slow_dec_deferred); 355 356 void __static_key_deferred_flush(void *key, struct delayed_work *work) 357 { 358 STATIC_KEY_CHECK_USE(key); 359 flush_delayed_work(work); 360 } 361 EXPORT_SYMBOL_GPL(__static_key_deferred_flush); 362 363 void jump_label_rate_limit(struct static_key_deferred *key, 364 unsigned long rl) 365 { 366 STATIC_KEY_CHECK_USE(key); 367 key->timeout = rl; 368 INIT_DELAYED_WORK(&key->work, jump_label_update_timeout); 369 } 370 EXPORT_SYMBOL_GPL(jump_label_rate_limit); 371 372 static int addr_conflict(struct jump_entry *entry, void *start, void *end) 373 { 374 if (jump_entry_code(entry) <= (unsigned long)end && 375 jump_entry_code(entry) + jump_entry_size(entry) > (unsigned long)start) 376 return 1; 377 378 return 0; 379 } 380 381 static int __jump_label_text_reserved(struct jump_entry *iter_start, 382 struct jump_entry *iter_stop, void *start, void *end, bool init) 383 { 384 struct jump_entry *iter; 385 386 iter = iter_start; 387 while (iter < iter_stop) { 388 if (init || !jump_entry_is_init(iter)) { 389 if (addr_conflict(iter, start, end)) 390 return 1; 391 } 392 iter++; 393 } 394 395 return 0; 396 } 397 398 #ifndef arch_jump_label_transform_static 399 static void arch_jump_label_transform_static(struct jump_entry *entry, 400 enum jump_label_type type) 401 { 402 /* nothing to do on most architectures */ 403 } 404 #endif 405 406 static inline struct jump_entry *static_key_entries(struct static_key *key) 407 { 408 WARN_ON_ONCE(key->type & JUMP_TYPE_LINKED); 409 return (struct jump_entry *)(key->type & ~JUMP_TYPE_MASK); 410 } 411 412 static inline bool static_key_type(struct static_key *key) 413 { 414 return key->type & JUMP_TYPE_TRUE; 415 } 416 417 static inline bool static_key_linked(struct static_key *key) 418 { 419 return key->type & JUMP_TYPE_LINKED; 420 } 421 422 static inline void static_key_clear_linked(struct static_key *key) 423 { 424 key->type &= ~JUMP_TYPE_LINKED; 425 } 426 427 static inline void static_key_set_linked(struct static_key *key) 428 { 429 key->type |= JUMP_TYPE_LINKED; 430 } 431 432 /*** 433 * A 'struct static_key' uses a union such that it either points directly 434 * to a table of 'struct jump_entry' or to a linked list of modules which in 435 * turn point to 'struct jump_entry' tables. 436 * 437 * The two lower bits of the pointer are used to keep track of which pointer 438 * type is in use and to store the initial branch direction, we use an access 439 * function which preserves these bits. 440 */ 441 static void static_key_set_entries(struct static_key *key, 442 struct jump_entry *entries) 443 { 444 unsigned long type; 445 446 WARN_ON_ONCE((unsigned long)entries & JUMP_TYPE_MASK); 447 type = key->type & JUMP_TYPE_MASK; 448 key->entries = entries; 449 key->type |= type; 450 } 451 452 static enum jump_label_type jump_label_type(struct jump_entry *entry) 453 { 454 struct static_key *key = jump_entry_key(entry); 455 bool enabled = static_key_enabled(key); 456 bool branch = jump_entry_is_branch(entry); 457 458 /* See the comment in linux/jump_label.h */ 459 return enabled ^ branch; 460 } 461 462 static bool jump_label_can_update(struct jump_entry *entry, bool init) 463 { 464 /* 465 * Cannot update code that was in an init text area. 466 */ 467 if (!init && jump_entry_is_init(entry)) 468 return false; 469 470 if (!kernel_text_address(jump_entry_code(entry))) { 471 /* 472 * This skips patching built-in __exit, which 473 * is part of init_section_contains() but is 474 * not part of kernel_text_address(). 475 * 476 * Skipping built-in __exit is fine since it 477 * will never be executed. 478 */ 479 WARN_ONCE(!jump_entry_is_init(entry), 480 "can't patch jump_label at %pS", 481 (void *)jump_entry_code(entry)); 482 return false; 483 } 484 485 return true; 486 } 487 488 #ifndef HAVE_JUMP_LABEL_BATCH 489 static void __jump_label_update(struct static_key *key, 490 struct jump_entry *entry, 491 struct jump_entry *stop, 492 bool init) 493 { 494 for (; (entry < stop) && (jump_entry_key(entry) == key); entry++) { 495 if (jump_label_can_update(entry, init)) 496 arch_jump_label_transform(entry, jump_label_type(entry)); 497 } 498 } 499 #else 500 static void __jump_label_update(struct static_key *key, 501 struct jump_entry *entry, 502 struct jump_entry *stop, 503 bool init) 504 { 505 for (; (entry < stop) && (jump_entry_key(entry) == key); entry++) { 506 507 if (!jump_label_can_update(entry, init)) 508 continue; 509 510 if (!arch_jump_label_transform_queue(entry, jump_label_type(entry))) { 511 /* 512 * Queue is full: Apply the current queue and try again. 513 */ 514 arch_jump_label_transform_apply(); 515 BUG_ON(!arch_jump_label_transform_queue(entry, jump_label_type(entry))); 516 } 517 } 518 arch_jump_label_transform_apply(); 519 } 520 #endif 521 522 void __init jump_label_init(void) 523 { 524 struct jump_entry *iter_start = __start___jump_table; 525 struct jump_entry *iter_stop = __stop___jump_table; 526 struct static_key *key = NULL; 527 struct jump_entry *iter; 528 529 /* 530 * Since we are initializing the static_key.enabled field with 531 * with the 'raw' int values (to avoid pulling in atomic.h) in 532 * jump_label.h, let's make sure that is safe. There are only two 533 * cases to check since we initialize to 0 or 1. 534 */ 535 BUILD_BUG_ON((int)ATOMIC_INIT(0) != 0); 536 BUILD_BUG_ON((int)ATOMIC_INIT(1) != 1); 537 538 if (static_key_initialized) 539 return; 540 541 cpus_read_lock(); 542 jump_label_lock(); 543 jump_label_sort_entries(iter_start, iter_stop); 544 545 for (iter = iter_start; iter < iter_stop; iter++) { 546 struct static_key *iterk; 547 bool in_init; 548 549 /* rewrite NOPs */ 550 if (jump_label_type(iter) == JUMP_LABEL_NOP) 551 arch_jump_label_transform_static(iter, JUMP_LABEL_NOP); 552 553 in_init = init_section_contains((void *)jump_entry_code(iter), 1); 554 jump_entry_set_init(iter, in_init); 555 556 iterk = jump_entry_key(iter); 557 if (iterk == key) 558 continue; 559 560 key = iterk; 561 static_key_set_entries(key, iter); 562 } 563 static_key_initialized = true; 564 jump_label_unlock(); 565 cpus_read_unlock(); 566 } 567 568 #ifdef CONFIG_MODULES 569 570 enum jump_label_type jump_label_init_type(struct jump_entry *entry) 571 { 572 struct static_key *key = jump_entry_key(entry); 573 bool type = static_key_type(key); 574 bool branch = jump_entry_is_branch(entry); 575 576 /* See the comment in linux/jump_label.h */ 577 return type ^ branch; 578 } 579 580 struct static_key_mod { 581 struct static_key_mod *next; 582 struct jump_entry *entries; 583 struct module *mod; 584 }; 585 586 static inline struct static_key_mod *static_key_mod(struct static_key *key) 587 { 588 WARN_ON_ONCE(!static_key_linked(key)); 589 return (struct static_key_mod *)(key->type & ~JUMP_TYPE_MASK); 590 } 591 592 /*** 593 * key->type and key->next are the same via union. 594 * This sets key->next and preserves the type bits. 595 * 596 * See additional comments above static_key_set_entries(). 597 */ 598 static void static_key_set_mod(struct static_key *key, 599 struct static_key_mod *mod) 600 { 601 unsigned long type; 602 603 WARN_ON_ONCE((unsigned long)mod & JUMP_TYPE_MASK); 604 type = key->type & JUMP_TYPE_MASK; 605 key->next = mod; 606 key->type |= type; 607 } 608 609 static int __jump_label_mod_text_reserved(void *start, void *end) 610 { 611 struct module *mod; 612 int ret; 613 614 preempt_disable(); 615 mod = __module_text_address((unsigned long)start); 616 WARN_ON_ONCE(__module_text_address((unsigned long)end) != mod); 617 if (!try_module_get(mod)) 618 mod = NULL; 619 preempt_enable(); 620 621 if (!mod) 622 return 0; 623 624 ret = __jump_label_text_reserved(mod->jump_entries, 625 mod->jump_entries + mod->num_jump_entries, 626 start, end, mod->state == MODULE_STATE_COMING); 627 628 module_put(mod); 629 630 return ret; 631 } 632 633 static void __jump_label_mod_update(struct static_key *key) 634 { 635 struct static_key_mod *mod; 636 637 for (mod = static_key_mod(key); mod; mod = mod->next) { 638 struct jump_entry *stop; 639 struct module *m; 640 641 /* 642 * NULL if the static_key is defined in a module 643 * that does not use it 644 */ 645 if (!mod->entries) 646 continue; 647 648 m = mod->mod; 649 if (!m) 650 stop = __stop___jump_table; 651 else 652 stop = m->jump_entries + m->num_jump_entries; 653 __jump_label_update(key, mod->entries, stop, 654 m && m->state == MODULE_STATE_COMING); 655 } 656 } 657 658 static int jump_label_add_module(struct module *mod) 659 { 660 struct jump_entry *iter_start = mod->jump_entries; 661 struct jump_entry *iter_stop = iter_start + mod->num_jump_entries; 662 struct jump_entry *iter; 663 struct static_key *key = NULL; 664 struct static_key_mod *jlm, *jlm2; 665 666 /* if the module doesn't have jump label entries, just return */ 667 if (iter_start == iter_stop) 668 return 0; 669 670 jump_label_sort_entries(iter_start, iter_stop); 671 672 for (iter = iter_start; iter < iter_stop; iter++) { 673 struct static_key *iterk; 674 bool in_init; 675 676 in_init = within_module_init(jump_entry_code(iter), mod); 677 jump_entry_set_init(iter, in_init); 678 679 iterk = jump_entry_key(iter); 680 if (iterk == key) 681 continue; 682 683 key = iterk; 684 if (within_module((unsigned long)key, mod)) { 685 static_key_set_entries(key, iter); 686 continue; 687 } 688 jlm = kzalloc(sizeof(struct static_key_mod), GFP_KERNEL); 689 if (!jlm) 690 return -ENOMEM; 691 if (!static_key_linked(key)) { 692 jlm2 = kzalloc(sizeof(struct static_key_mod), 693 GFP_KERNEL); 694 if (!jlm2) { 695 kfree(jlm); 696 return -ENOMEM; 697 } 698 preempt_disable(); 699 jlm2->mod = __module_address((unsigned long)key); 700 preempt_enable(); 701 jlm2->entries = static_key_entries(key); 702 jlm2->next = NULL; 703 static_key_set_mod(key, jlm2); 704 static_key_set_linked(key); 705 } 706 jlm->mod = mod; 707 jlm->entries = iter; 708 jlm->next = static_key_mod(key); 709 static_key_set_mod(key, jlm); 710 static_key_set_linked(key); 711 712 /* Only update if we've changed from our initial state */ 713 if (jump_label_type(iter) != jump_label_init_type(iter)) 714 __jump_label_update(key, iter, iter_stop, true); 715 } 716 717 return 0; 718 } 719 720 static void jump_label_del_module(struct module *mod) 721 { 722 struct jump_entry *iter_start = mod->jump_entries; 723 struct jump_entry *iter_stop = iter_start + mod->num_jump_entries; 724 struct jump_entry *iter; 725 struct static_key *key = NULL; 726 struct static_key_mod *jlm, **prev; 727 728 for (iter = iter_start; iter < iter_stop; iter++) { 729 if (jump_entry_key(iter) == key) 730 continue; 731 732 key = jump_entry_key(iter); 733 734 if (within_module((unsigned long)key, mod)) 735 continue; 736 737 /* No memory during module load */ 738 if (WARN_ON(!static_key_linked(key))) 739 continue; 740 741 prev = &key->next; 742 jlm = static_key_mod(key); 743 744 while (jlm && jlm->mod != mod) { 745 prev = &jlm->next; 746 jlm = jlm->next; 747 } 748 749 /* No memory during module load */ 750 if (WARN_ON(!jlm)) 751 continue; 752 753 if (prev == &key->next) 754 static_key_set_mod(key, jlm->next); 755 else 756 *prev = jlm->next; 757 758 kfree(jlm); 759 760 jlm = static_key_mod(key); 761 /* if only one etry is left, fold it back into the static_key */ 762 if (jlm->next == NULL) { 763 static_key_set_entries(key, jlm->entries); 764 static_key_clear_linked(key); 765 kfree(jlm); 766 } 767 } 768 } 769 770 static int 771 jump_label_module_notify(struct notifier_block *self, unsigned long val, 772 void *data) 773 { 774 struct module *mod = data; 775 int ret = 0; 776 777 cpus_read_lock(); 778 jump_label_lock(); 779 780 switch (val) { 781 case MODULE_STATE_COMING: 782 ret = jump_label_add_module(mod); 783 if (ret) { 784 WARN(1, "Failed to allocate memory: jump_label may not work properly.\n"); 785 jump_label_del_module(mod); 786 } 787 break; 788 case MODULE_STATE_GOING: 789 jump_label_del_module(mod); 790 break; 791 } 792 793 jump_label_unlock(); 794 cpus_read_unlock(); 795 796 return notifier_from_errno(ret); 797 } 798 799 static struct notifier_block jump_label_module_nb = { 800 .notifier_call = jump_label_module_notify, 801 .priority = 1, /* higher than tracepoints */ 802 }; 803 804 static __init int jump_label_init_module(void) 805 { 806 return register_module_notifier(&jump_label_module_nb); 807 } 808 early_initcall(jump_label_init_module); 809 810 #endif /* CONFIG_MODULES */ 811 812 /*** 813 * jump_label_text_reserved - check if addr range is reserved 814 * @start: start text addr 815 * @end: end text addr 816 * 817 * checks if the text addr located between @start and @end 818 * overlaps with any of the jump label patch addresses. Code 819 * that wants to modify kernel text should first verify that 820 * it does not overlap with any of the jump label addresses. 821 * Caller must hold jump_label_mutex. 822 * 823 * returns 1 if there is an overlap, 0 otherwise 824 */ 825 int jump_label_text_reserved(void *start, void *end) 826 { 827 bool init = system_state < SYSTEM_RUNNING; 828 int ret = __jump_label_text_reserved(__start___jump_table, 829 __stop___jump_table, start, end, init); 830 831 if (ret) 832 return ret; 833 834 #ifdef CONFIG_MODULES 835 ret = __jump_label_mod_text_reserved(start, end); 836 #endif 837 return ret; 838 } 839 840 static void jump_label_update(struct static_key *key) 841 { 842 struct jump_entry *stop = __stop___jump_table; 843 bool init = system_state < SYSTEM_RUNNING; 844 struct jump_entry *entry; 845 #ifdef CONFIG_MODULES 846 struct module *mod; 847 848 if (static_key_linked(key)) { 849 __jump_label_mod_update(key); 850 return; 851 } 852 853 preempt_disable(); 854 mod = __module_address((unsigned long)key); 855 if (mod) { 856 stop = mod->jump_entries + mod->num_jump_entries; 857 init = mod->state == MODULE_STATE_COMING; 858 } 859 preempt_enable(); 860 #endif 861 entry = static_key_entries(key); 862 /* if there are no users, entry can be NULL */ 863 if (entry) 864 __jump_label_update(key, entry, stop, init); 865 } 866 867 #ifdef CONFIG_STATIC_KEYS_SELFTEST 868 static DEFINE_STATIC_KEY_TRUE(sk_true); 869 static DEFINE_STATIC_KEY_FALSE(sk_false); 870 871 static __init int jump_label_test(void) 872 { 873 int i; 874 875 for (i = 0; i < 2; i++) { 876 WARN_ON(static_key_enabled(&sk_true.key) != true); 877 WARN_ON(static_key_enabled(&sk_false.key) != false); 878 879 WARN_ON(!static_branch_likely(&sk_true)); 880 WARN_ON(!static_branch_unlikely(&sk_true)); 881 WARN_ON(static_branch_likely(&sk_false)); 882 WARN_ON(static_branch_unlikely(&sk_false)); 883 884 static_branch_disable(&sk_true); 885 static_branch_enable(&sk_false); 886 887 WARN_ON(static_key_enabled(&sk_true.key) == true); 888 WARN_ON(static_key_enabled(&sk_false.key) == false); 889 890 WARN_ON(static_branch_likely(&sk_true)); 891 WARN_ON(static_branch_unlikely(&sk_true)); 892 WARN_ON(!static_branch_likely(&sk_false)); 893 WARN_ON(!static_branch_unlikely(&sk_false)); 894 895 static_branch_enable(&sk_true); 896 static_branch_disable(&sk_false); 897 } 898 899 return 0; 900 } 901 early_initcall(jump_label_test); 902 #endif /* STATIC_KEYS_SELFTEST */ 903