Messages in this thread Patch in this message | | | Subject | [RFC PATCH] checkpatch: Attempt to find unnecessary 'out of memory' messages | From | Joe Perches <> | Date | Tue, 10 Jun 2014 09:55:40 -0700 |
| |
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> --- scripts/checkpatch.pl | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 010b18e..64bee42 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -4009,6 +4009,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;
| |