diff options
Diffstat (limited to 'kernel/jump_label.c')
| -rw-r--r-- | kernel/jump_label.c | 18 | 
1 files changed, 13 insertions, 5 deletions
diff --git a/kernel/jump_label.c b/kernel/jump_label.c index 74d1c099fbd..fa27e750dbc 100644 --- a/kernel/jump_label.c +++ b/kernel/jump_label.c @@ -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; @@ -371,7 +379,7 @@ static void jump_label_update(struct jump_label_key *key, int enable)  	/* if there are no users, entry can be NULL */  	if (entry) -		__jump_label_update(key, entry, enable); +		__jump_label_update(key, entry, __stop___jump_table, enable);  #ifdef CONFIG_MODULES  	__jump_label_mod_update(key, enable);  |