x86/jump_label: expect default_nop if static_key gets enabled on boot-up
authorHannes Frederic Sowa <hannes@stressinduktion.org>
Sat, 19 Oct 2013 19:48:54 +0000 (21:48 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sat, 19 Oct 2013 23:45:35 +0000 (19:45 -0400)
net_get_random_once(intrduced in the next patch) uses static_keys in
a way that they get enabled on boot-up instead of replaced with an
ideal_nop. So check for default_nop on initial enabling.

Other architectures don't check for this.

Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jason Baron <jbaron@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Eric Dumazet <edumazet@google.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: x86@kernel.org
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/x86/kernel/jump_label.c

index ee11b7d..26d5a55 100644 (file)
@@ -42,15 +42,27 @@ static void __jump_label_transform(struct jump_entry *entry,
                                   int init)
 {
        union jump_code_union code;
+       const unsigned char default_nop[] = { STATIC_KEY_INIT_NOP };
        const unsigned char *ideal_nop = ideal_nops[NOP_ATOMIC5];
 
        if (type == JUMP_LABEL_ENABLE) {
-               /*
-                * We are enabling this jump label. If it is not a nop
-                * then something must have gone wrong.
-                */
-               if (unlikely(memcmp((void *)entry->code, ideal_nop, 5) != 0))
-                       bug_at((void *)entry->code, __LINE__);
+               if (init) {
+                       /*
+                        * Jump label is enabled for the first time.
+                        * So we expect a default_nop...
+                        */
+                       if (unlikely(memcmp((void *)entry->code, default_nop, 5)
+                                    != 0))
+                               bug_at((void *)entry->code, __LINE__);
+               } else {
+                       /*
+                        * ...otherwise expect an ideal_nop. Otherwise
+                        * something went horribly wrong.
+                        */
+                       if (unlikely(memcmp((void *)entry->code, ideal_nop, 5)
+                                    != 0))
+                               bug_at((void *)entry->code, __LINE__);
+               }
 
                code.jump = 0xe9;
                code.offset = entry->target -
@@ -63,7 +75,6 @@ static void __jump_label_transform(struct jump_entry *entry,
                 * are converting the default nop to the ideal nop.
                 */
                if (init) {
-                       const unsigned char default_nop[] = { STATIC_KEY_INIT_NOP };
                        if (unlikely(memcmp((void *)entry->code, default_nop, 5) != 0))
                                bug_at((void *)entry->code, __LINE__);
                } else {