diff options
Diffstat (limited to 'lib/bug.c')
| -rw-r--r-- | lib/bug.c | 22 | 
1 files changed, 9 insertions, 13 deletions
| diff --git a/lib/bug.c b/lib/bug.c index e0ff21989990..b1f07459c2ee 100644 --- a/lib/bug.c +++ b/lib/bug.c @@ -66,23 +66,19 @@ static LIST_HEAD(module_bug_list);  static struct bug_entry *module_find_bug(unsigned long bugaddr)  { +	struct bug_entry *bug;  	struct module *mod; -	struct bug_entry *bug = NULL; -	rcu_read_lock_sched(); +	guard(rcu)();  	list_for_each_entry_rcu(mod, &module_bug_list, bug_list) {  		unsigned i;  		bug = mod->bug_table;  		for (i = 0; i < mod->num_bugs; ++i, ++bug)  			if (bugaddr == bug_addr(bug)) -				goto out; +				return bug;  	} -	bug = NULL; -out: -	rcu_read_unlock_sched(); - -	return bug; +	return NULL;  }  void module_bug_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, @@ -235,11 +231,11 @@ void generic_bug_clear_once(void)  #ifdef CONFIG_MODULES  	struct module *mod; -	rcu_read_lock_sched(); -	list_for_each_entry_rcu(mod, &module_bug_list, bug_list) -		clear_once_table(mod->bug_table, -				 mod->bug_table + mod->num_bugs); -	rcu_read_unlock_sched(); +	scoped_guard(rcu) { +		list_for_each_entry_rcu(mod, &module_bug_list, bug_list) +			clear_once_table(mod->bug_table, +					 mod->bug_table + mod->num_bugs); +	}  #endif  	clear_once_table(__start___bug_table, __stop___bug_table); | 
