Skip to contentSkip to conversation

libpcre2 breaks COMPILED_SOURCE=1 tags

PATCH Superseded Carlos Llamas 3 participants 8 messages Feb 13, 2023 – Mar 7, 2023 Stable branch

lore
Share & tools
lore
#0 lore raw

Newer versions of libpre2 have dropped default support for \K in lookarounds. Unfortunately, scripts/tags.sh relies on this option to collect all the _compiled_ sources. This is the error:

  $ make COMPILED_SOURCE=1 tags
    GEN     tags
  grep: \K is not allowed in lookarounds (but see PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK)

It seems there isn't an official maintainer for this script and I can't quite understand the regex used for the query. Does anyone have a good alternative for this? The regex pattern was introduced in commit 4f491bb6ea2a ("scripts/tags.sh: collect compiled source precisely").

The previous form of all_compiled_sources() seems to work for me and I'm guessing it wasn't efficient enough? I can't find much info about the switch to find/grep either. I believe the initial thread is this:
https://lore.kernel.org/all/[email protected]/

--
Carlos Llamas

#1 lore raw
Quoted 13 lines · Carlos Llamas

Newer versions of libpre2 have dropped default support for \K in lookarounds. Unfortunately, scripts/tags.sh relies on this option to collect all the _compiled_ sources. This is the error:

  $ make COMPILED_SOURCE=1 tags
    GEN     tags
  grep: \K is not allowed in lookarounds (but see PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK)

It seems there isn't an official maintainer for this script and I can't quite understand the regex used for the query. Does anyone have a good alternative for this? The regex pattern was introduced in commit 4f491bb6ea2a ("scripts/tags.sh: collect compiled source precisely").

Quoted 4 lines

The previous form of all_compiled_sources() seems to work for me and I'm guessing it wasn't efficient enough? I can't find much info about the switch to find/grep either. I believe the initial thread is this:
https://lore.kernel.org/all/[email protected]/

Can you send a patch to revert the offending change? That would be the simplest for now, right?

thanks,

greg k-h

#2 lore raw

PATCH 1/1 scripts/tags.sh: fix incompatibility with PCRE2

Starting with release 10.38 PCRE2 drops default support for using \K in lookaround patterns as described in [1]. Unfortunately, scripts/tags.sh relies on such functionality to collect all_compiled_soures() leading to the following error:

  $ make COMPILED_SOURCE=1 tags
    GEN     tags
  grep: \K is not allowed in lookarounds (but see PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK)

The usage of \K for this pattern was introduced in commit 4f491bb6ea2a ("scripts/tags.sh: collect compiled source precisely") which speeds up the generation of tags significantly.

In order to fix this issue without compromising the performance we can switch over to an equivalent sed expression. The same matching pattern is preserved here except \K is replaced with a backreference \1.

[1] https://www.pcre.org/current/doc/html/pcre2syntax.html#SEC11

Cc Greg Kroah-Hartman <[email protected]>
Cc Cristian Ciocaltea <[email protected]>
Cc Masahiro Yamada <[email protected]>
Cc Jialu Xu <[email protected]>
Cc Vipin Sharma <[email protected]>
---
 scripts/tags.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/tags.sh +1 -1
index e137cf15aae9..0d045182c08c 100755
@@ -91,7 +91,7 @@ all_compiled_sources()
 	{
 		echo include/generated/autoconf.h
 		find $ignore -name "*.cmd" -exec \
-			grep -Poh '(?(?=^source_.* \K).*|(?=^  \K\S).*(?= \\))' {} \+ |
+			sed -n -E 's/^source_.* (.*)/\1/p; s/^  (\S.*) \\/\1/p' {} \+ |
 		awk '!a[$0]++'
 	} | xargs realpath -esq $([ -z "$KBUILD_ABS_SRCTREE" ] && echo --relative-to=.) |
 	sort -u
Signature · 1 line
2.39.1.581.gbfd45094c4-goog
#3 lore raw

Re: [PATCH] scripts/tags.sh: fix incompatibility with PCRE2

Quoted 25 lines · Carlos Llamas

Starting with release 10.38 PCRE2 drops default support for using \K in lookaround patterns as described in [1]. Unfortunately, scripts/tags.sh relies on such functionality to collect all_compiled_soures() leading to the following error:

  $ make COMPILED_SOURCE=1 tags
    GEN     tags
  grep: \K is not allowed in lookarounds (but see PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK)

The usage of \K for this pattern was introduced in commit 4f491bb6ea2a ("scripts/tags.sh: collect compiled source precisely") which speeds up the generation of tags significantly.

In order to fix this issue without compromising the performance we can switch over to an equivalent sed expression. The same matching pattern is preserved here except \K is replaced with a backreference \1.

[1] https://www.pcre.org/current/doc/html/pcre2syntax.html#SEC11

Cc Greg Kroah-Hartman <[email protected]>
Cc Cristian Ciocaltea <[email protected]>
Cc Masahiro Yamada <[email protected]>
Cc Jialu Xu <[email protected]>
Cc Vipin Sharma <[email protected]>
Quoted 3 lines
---
 scripts/tags.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Shouldn't this get a "Fixes:" tag with the commit that caused the problem? And if this affects older kernels (as it does), it should also get a cc: stable?

thanks,

greg k-h

#4 lore raw

Re: [PATCH] scripts/tags.sh: fix incompatibility with PCRE2

Quoted 4 lines · Greg Kroah-Hartman

Shouldn't this get a "Fixes:" tag with the commit that caused the problem? And if this affects older kernels (as it does), it should also get a cc: stable?

I was hesitant to mark 4f491bb6ea2a as the offending commit as it was PERL5 and PCRE2 that decided to drop this functionality. The commit was technically correct before this. However, you are right that this impacts stable too and if it makes the backport process easier I'll add the "Fixes:" tag and cc: stable as suggested.

--
Carlos Llamas

#5 lore raw

PATCH v2 1/1 scripts/tags.sh: fix incompatibility with PCRE2

Starting with release 10.38 PCRE2 drops default support for using \K in lookaround patterns as described in [1]. Unfortunately, scripts/tags.sh relies on such functionality to collect all_compiled_soures() leading to the following error:

  $ make COMPILED_SOURCE=1 tags
    GEN     tags
  grep: \K is not allowed in lookarounds (but see PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK)

The usage of \K for this pattern was introduced in commit 4f491bb6ea2a ("scripts/tags.sh: collect compiled source precisely") which speeds up the generation of tags significantly.

In order to fix this issue without compromising the performance we can switch over to an equivalent sed expression. The same matching pattern is preserved here except \K is replaced with a backreference \1.

[1] https://www.pcre.org/current/doc/html/pcre2syntax.html#SEC11

Cc Greg Kroah-Hartman <[email protected]>
Cc Cristian Ciocaltea <[email protected]>
Cc Masahiro Yamada <[email protected]>
Cc Jialu Xu <[email protected]>
Cc Vipin Sharma <[email protected]>
Fixes 4f491bb6ea2a ("scripts/tags.sh: collect compiled source precisely")

---
v2: add Fixes tag and cc stable

 scripts/tags.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/tags.sh +1 -1
index e137cf15aae9..0d045182c08c 100755
@@ -91,7 +91,7 @@ all_compiled_sources()
 	{
 		echo include/generated/autoconf.h
 		find $ignore -name "*.cmd" -exec \
-			grep -Poh '(?(?=^source_.* \K).*|(?=^  \K\S).*(?= \\))' {} \+ |
+			sed -n -E 's/^source_.* (.*)/\1/p; s/^  (\S.*) \\/\1/p' {} \+ |
 		awk '!a[$0]++'
 	} | xargs realpath -esq $([ -z "$KBUILD_ABS_SRCTREE" ] && echo --relative-to=.) |
 	sort -u
Signature · 1 line
2.39.1.637.g21b0678d19-goog
#6 lore raw

re: [PATCH v2] scripts/tags.sh: fix incompatibility with PCRE2

Quoted 9 lines

Starting with release 10.38 PCRE2 drops default support for using \K in lookaround patterns as described in [1]. Unfortunately, scripts/tags.sh relies on such functionality to collect all_compiled_soures() leading to the following error:

  $ make COMPILED_SOURCE=1 tags
    GEN     tags
  grep: \K is not allowed in lookarounds (but see PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK)
Quoted 7 lines

The usage of \K for this pattern was introduced in commit 4f491bb6ea2a ("scripts/tags.sh: collect compiled source precisely") which speeds up the generation of tags significantly.

In order to fix this issue without compromising the performance we can switch over to an equivalent sed expression. The same matching pattern is preserved here except \K is replaced with a backreference \1.

Just got a working grep without \K, seems that it is three times more efficient than sed in my test, is it necessary to update?

	grep -Poh '(?<=^  )\S+|(?<== )\S+[^\\](?=$)' {} \+ |

--
Jialu

#7 lore raw

Re: [PATCH v2] scripts/tags.sh: fix incompatibility with PCRE2

Quoted 9 lines · Jialu Xu

Just got a working grep without \K, seems that it is three times more efficient than sed in my test, is it necessary to update?

	grep -Poh '(?<=^  )\S+|(?<== )\S+[^\\](?=$)' {} \+ |

--
Jialu

I just tried this and it does have better performance. Even better than your previous grep expression it seems, so I would definitely send a patch.

--
Carlos Llamas