This script is slow. Speed it up by using one thread per CPU.

On my desktop with 4 cores (8 threads) and SSD disks, before
this change, it takes:

        $ time scripts/check_docs_external_symbols drivers/media/v4l2-core/
        ...
        real    0m11,044s
        user    0m13,860s
        sys     0m2,048s

After it:

        $ time scripts/check_docs_external_symbols drivers/media/v4l2-core/
        ...
        real    0m3,153s
        user    0m19,322s
        sys     0m2,738s

So, it is now almost 4 times faster.

Signed-off-by: Mauro Carvalho Chehab <[email protected]>
---
 scripts/check_docs_external_symbols | 46 +++++++++++++++++++++++++----
 1 file changed, 41 insertions(+), 5 deletions(-)

diff --git a/scripts/check_docs_external_symbols 
b/scripts/check_docs_external_symbols
index e04af5f03a1d..d312e1973530 100755
--- a/scripts/check_docs_external_symbols
+++ b/scripts/check_docs_external_symbols
@@ -23,6 +23,8 @@ use warnings;
 use strict;
 use File::Find;
 use Cwd 'abs_path';
+use threads;
+use Thread::Queue;
 
 sub check_kerneldoc_symbols($$$$) {
        my $file = shift;
@@ -131,14 +133,15 @@ sub check_kerneldoc_symbols($$$$) {
        return %hash;
 }
 
-sub check_file($) {
+sub do_check_file($) {
        my $file = shift;
        my (@files, @exports, @doc, @doc_refs, %file_exports);
        my $content = "\n";
 
-       $file =~ s/\s+$//;
-
-       return 0 if (!($file =~ /\.[ch]$/));
+       local $SIG{'KILL'} = sub {
+               print "$$ aborted.\n";
+               exit(1);
+       };
 
        my $dir = $file;
        $dir =~ s,[^\/]+$,,;
@@ -262,6 +265,20 @@ sub check_file($) {
        return 1;
 }
 
+my $queue;
+
+sub check_file($) {
+       my $file = shift;
+
+       $file =~ s/\s+$//;
+
+       return if (!($file =~ /\.[ch]$/));
+
+#printf "queuing $file\n";
+
+       $queue->enqueue($file);
+}
+
 sub parse_dir {
        check_file $File::Find::name;
 }
@@ -270,6 +287,20 @@ sub parse_dir {
 # main
 #
 
+my $cpus = qx(nproc);
+
+$queue = Thread::Queue->new();
+
+for (my $i = 0; $i < $cpus; $i++) {
+       threads->create(
+               sub {
+                       while (defined(my $file = $queue->dequeue())) {
+                               do_check_file($file);
+                       }
+               }
+       );
+};
+
 if (@ARGV) {
        while (@ARGV) {
                my $file = shift;
@@ -280,10 +311,15 @@ if (@ARGV) {
                        check_file $file;
                }
        }
-       exit;
 } else {
        my @files = qx(git grep -l EXPORT_SYMBOL);
        foreach my $file (@files) {
                check_file $file;
        }
 }
+
+$queue->end();
+
+foreach my $thr(threads->list()) {
+       $thr->join();
+}
-- 
2.26.2

Reply via email to