]> asedeno.scripts.mit.edu Git - linux.git/blob - kernel/jump_label.c
b71776576a66926000fd9fc750d835511c296e5e
[linux.git] / kernel / jump_label.c
1 /*
2  * jump label support
3  *
4  * Copyright (C) 2009 Jason Baron <jbaron@redhat.com>
5  * Copyright (C) 2011 Peter Zijlstra
6  *
7  */
8 #include <linux/memory.h>
9 #include <linux/uaccess.h>
10 #include <linux/module.h>
11 #include <linux/list.h>
12 #include <linux/slab.h>
13 #include <linux/sort.h>
14 #include <linux/err.h>
15 #include <linux/static_key.h>
16 #include <linux/jump_label_ratelimit.h>
17 #include <linux/bug.h>
18 #include <linux/cpu.h>
19 #include <asm/sections.h>
20
21 #ifdef HAVE_JUMP_LABEL
22
23 /* mutex to protect coming/going of the the jump_label table */
24 static DEFINE_MUTEX(jump_label_mutex);
25
26 void jump_label_lock(void)
27 {
28         mutex_lock(&jump_label_mutex);
29 }
30
31 void jump_label_unlock(void)
32 {
33         mutex_unlock(&jump_label_mutex);
34 }
35
36 static int jump_label_cmp(const void *a, const void *b)
37 {
38         const struct jump_entry *jea = a;
39         const struct jump_entry *jeb = b;
40
41         if (jea->key < jeb->key)
42                 return -1;
43
44         if (jea->key > jeb->key)
45                 return 1;
46
47         return 0;
48 }
49
50 static void
51 jump_label_sort_entries(struct jump_entry *start, struct jump_entry *stop)
52 {
53         unsigned long size;
54
55         size = (((unsigned long)stop - (unsigned long)start)
56                                         / sizeof(struct jump_entry));
57         sort(start, size, sizeof(struct jump_entry), jump_label_cmp, NULL);
58 }
59
60 static void jump_label_update(struct static_key *key);
61
62 /*
63  * There are similar definitions for the !HAVE_JUMP_LABEL case in jump_label.h.
64  * The use of 'atomic_read()' requires atomic.h and its problematic for some
65  * kernel headers such as kernel.h and others. Since static_key_count() is not
66  * used in the branch statements as it is for the !HAVE_JUMP_LABEL case its ok
67  * to have it be a function here. Similarly, for 'static_key_enable()' and
68  * 'static_key_disable()', which require bug.h. This should allow jump_label.h
69  * to be included from most/all places for HAVE_JUMP_LABEL.
70  */
71 int static_key_count(struct static_key *key)
72 {
73         /*
74          * -1 means the first static_key_slow_inc() is in progress.
75          *  static_key_enabled() must return true, so return 1 here.
76          */
77         int n = atomic_read(&key->enabled);
78
79         return n >= 0 ? n : 1;
80 }
81 EXPORT_SYMBOL_GPL(static_key_count);
82
83 void static_key_slow_inc_cpuslocked(struct static_key *key)
84 {
85         int v, v1;
86
87         STATIC_KEY_CHECK_USE(key);
88
89         /*
90          * Careful if we get concurrent static_key_slow_inc() calls;
91          * later calls must wait for the first one to _finish_ the
92          * jump_label_update() process.  At the same time, however,
93          * the jump_label_update() call below wants to see
94          * static_key_enabled(&key) for jumps to be updated properly.
95          *
96          * So give a special meaning to negative key->enabled: it sends
97          * static_key_slow_inc() down the slow path, and it is non-zero
98          * so it counts as "enabled" in jump_label_update().  Note that
99          * atomic_inc_unless_negative() checks >= 0, so roll our own.
100          */
101         for (v = atomic_read(&key->enabled); v > 0; v = v1) {
102                 v1 = atomic_cmpxchg(&key->enabled, v, v + 1);
103                 if (likely(v1 == v))
104                         return;
105         }
106
107         jump_label_lock();
108         if (atomic_read(&key->enabled) == 0) {
109                 atomic_set(&key->enabled, -1);
110                 jump_label_update(key);
111                 /*
112                  * Ensure that if the above cmpxchg loop observes our positive
113                  * value, it must also observe all the text changes.
114                  */
115                 atomic_set_release(&key->enabled, 1);
116         } else {
117                 atomic_inc(&key->enabled);
118         }
119         jump_label_unlock();
120 }
121
122 void static_key_slow_inc(struct static_key *key)
123 {
124         cpus_read_lock();
125         static_key_slow_inc_cpuslocked(key);
126         cpus_read_unlock();
127 }
128 EXPORT_SYMBOL_GPL(static_key_slow_inc);
129
130 void static_key_enable_cpuslocked(struct static_key *key)
131 {
132         STATIC_KEY_CHECK_USE(key);
133
134         if (atomic_read(&key->enabled) > 0) {
135                 WARN_ON_ONCE(atomic_read(&key->enabled) != 1);
136                 return;
137         }
138
139         jump_label_lock();
140         if (atomic_read(&key->enabled) == 0) {
141                 atomic_set(&key->enabled, -1);
142                 jump_label_update(key);
143                 /*
144                  * See static_key_slow_inc().
145                  */
146                 atomic_set_release(&key->enabled, 1);
147         }
148         jump_label_unlock();
149 }
150 EXPORT_SYMBOL_GPL(static_key_enable_cpuslocked);
151
152 void static_key_enable(struct static_key *key)
153 {
154         cpus_read_lock();
155         static_key_enable_cpuslocked(key);
156         cpus_read_unlock();
157 }
158 EXPORT_SYMBOL_GPL(static_key_enable);
159
160 void static_key_disable_cpuslocked(struct static_key *key)
161 {
162         STATIC_KEY_CHECK_USE(key);
163
164         if (atomic_read(&key->enabled) != 1) {
165                 WARN_ON_ONCE(atomic_read(&key->enabled) != 0);
166                 return;
167         }
168
169         jump_label_lock();
170         if (atomic_cmpxchg(&key->enabled, 1, 0))
171                 jump_label_update(key);
172         jump_label_unlock();
173 }
174 EXPORT_SYMBOL_GPL(static_key_disable_cpuslocked);
175
176 void static_key_disable(struct static_key *key)
177 {
178         cpus_read_lock();
179         static_key_disable_cpuslocked(key);
180         cpus_read_unlock();
181 }
182 EXPORT_SYMBOL_GPL(static_key_disable);
183
184 static void __static_key_slow_dec_cpuslocked(struct static_key *key,
185                                            unsigned long rate_limit,
186                                            struct delayed_work *work)
187 {
188         /*
189          * The negative count check is valid even when a negative
190          * key->enabled is in use by static_key_slow_inc(); a
191          * __static_key_slow_dec() before the first static_key_slow_inc()
192          * returns is unbalanced, because all other static_key_slow_inc()
193          * instances block while the update is in progress.
194          */
195         if (!atomic_dec_and_mutex_lock(&key->enabled, &jump_label_mutex)) {
196                 WARN(atomic_read(&key->enabled) < 0,
197                      "jump label: negative count!\n");
198                 return;
199         }
200
201         if (rate_limit) {
202                 atomic_inc(&key->enabled);
203                 schedule_delayed_work(work, rate_limit);
204         } else {
205                 jump_label_update(key);
206         }
207         jump_label_unlock();
208 }
209
210 static void __static_key_slow_dec(struct static_key *key,
211                                   unsigned long rate_limit,
212                                   struct delayed_work *work)
213 {
214         cpus_read_lock();
215         __static_key_slow_dec_cpuslocked(key, rate_limit, work);
216         cpus_read_unlock();
217 }
218
219 static void jump_label_update_timeout(struct work_struct *work)
220 {
221         struct static_key_deferred *key =
222                 container_of(work, struct static_key_deferred, work.work);
223         __static_key_slow_dec(&key->key, 0, NULL);
224 }
225
226 void static_key_slow_dec(struct static_key *key)
227 {
228         STATIC_KEY_CHECK_USE(key);
229         __static_key_slow_dec(key, 0, NULL);
230 }
231 EXPORT_SYMBOL_GPL(static_key_slow_dec);
232
233 void static_key_slow_dec_cpuslocked(struct static_key *key)
234 {
235         STATIC_KEY_CHECK_USE(key);
236         __static_key_slow_dec_cpuslocked(key, 0, NULL);
237 }
238
239 void static_key_slow_dec_deferred(struct static_key_deferred *key)
240 {
241         STATIC_KEY_CHECK_USE(key);
242         __static_key_slow_dec(&key->key, key->timeout, &key->work);
243 }
244 EXPORT_SYMBOL_GPL(static_key_slow_dec_deferred);
245
246 void static_key_deferred_flush(struct static_key_deferred *key)
247 {
248         STATIC_KEY_CHECK_USE(key);
249         flush_delayed_work(&key->work);
250 }
251 EXPORT_SYMBOL_GPL(static_key_deferred_flush);
252
253 void jump_label_rate_limit(struct static_key_deferred *key,
254                 unsigned long rl)
255 {
256         STATIC_KEY_CHECK_USE(key);
257         key->timeout = rl;
258         INIT_DELAYED_WORK(&key->work, jump_label_update_timeout);
259 }
260 EXPORT_SYMBOL_GPL(jump_label_rate_limit);
261
262 static int addr_conflict(struct jump_entry *entry, void *start, void *end)
263 {
264         if (entry->code <= (unsigned long)end &&
265                 entry->code + JUMP_LABEL_NOP_SIZE > (unsigned long)start)
266                 return 1;
267
268         return 0;
269 }
270
271 static int __jump_label_text_reserved(struct jump_entry *iter_start,
272                 struct jump_entry *iter_stop, void *start, void *end)
273 {
274         struct jump_entry *iter;
275
276         iter = iter_start;
277         while (iter < iter_stop) {
278                 if (addr_conflict(iter, start, end))
279                         return 1;
280                 iter++;
281         }
282
283         return 0;
284 }
285
286 /*
287  * Update code which is definitely not currently executing.
288  * Architectures which need heavyweight synchronization to modify
289  * running code can override this to make the non-live update case
290  * cheaper.
291  */
292 void __weak __init_or_module arch_jump_label_transform_static(struct jump_entry *entry,
293                                             enum jump_label_type type)
294 {
295         arch_jump_label_transform(entry, type);
296 }
297
298 static inline struct jump_entry *static_key_entries(struct static_key *key)
299 {
300         WARN_ON_ONCE(key->type & JUMP_TYPE_LINKED);
301         return (struct jump_entry *)(key->type & ~JUMP_TYPE_MASK);
302 }
303
304 static inline bool static_key_type(struct static_key *key)
305 {
306         return key->type & JUMP_TYPE_TRUE;
307 }
308
309 static inline bool static_key_linked(struct static_key *key)
310 {
311         return key->type & JUMP_TYPE_LINKED;
312 }
313
314 static inline void static_key_clear_linked(struct static_key *key)
315 {
316         key->type &= ~JUMP_TYPE_LINKED;
317 }
318
319 static inline void static_key_set_linked(struct static_key *key)
320 {
321         key->type |= JUMP_TYPE_LINKED;
322 }
323
324 static inline struct static_key *jump_entry_key(struct jump_entry *entry)
325 {
326         return (struct static_key *)((unsigned long)entry->key & ~1UL);
327 }
328
329 static bool jump_entry_branch(struct jump_entry *entry)
330 {
331         return (unsigned long)entry->key & 1UL;
332 }
333
334 /***
335  * A 'struct static_key' uses a union such that it either points directly
336  * to a table of 'struct jump_entry' or to a linked list of modules which in
337  * turn point to 'struct jump_entry' tables.
338  *
339  * The two lower bits of the pointer are used to keep track of which pointer
340  * type is in use and to store the initial branch direction, we use an access
341  * function which preserves these bits.
342  */
343 static void static_key_set_entries(struct static_key *key,
344                                    struct jump_entry *entries)
345 {
346         unsigned long type;
347
348         WARN_ON_ONCE((unsigned long)entries & JUMP_TYPE_MASK);
349         type = key->type & JUMP_TYPE_MASK;
350         key->entries = entries;
351         key->type |= type;
352 }
353
354 static enum jump_label_type jump_label_type(struct jump_entry *entry)
355 {
356         struct static_key *key = jump_entry_key(entry);
357         bool enabled = static_key_enabled(key);
358         bool branch = jump_entry_branch(entry);
359
360         /* See the comment in linux/jump_label.h */
361         return enabled ^ branch;
362 }
363
364 static void __jump_label_update(struct static_key *key,
365                                 struct jump_entry *entry,
366                                 struct jump_entry *stop)
367 {
368         for (; (entry < stop) && (jump_entry_key(entry) == key); entry++) {
369                 /*
370                  * entry->code set to 0 invalidates module init text sections
371                  * kernel_text_address() verifies we are not in core kernel
372                  * init code, see jump_label_invalidate_module_init().
373                  */
374                 if (entry->code && kernel_text_address(entry->code))
375                         arch_jump_label_transform(entry, jump_label_type(entry));
376         }
377 }
378
379 void __init jump_label_init(void)
380 {
381         struct jump_entry *iter_start = __start___jump_table;
382         struct jump_entry *iter_stop = __stop___jump_table;
383         struct static_key *key = NULL;
384         struct jump_entry *iter;
385
386         /*
387          * Since we are initializing the static_key.enabled field with
388          * with the 'raw' int values (to avoid pulling in atomic.h) in
389          * jump_label.h, let's make sure that is safe. There are only two
390          * cases to check since we initialize to 0 or 1.
391          */
392         BUILD_BUG_ON((int)ATOMIC_INIT(0) != 0);
393         BUILD_BUG_ON((int)ATOMIC_INIT(1) != 1);
394
395         if (static_key_initialized)
396                 return;
397
398         cpus_read_lock();
399         jump_label_lock();
400         jump_label_sort_entries(iter_start, iter_stop);
401
402         for (iter = iter_start; iter < iter_stop; iter++) {
403                 struct static_key *iterk;
404
405                 /* rewrite NOPs */
406                 if (jump_label_type(iter) == JUMP_LABEL_NOP)
407                         arch_jump_label_transform_static(iter, JUMP_LABEL_NOP);
408
409                 iterk = jump_entry_key(iter);
410                 if (iterk == key)
411                         continue;
412
413                 key = iterk;
414                 static_key_set_entries(key, iter);
415         }
416         static_key_initialized = true;
417         jump_label_unlock();
418         cpus_read_unlock();
419 }
420
421 /* Disable any jump label entries in __init code */
422 void __init jump_label_invalidate_init(void)
423 {
424         struct jump_entry *iter_start = __start___jump_table;
425         struct jump_entry *iter_stop = __stop___jump_table;
426         struct jump_entry *iter;
427
428         for (iter = iter_start; iter < iter_stop; iter++) {
429                 if (iter->code >= (unsigned long)_sinittext &&
430                     iter->code < (unsigned long)_einittext)
431                         iter->code = 0;
432         }
433 }
434
435 #ifdef CONFIG_MODULES
436
437 static enum jump_label_type jump_label_init_type(struct jump_entry *entry)
438 {
439         struct static_key *key = jump_entry_key(entry);
440         bool type = static_key_type(key);
441         bool branch = jump_entry_branch(entry);
442
443         /* See the comment in linux/jump_label.h */
444         return type ^ branch;
445 }
446
447 struct static_key_mod {
448         struct static_key_mod *next;
449         struct jump_entry *entries;
450         struct module *mod;
451 };
452
453 static inline struct static_key_mod *static_key_mod(struct static_key *key)
454 {
455         WARN_ON_ONCE(!(key->type & JUMP_TYPE_LINKED));
456         return (struct static_key_mod *)(key->type & ~JUMP_TYPE_MASK);
457 }
458
459 /***
460  * key->type and key->next are the same via union.
461  * This sets key->next and preserves the type bits.
462  *
463  * See additional comments above static_key_set_entries().
464  */
465 static void static_key_set_mod(struct static_key *key,
466                                struct static_key_mod *mod)
467 {
468         unsigned long type;
469
470         WARN_ON_ONCE((unsigned long)mod & JUMP_TYPE_MASK);
471         type = key->type & JUMP_TYPE_MASK;
472         key->next = mod;
473         key->type |= type;
474 }
475
476 static int __jump_label_mod_text_reserved(void *start, void *end)
477 {
478         struct module *mod;
479
480         preempt_disable();
481         mod = __module_text_address((unsigned long)start);
482         WARN_ON_ONCE(__module_text_address((unsigned long)end) != mod);
483         preempt_enable();
484
485         if (!mod)
486                 return 0;
487
488
489         return __jump_label_text_reserved(mod->jump_entries,
490                                 mod->jump_entries + mod->num_jump_entries,
491                                 start, end);
492 }
493
494 static void __jump_label_mod_update(struct static_key *key)
495 {
496         struct static_key_mod *mod;
497
498         for (mod = static_key_mod(key); mod; mod = mod->next) {
499                 struct jump_entry *stop;
500                 struct module *m;
501
502                 /*
503                  * NULL if the static_key is defined in a module
504                  * that does not use it
505                  */
506                 if (!mod->entries)
507                         continue;
508
509                 m = mod->mod;
510                 if (!m)
511                         stop = __stop___jump_table;
512                 else
513                         stop = m->jump_entries + m->num_jump_entries;
514                 __jump_label_update(key, mod->entries, stop);
515         }
516 }
517
518 /***
519  * apply_jump_label_nops - patch module jump labels with arch_get_jump_label_nop()
520  * @mod: module to patch
521  *
522  * Allow for run-time selection of the optimal nops. Before the module
523  * loads patch these with arch_get_jump_label_nop(), which is specified by
524  * the arch specific jump label code.
525  */
526 void jump_label_apply_nops(struct module *mod)
527 {
528         struct jump_entry *iter_start = mod->jump_entries;
529         struct jump_entry *iter_stop = iter_start + mod->num_jump_entries;
530         struct jump_entry *iter;
531
532         /* if the module doesn't have jump label entries, just return */
533         if (iter_start == iter_stop)
534                 return;
535
536         for (iter = iter_start; iter < iter_stop; iter++) {
537                 /* Only write NOPs for arch_branch_static(). */
538                 if (jump_label_init_type(iter) == JUMP_LABEL_NOP)
539                         arch_jump_label_transform_static(iter, JUMP_LABEL_NOP);
540         }
541 }
542
543 static int jump_label_add_module(struct module *mod)
544 {
545         struct jump_entry *iter_start = mod->jump_entries;
546         struct jump_entry *iter_stop = iter_start + mod->num_jump_entries;
547         struct jump_entry *iter;
548         struct static_key *key = NULL;
549         struct static_key_mod *jlm, *jlm2;
550
551         /* if the module doesn't have jump label entries, just return */
552         if (iter_start == iter_stop)
553                 return 0;
554
555         jump_label_sort_entries(iter_start, iter_stop);
556
557         for (iter = iter_start; iter < iter_stop; iter++) {
558                 struct static_key *iterk;
559
560                 iterk = jump_entry_key(iter);
561                 if (iterk == key)
562                         continue;
563
564                 key = iterk;
565                 if (within_module(iter->key, mod)) {
566                         static_key_set_entries(key, iter);
567                         continue;
568                 }
569                 jlm = kzalloc(sizeof(struct static_key_mod), GFP_KERNEL);
570                 if (!jlm)
571                         return -ENOMEM;
572                 if (!static_key_linked(key)) {
573                         jlm2 = kzalloc(sizeof(struct static_key_mod),
574                                        GFP_KERNEL);
575                         if (!jlm2) {
576                                 kfree(jlm);
577                                 return -ENOMEM;
578                         }
579                         preempt_disable();
580                         jlm2->mod = __module_address((unsigned long)key);
581                         preempt_enable();
582                         jlm2->entries = static_key_entries(key);
583                         jlm2->next = NULL;
584                         static_key_set_mod(key, jlm2);
585                         static_key_set_linked(key);
586                 }
587                 jlm->mod = mod;
588                 jlm->entries = iter;
589                 jlm->next = static_key_mod(key);
590                 static_key_set_mod(key, jlm);
591                 static_key_set_linked(key);
592
593                 /* Only update if we've changed from our initial state */
594                 if (jump_label_type(iter) != jump_label_init_type(iter))
595                         __jump_label_update(key, iter, iter_stop);
596         }
597
598         return 0;
599 }
600
601 static void jump_label_del_module(struct module *mod)
602 {
603         struct jump_entry *iter_start = mod->jump_entries;
604         struct jump_entry *iter_stop = iter_start + mod->num_jump_entries;
605         struct jump_entry *iter;
606         struct static_key *key = NULL;
607         struct static_key_mod *jlm, **prev;
608
609         for (iter = iter_start; iter < iter_stop; iter++) {
610                 if (jump_entry_key(iter) == key)
611                         continue;
612
613                 key = jump_entry_key(iter);
614
615                 if (within_module(iter->key, mod))
616                         continue;
617
618                 /* No memory during module load */
619                 if (WARN_ON(!static_key_linked(key)))
620                         continue;
621
622                 prev = &key->next;
623                 jlm = static_key_mod(key);
624
625                 while (jlm && jlm->mod != mod) {
626                         prev = &jlm->next;
627                         jlm = jlm->next;
628                 }
629
630                 /* No memory during module load */
631                 if (WARN_ON(!jlm))
632                         continue;
633
634                 if (prev == &key->next)
635                         static_key_set_mod(key, jlm->next);
636                 else
637                         *prev = jlm->next;
638
639                 kfree(jlm);
640
641                 jlm = static_key_mod(key);
642                 /* if only one etry is left, fold it back into the static_key */
643                 if (jlm->next == NULL) {
644                         static_key_set_entries(key, jlm->entries);
645                         static_key_clear_linked(key);
646                         kfree(jlm);
647                 }
648         }
649 }
650
651 /* Disable any jump label entries in module init code */
652 static void jump_label_invalidate_module_init(struct module *mod)
653 {
654         struct jump_entry *iter_start = mod->jump_entries;
655         struct jump_entry *iter_stop = iter_start + mod->num_jump_entries;
656         struct jump_entry *iter;
657
658         for (iter = iter_start; iter < iter_stop; iter++) {
659                 if (within_module_init(iter->code, mod))
660                         iter->code = 0;
661         }
662 }
663
664 static int
665 jump_label_module_notify(struct notifier_block *self, unsigned long val,
666                          void *data)
667 {
668         struct module *mod = data;
669         int ret = 0;
670
671         cpus_read_lock();
672         jump_label_lock();
673
674         switch (val) {
675         case MODULE_STATE_COMING:
676                 ret = jump_label_add_module(mod);
677                 if (ret) {
678                         WARN(1, "Failed to allocatote memory: jump_label may not work properly.\n");
679                         jump_label_del_module(mod);
680                 }
681                 break;
682         case MODULE_STATE_GOING:
683                 jump_label_del_module(mod);
684                 break;
685         case MODULE_STATE_LIVE:
686                 jump_label_invalidate_module_init(mod);
687                 break;
688         }
689
690         jump_label_unlock();
691         cpus_read_unlock();
692
693         return notifier_from_errno(ret);
694 }
695
696 static struct notifier_block jump_label_module_nb = {
697         .notifier_call = jump_label_module_notify,
698         .priority = 1, /* higher than tracepoints */
699 };
700
701 static __init int jump_label_init_module(void)
702 {
703         return register_module_notifier(&jump_label_module_nb);
704 }
705 early_initcall(jump_label_init_module);
706
707 #endif /* CONFIG_MODULES */
708
709 /***
710  * jump_label_text_reserved - check if addr range is reserved
711  * @start: start text addr
712  * @end: end text addr
713  *
714  * checks if the text addr located between @start and @end
715  * overlaps with any of the jump label patch addresses. Code
716  * that wants to modify kernel text should first verify that
717  * it does not overlap with any of the jump label addresses.
718  * Caller must hold jump_label_mutex.
719  *
720  * returns 1 if there is an overlap, 0 otherwise
721  */
722 int jump_label_text_reserved(void *start, void *end)
723 {
724         int ret = __jump_label_text_reserved(__start___jump_table,
725                         __stop___jump_table, start, end);
726
727         if (ret)
728                 return ret;
729
730 #ifdef CONFIG_MODULES
731         ret = __jump_label_mod_text_reserved(start, end);
732 #endif
733         return ret;
734 }
735
736 static void jump_label_update(struct static_key *key)
737 {
738         struct jump_entry *stop = __stop___jump_table;
739         struct jump_entry *entry;
740 #ifdef CONFIG_MODULES
741         struct module *mod;
742
743         if (static_key_linked(key)) {
744                 __jump_label_mod_update(key);
745                 return;
746         }
747
748         preempt_disable();
749         mod = __module_address((unsigned long)key);
750         if (mod)
751                 stop = mod->jump_entries + mod->num_jump_entries;
752         preempt_enable();
753 #endif
754         entry = static_key_entries(key);
755         /* if there are no users, entry can be NULL */
756         if (entry)
757                 __jump_label_update(key, entry, stop);
758 }
759
760 #ifdef CONFIG_STATIC_KEYS_SELFTEST
761 static DEFINE_STATIC_KEY_TRUE(sk_true);
762 static DEFINE_STATIC_KEY_FALSE(sk_false);
763
764 static __init int jump_label_test(void)
765 {
766         int i;
767
768         for (i = 0; i < 2; i++) {
769                 WARN_ON(static_key_enabled(&sk_true.key) != true);
770                 WARN_ON(static_key_enabled(&sk_false.key) != false);
771
772                 WARN_ON(!static_branch_likely(&sk_true));
773                 WARN_ON(!static_branch_unlikely(&sk_true));
774                 WARN_ON(static_branch_likely(&sk_false));
775                 WARN_ON(static_branch_unlikely(&sk_false));
776
777                 static_branch_disable(&sk_true);
778                 static_branch_enable(&sk_false);
779
780                 WARN_ON(static_key_enabled(&sk_true.key) == true);
781                 WARN_ON(static_key_enabled(&sk_false.key) == false);
782
783                 WARN_ON(static_branch_likely(&sk_true));
784                 WARN_ON(static_branch_unlikely(&sk_true));
785                 WARN_ON(!static_branch_likely(&sk_false));
786                 WARN_ON(!static_branch_unlikely(&sk_false));
787
788                 static_branch_enable(&sk_true);
789                 static_branch_disable(&sk_false);
790         }
791
792         return 0;
793 }
794 early_initcall(jump_label_test);
795 #endif /* STATIC_KEYS_SELFTEST */
796
797 #endif /* HAVE_JUMP_LABEL */