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.
Showing the changes to scripts/checkpatch.pl (1 of 1 file). Show all
Unified · Split
| @@ -4014,6 +4014,23 @@ sub process { · 4013 unmodified lines | |||
| 4014 | } | 4014 | } |
| 4015 | } | 4015 | } |
| 4016 | 4016 | ||
| 4017 | # check for unnecessary "Out of Memory" messages | ||
| 4018 | if ($line =~ /^\+.*\b$logFunctions\s*\(/ && | ||
| 4019 | $prevline =~ /^[ \+]\s*if\s*\(\s*(\!\s*|NULL\s*==\s*)?($Lval)(\s*==\s*NULL\s*)?\s*\)/ && | ||
| 4020 | (defined $1 || defined $3) && | ||
| 4021 | $linenr > 3) { | ||
| 4022 | my $testval = $2; | ||
| 4023 | my $testline = $lines[$linenr - 3]; | ||
| 4024 | |||
| 4025 | my ($s, $c) = ctx_statement_block($linenr - 3, $realcnt, 0); | ||
| 4026 | # print("line: <$line>\nprevline: <$prevline>\ns: <$s>\nc: <$c>\n\n\n"); | ||
| 4027 | |||
| 4028 | if ($c =~ /(?:^|\n)[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*(?:devm_)?(?:[kv][czm]alloc(?:_node|_array)?\b|kstrdup|(?:dev_)?alloc_skb)/) { | ||
| 4029 | WARN("OOM_MESSAGE", | ||
| 4030 | "Possible unnecessary 'out of memory' message\n" . $hereprev); | ||
| 4031 | } | ||
| 4032 | } | ||
| 4033 | |||
| 4017 | # check for bad placement of section $InitAttribute (e.g.: __initdata) | 4034 | # check for bad placement of section $InitAttribute (e.g.: __initdata) |
| 4018 | if ($line =~ /(\b$InitAttribute\b)/) { | 4035 | if ($line =~ /(\b$InitAttribute\b)/) { |
| 4019 | my $attr = $1; | 4036 | my $attr = $1; |