Avoid matching allocs that appear to be known small multiplications of a sizeof with a constant because gcc as of 4.8 cannot optimize the code in a calloc() exactly the same way as an alloc(). Look for numeric constants or what appear to be upper case only macro #defines.
Showing the changes to scripts/checkpatch.pl (1 of 1 file). Show all
Unified · Split
| @@ -4487,22 +4487,23 @@ sub process { · 4486 unmodified lines | ||
| 4487 | 4487 | |
| 4488 | 4488 | # check for k[mz]alloc with multiplies that could be kmalloc_array/kcalloc |
| 4489 | 4489 | if ($^V && $^V ge 5.10.0 && |
| 4490 | − $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)/) { | |
| 4490 | + $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) { | |
| 4491 | 4491 | my $oldfunc = $3; |
| 4492 | 4492 | my $a1 = $4; |
| 4493 | 4493 | my $a2 = $10; |
| 4494 | 4494 | my $newfunc = "kmalloc_array"; |
| 4495 | 4495 | $newfunc = "kcalloc" if ($oldfunc eq "kzalloc"); |
| 4496 | − if ($a1 =~ /^sizeof\s*\S/ || $a2 =~ /^sizeof\s*\S/) { | |
| 4496 | + my $r1 = $a1; | |
| 4497 | + my $r2 = $a2; | |
| 4498 | + if ($a1 =~ /^sizeof\s*\S/) { | |
| 4499 | + $r1 = $a2; | |
| 4500 | + $r2 = $a1; | |
| 4501 | + } | |
| 4502 | + if ($r1 !~ /^sizeof\b/ && $r2 =~ /^sizeof\s*\S/ && | |
| 4503 | + !($r1 =~ /^$Constant$/ || $r1 =~ /^[A-Z_][A-Z0-9_]*$/)) { | |
| 4497 | 4504 | if (WARN("ALLOC_WITH_MULTIPLY", |
| 4498 | 4505 | "Prefer $newfunc over $oldfunc with multiply\n" . $herecurr) && |
| 4499 | 4506 | $fix) { |
| 4500 | − my $r1 = $a1; | |
| 4501 | − my $r2 = $a2; | |
| 4502 | − if ($a1 =~ /^sizeof\s*\S/) { | |
| 4503 | − $r1 = $a2; | |
| 4504 | − $r2 = $a1; | |
| 4505 | − } | |
| 4506 | 4507 | $fixed[$linenr - 1] =~ s/\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)/$1 . ' = ' . "$newfunc(" . trim($r1) . ', ' . trim($r2)/e; |
| 4507 | 4508 | |
| 4508 | 4509 | } |