checkpatch: improve octal permissions test speed

The current octal permissions test is very slow.

When patch ("checkpatch: add checks for constant non-octal permissions")
was added, processing time approximately tripled.

Regain almost all of the performance by not looping through all the
possible functions unless the line contains one of the functions.

Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Joe Perches 2014-04-03 14:49:24 -07:00 committed by Linus Torvalds
parent daa8b0592e
commit 515a235ef9
1 changed files with 29 additions and 18 deletions

View File

@ -388,6 +388,13 @@ our @mode_permission_funcs = (
["(?:CLASS|DEVICE|SENSOR)_ATTR", 2], ["(?:CLASS|DEVICE|SENSOR)_ATTR", 2],
); );
#Create a search pattern for all these functions to speed up a loop below
our $mode_perms_search = "";
foreach my $entry (@mode_permission_funcs) {
$mode_perms_search .= '|' if ($mode_perms_search ne "");
$mode_perms_search .= $entry->[0];
}
our $allowed_asm_includes = qr{(?x: our $allowed_asm_includes = qr{(?x:
irq| irq|
memory memory
@ -4524,6 +4531,10 @@ sub process {
"Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr); "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
} }
# Mode permission misuses where it seems decimal should be octal
# This uses a shortcut match to avoid unnecessary uses of a slow foreach loop
if ($^V && $^V ge 5.10.0 &&
$line =~ /$mode_perms_search/) {
foreach my $entry (@mode_permission_funcs) { foreach my $entry (@mode_permission_funcs) {
my $func = $entry->[0]; my $func = $entry->[0];
my $arg_pos = $entry->[1]; my $arg_pos = $entry->[1];
@ -4534,8 +4545,7 @@ sub process {
$skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}"; $skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}";
} }
my $test = "\\b$func\\s*\\(${skip_args}([\\d]+)\\s*[,\\)]"; my $test = "\\b$func\\s*\\(${skip_args}([\\d]+)\\s*[,\\)]";
if ($^V && $^V ge 5.10.0 && if ($line =~ /$test/) {
$line =~ /$test/) {
my $val = $1; my $val = $1;
$val = $6 if ($skip_args ne ""); $val = $6 if ($skip_args ne "");
@ -4548,6 +4558,7 @@ sub process {
} }
} }
} }
}
# If we have no input at all, then there is nothing to report on # If we have no input at all, then there is nothing to report on
# so just keep quiet. # so just keep quiet.