checkpatch: attempt to find unnecessary 'out of memory' messages
Logging messages that show some type of "out of memory" error are
generally unnecessary as there is a generic message and a stack dump
done by the memory subsystem.
These messages generally increase kernel size without much added value.
Emit a warning on these types of messages.
This test looks for any inserted message function, then looks at the
previous line for an "if (!foo)" or "if (foo == NULL)" test and then
looks at the preceding statement for an allocation function like "foo =
kmalloc()"
ie: this code matches:
	foo = kmalloc();
	if (foo == NULL) {
		printk("Out of memory\n");
		return -ENOMEM;
	}
This test is very crude and incomplete.
This test can miss quite a lot of of OOM messages that do not have this
specific form.
ie: this code does not match:
	foo = kmalloc();
	if (!foo) {
		rtn = -ENOMEM;
		printk("Out of memory!\n");
		goto out;
	}
This test could also be a false positive when the logging message itself
does not specify anything about memory, but I did not find any false
positives in my limited testing.
spatch could be a better solution but correctness seems non-trivial for
that tool too.
Signed-off-by: Joe Perches <joe@perches.com>
Acked-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
			
			
This commit is contained in:
		
							parent
							
								
									74e7653190
								
							
						
					
					
						commit
						ebfdc40969
					
				| @ -4014,6 +4014,23 @@ sub process { | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| # check for unnecessary "Out of Memory" messages | ||||
| 		if ($line =~ /^\+.*\b$logFunctions\s*\(/ && | ||||
| 		    $prevline =~ /^[ \+]\s*if\s*\(\s*(\!\s*|NULL\s*==\s*)?($Lval)(\s*==\s*NULL\s*)?\s*\)/ && | ||||
| 		    (defined $1 || defined $3) && | ||||
| 		    $linenr > 3) { | ||||
| 			my $testval = $2; | ||||
| 			my $testline = $lines[$linenr - 3]; | ||||
| 
 | ||||
| 			my ($s, $c) = ctx_statement_block($linenr - 3, $realcnt, 0); | ||||
| #			print("line: <$line>\nprevline: <$prevline>\ns: <$s>\nc: <$c>\n\n\n"); | ||||
| 
 | ||||
| 			if ($c =~ /(?:^|\n)[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*(?:devm_)?(?:[kv][czm]alloc(?:_node|_array)?\b|kstrdup|(?:dev_)?alloc_skb)/) { | ||||
| 				WARN("OOM_MESSAGE", | ||||
| 				     "Possible unnecessary 'out of memory' message\n" . $hereprev); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| # check for bad placement of section $InitAttribute (e.g.: __initdata) | ||||
| 		if ($line =~ /(\b$InitAttribute\b)/) { | ||||
| 			my $attr = $1; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user