Merge branch 'drm-nouveau-next' of git://anongit.freedesktop.org/git/nouveau/linux...
[pandora-kernel.git] / kernel / jump_label.c
index 74d1c09..a8ce450 100644 (file)
@@ -105,9 +105,12 @@ static int __jump_label_text_reserved(struct jump_entry *iter_start,
 }
 
 static void __jump_label_update(struct jump_label_key *key,
-               struct jump_entry *entry, int enable)
+                               struct jump_entry *entry,
+                               struct jump_entry *stop, int enable)
 {
-       for (; entry->key == (jump_label_t)(unsigned long)key; entry++) {
+       for (; (entry < stop) &&
+             (entry->key == (jump_label_t)(unsigned long)key);
+             entry++) {
                /*
                 * entry->code set to 0 invalidates module init text sections
                 * kernel_text_address() verifies we are not in core kernel
@@ -181,7 +184,11 @@ static void __jump_label_mod_update(struct jump_label_key *key, int enable)
        struct jump_label_mod *mod = key->next;
 
        while (mod) {
-               __jump_label_update(key, mod->entries, enable);
+               struct module *m = mod->mod;
+
+               __jump_label_update(key, mod->entries,
+                                   m->jump_entries + m->num_jump_entries,
+                                   enable);
                mod = mod->next;
        }
 }
@@ -245,7 +252,8 @@ static int jump_label_add_module(struct module *mod)
                key->next = jlm;
 
                if (jump_label_enabled(key))
-                       __jump_label_update(key, iter, JUMP_LABEL_ENABLE);
+                       __jump_label_update(key, iter, iter_stop,
+                                           JUMP_LABEL_ENABLE);
        }
 
        return 0;
@@ -367,15 +375,19 @@ int jump_label_text_reserved(void *start, void *end)
 
 static void jump_label_update(struct jump_label_key *key, int enable)
 {
-       struct jump_entry *entry = key->entries;
-
-       /* if there are no users, entry can be NULL */
-       if (entry)
-               __jump_label_update(key, entry, enable);
+       struct jump_entry *entry = key->entries, *stop = __stop___jump_table;
 
 #ifdef CONFIG_MODULES
+       struct module *mod = __module_address((jump_label_t)key);
+
        __jump_label_mod_update(key, enable);
+
+       if (mod)
+               stop = mod->jump_entries + mod->num_jump_entries;
 #endif
+       /* if there are no users, entry can be NULL */
+       if (entry)
+               __jump_label_update(key, entry, stop, enable);
 }
 
 #endif