[PATCH] scripts: check_docs_external_symbols: speed up its execution

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 <mchehab+huawei@xxxxxxxxxx>
---
 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




[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux