So looking at this patch, I really reacted to the fact that quite often the "use outside the loop" case is all kinds of just plain unnecessary, but _used_ to be a convenience feature.
I'll just quote the first chunk in it's entirely as an example - not because I think this chunk is particularly important, but because it's a good example:
On Mon, Feb 28, 2022 at 3:09 AM Jakob Koschel jakobkoschel@gmail.com wrote:
diff --git a/arch/arm/mach-mmp/sram.c b/arch/arm/mach-mmp/sram.c index 6794e2db1ad5..fc47c107059b 100644 --- a/arch/arm/mach-mmp/sram.c +++ b/arch/arm/mach-mmp/sram.c @@ -39,19 +39,22 @@ static LIST_HEAD(sram_bank_list); struct gen_pool *sram_get_gpool(char *pool_name) { struct sram_bank_info *info = NULL;
struct sram_bank_info *tmp; if (!pool_name) return NULL; mutex_lock(&sram_lock);
list_for_each_entry(info, &sram_bank_list, node)
if (!strcmp(pool_name, info->pool_name))
list_for_each_entry(tmp, &sram_bank_list, node)
if (!strcmp(pool_name, tmp->pool_name)) {
info = tmp; break;
} mutex_unlock(&sram_lock);
if (&info->node == &sram_bank_list)
if (!info) return NULL; return info->gpool;
I realize this was probably at least auto-generated with coccinelle, but maybe that script could be taught to do avoid the "use after loop" by simply moving the code _into_ the loop.
IOW, this all would be cleaner and clear written as
if (!pool_name) return NULL;
mutex_lock(&sram_lock); list_for_each_entry(info, &sram_bank_list, node) { if (!strcmp(pool_name, info->pool_name)) { mutex_unlock(&sram_lock); return info; } } mutex_unlock(&sram_lock); return NULL;
Ta-daa - no use outside the loop, no need for new variables, just a simple "just do it inside the loop". Yes, we end up having that lock thing twice, but it looks worth it from a "make the code obvious" standpoint.
Would it be even cleaner if the locking was done in the caller, and the loop was some simple helper function? It probably would. But that would require a bit more smarts than probably a simple coccinelle script would do.
Linus