Received: by 2002:a05:6a10:eb17:0:0:0:0 with SMTP id hx23csp590209pxb; Wed, 8 Sep 2021 08:01:33 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzzMf3fFgXGmmEmtJUMQIdLCjelBmB6uQE5xDCIvGpzVuq29jlEKGEPzAura2k4zLBwTzGo X-Received: by 2002:a05:651c:503:: with SMTP id o3mr3211192ljp.528.1631113293671; Wed, 08 Sep 2021 08:01:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1631113293; cv=none; d=google.com; s=arc-20160816; b=pt6rQDYahvKM9DbssKc4lRv72aBK8rMdnqzSsLWGe0fSUIgbPZUNeSiqyMqgFuteit RTxRdqf/QZH/N6eQaiyyJGHB5cik3k2dDw/M6ylqF6Ba+NaczLGPECxpr1CUxlsx+c3D 3CORCJUuDF4oaLQJanZGf7OoI3PtjJobWF5cZ9Kh0SlygSwTodqmDQTuNEMaJgV5EKIq VS8ax7Qz6ouwZOpJdRAbaD4V/89LuWZpXeykldSWg4bG2xQStlvznhGQ3asSvlbKHkuX E8aI+ynBldkdVDBo7BCgAZ9wlU8RArIRUvt9qDYq/IUPC0e3zXPUDZCCdY1Zhd2OH1Ts 87gw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=7+sFRgTnM7HqBVTBOBINfiVfPlyqBDM3wCe1S/IZLTc=; b=rAfR2hndtyPubPMe+y1I9EXqeDE690kX+iawUiHFDB/1vsFI2rfNYAL04EsTP0M7Rs pIv47Af8ID+HnsaWHFsyjtXu6rwRsPXQmJdjZRibdV1nb2GI+ItSMgXGURYHkIFTZC53 +tVQOYz7lIslJXJ4ntcJk+kxAzGqBdO2WW38CRko9INpZrHCEFsvlmbDWKyTTbKQaWNf b/+EAbmS6vCRShpnpGtf/b2OLDvr1J7hJ5Lcy/JrAlufnP48XrPF1tecTDDRBGYW73PA zN/qjENZ/03hk/WfrbzBOEmAG2xlCDM71H8voqD1v9PIxh+mFnnb1X83l46eztpjyGXm hGQQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=pB+GGKzS; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id qf34si2814840ejc.197.2021.09.08.08.01.08; Wed, 08 Sep 2021 08:01:33 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=pB+GGKzS; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1351980AbhIHPAO (ORCPT + 99 others); Wed, 8 Sep 2021 11:00:14 -0400 Received: from mail.kernel.org ([198.145.29.99]:59122 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1349478AbhIHPAK (ORCPT ); Wed, 8 Sep 2021 11:00:10 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 8586B61164; Wed, 8 Sep 2021 14:59:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1631113142; bh=+mlARGw01rxTwhUrmA0/0OaEj1ejKNUY2erm21yfPQc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pB+GGKzS6cAo9nyLsR9y3tbPy8t+H/vKk+WtoUj8t+Q+pPHi3/V3tu/bZ9IhwC3BJ Liwf/jQmWHB8jk5BnR8rfCW3ypijxbsQfu7c3M2+rONUDTsYYpVo1buRCkqF0mk0Gl yOiW9I1QEXYUf/84/JaXJeCfyOD6HwovuMjkA4Ad8wWefL2I9jKcQoIVWduARUtxYu 3OUUCRTYPJ44+qfLFdAhxoKMqPBlUdJkSBRlcLh8dQfyDlGmVHRwbzMaGOOBx9dq8y liytvfAZ3UmgTuazpQW//+8PaDRebzXVvr+pGG9L4GilA/nBXhvYRRXRflOjzGbwGO cl3GEoIXzvREw== Received: by mail.kernel.org with local (Exim 4.94.2) (envelope-from ) id 1mNz2S-006r3h-Jk; Wed, 08 Sep 2021 16:59:00 +0200 From: Mauro Carvalho Chehab To: Linux Doc Mailing List , Greg KH Cc: Mauro Carvalho Chehab , "Jonathan Corbet" , linux-kernel@vger.kernel.org Subject: [PATCH 2/9] scripts: get_abi.pl: detect softlinks Date: Wed, 8 Sep 2021 16:58:49 +0200 Message-Id: X-Mailer: git-send-email 2.31.1 In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: Mauro Carvalho Chehab Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The way sysfs works is that the same leave may be present under /sys/devices, /sys/bus and /sys/class, etc, linked via soft symlinks. To make it harder to parse, the ABI definition usually refers only to one of those locations. So, improve the logic in order to retrieve the symlinks. Signed-off-by: Mauro Carvalho Chehab --- scripts/get_abi.pl | 177 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 143 insertions(+), 34 deletions(-) diff --git a/scripts/get_abi.pl b/scripts/get_abi.pl index 31b2fdf1f318..7600e50b53bb 100755 --- a/scripts/get_abi.pl +++ b/scripts/get_abi.pl @@ -8,8 +8,10 @@ use Pod::Usage; use Getopt::Long; use File::Find; use Fcntl ':mode'; +use Cwd 'abs_path'; my $help = 0; +my $hint = 0; my $man = 0; my $debug = 0; my $enable_lineno = 0; @@ -28,6 +30,7 @@ GetOptions( "rst-source!" => \$description_is_rst, "dir=s" => \$prefix, 'help|?' => \$help, + "show-hints" => \$hint, man => \$man ) or pod2usage(2); @@ -526,7 +529,7 @@ sub search_symbols { } # Exclude /sys/kernel/debug and /sys/kernel/tracing from the search path -sub skip_debugfs { +sub dont_parse_special_attributes { if (($File::Find::dir =~ m,^/sys/kernel,)) { return grep {!/(debug|tracing)/ } @_; } @@ -539,62 +542,162 @@ sub skip_debugfs { } my %leaf; +my %aliases; +my @files; my $escape_symbols = qr { ([\x01-\x08\x0e-\x1f\x21-\x29\x2b-\x2d\x3a-\x40\x7b-\xff]) }x; sub parse_existing_sysfs { my $file = $File::Find::name; + my $mode = (lstat($file))[2]; + my $abs_file = abs_path($file); - my $mode = (stat($file))[2]; - return if ($mode & S_IFDIR); + if (S_ISLNK($mode)) { + $aliases{$file} = $abs_file; + return; + } - my $leave = $file; - $leave =~ s,.*/,,; + return if (S_ISDIR($mode)); - if (defined($leaf{$leave})) { - # FIXME: need to check if the path makes sense - my $what = $leaf{$leave}; + # Trivial: file is defined exactly the same way at ABI What: + return if (defined($data{$file})); + return if (defined($data{$abs_file})); + + push @files, $abs_file; +} + +sub check_undefined_symbols { + foreach my $file (sort @files) { + + # sysfs-module is special, as its definitions are inside + # a text. For now, just ignore them. + next if ($file =~ m#^/sys/module/#); + + # Ignore cgroup and firmware + next if ($file =~ m#^/sys/(fs/cgroup|firmware)/#); + + my $defined = 0; + my $exact = 0; + my $whats = ""; + + my $leave = $file; + $leave =~ s,.*/,,; + + my $path = $file; + $path =~ s,(.*/).*,$1,; + + if (defined($leaf{$leave})) { + my $what = $leaf{$leave}; + $whats .= " $what" if (!($whats =~ m/$what/)); + + foreach my $w (split / /, $what) { + if ($file =~ m#^$w$#) { + $exact = 1; + last; + } + } + # Check for aliases + # + # TODO: this algorithm is O(w * n²). It can be + # improved in the future in order to handle it + # faster, by changing parse_existing_sysfs to + # store the sysfs inside a tree, at the expense + # on making the code less readable and/or using some + # additional perl library. + foreach my $a (keys %aliases) { + my $new = $aliases{$a}; + my $len = length($new); + + if (substr($file, 0, $len) eq $new) { + my $newf = $a . substr($file, $len); + + foreach my $w (split / /, $what) { + if ($newf =~ m#^$w$#) { + $exact = 1; + last; + } + } + } + } + + $defined++; + } + next if ($exact); + + # Ignore some sysfs nodes + next if ($file =~ m#/(sections|notes)/#); + + # Would need to check at + # Documentation/admin-guide/kernel-parameters.txt, but this + # is not easily parseable. + next if ($file =~ m#/parameters/#); + + if ($hint && $defined) { + print "$leave at $path might be one of:$whats\n"; + next; + } + print "$file not found.\n"; + } +} + +sub undefined_symbols { + find({ + wanted =>\&parse_existing_sysfs, + preprocess =>\&dont_parse_special_attributes, + no_chdir => 1 + }, $sysfs_prefix); + + foreach my $what (sort keys %data) { + next if (!($what =~ m/^$sysfs_prefix/)); + + # Convert what into regular expressions $what =~ s/,/ /g; + $what =~ s,/\.\.\./,/.*/,g; + + # Temporarely change [0-9] type of patterns + $what =~ s/\[(\d+)\-(\d+)\]/\xf4$1-$2\xf5/g; + + # Handle multiple option patterns + $what =~ s/[\{\<\[]([\w_]+)(?:[,|\s]+([\w_]+)){1,}[\}\>\]]/($1|$2)/g; + + # Handle wildcards $what =~ s/\<[^\>]+\>/.*/g; $what =~ s/\{[^\}]+\}/.*/g; $what =~ s/\[[^\]]+\]/.*/g; - $what =~ s,/\.\.\./,/.*/,g; + + $what =~ s/[XYZ]/.*/g; $what =~ s,/\*/,/.*/,g; + # Recover [0-9] type of patterns + $what =~ s/\xf4/[/g; + $what =~ s/\xf5/]/g; + + # Remove duplicated spaces $what =~ s/\s+/ /g; + my $leave = $what; + $leave =~ s,.*/,,; + + next if ($leave =~ m/^\.\*/ || $leave eq ""); + # Escape all other symbols $what =~ s/$escape_symbols/\\$1/g; + $what =~ s/\\([\[\]\(\)\|])/$1/g; + $what =~ s/(\d+)\\(-\d+)/$1$2/g; - foreach my $i (split / /,$what) { - if ($file =~ m#^$i$#) { -# print "$file: $i: OK!\n"; - return; + $leave =~ s/[\(\)]//g; + + foreach my $l (split /\|/, $leave) { + if (defined($leaf{$l})) { + $leaf{$l} .= " " . $what; + } else { + $leaf{$l} = $what; } } - - print "$file: $leave is defined at $what\n"; - - return; - } - - print "$file not found.\n"; -} - -sub undefined_symbols { - foreach my $what (sort keys %data) { - my $leave = $what; - $leave =~ s,.*/,,; - - if (defined($leaf{$leave})) { - $leaf{$leave} .= " " . $what; - } else { - $leaf{$leave} = $what; - } } - find({wanted =>\&parse_existing_sysfs, preprocess =>\&skip_debugfs, no_chdir => 1}, $sysfs_prefix); + check_undefined_symbols; } # Ensure that the prefix will always end with a slash @@ -644,7 +747,8 @@ abi_book.pl - parse the Linux ABI files and produce a ReST book. =head1 SYNOPSIS B [--debug] [--enable-lineno] [--man] [--help] - [--(no-)rst-source] [--dir=] [] + [--(no-)rst-source] [--dir=] [--show-hints] + [] Where can be: @@ -686,6 +790,11 @@ Enable output of #define LINENO lines. Put the script in verbose mode, useful for debugging. Can be called multiple times, to increase verbosity. +=item B<--show-hints> + +Show hints about possible definitions for the missing ABI symbols. +Used only when B. + =item B<--help> Prints a brief help message and exits. -- 2.31.1