summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Kicinski <kuba@kernel.org>2026-06-03 14:08:10 -0700
committerJakub Kicinski <kuba@kernel.org>2026-06-04 15:36:12 -0700
commit07c4bca9d92e51ab6b46797a86c6ea559812351a (patch)
treea03aef2d0ef57d9da0263278dd509a2376ecb1b9
parent8d72997dab65b1e9e3220302e26eaecd9b99c02f (diff)
downloadlinux-07c4bca9d92e51ab6b46797a86c6ea559812351a.tar.gz
linux-07c4bca9d92e51ab6b46797a86c6ea559812351a.zip
tools: ynl: try to avoid the very slow YAML loader
Turns out Python YAML defaults to a pure Python loader for YAML files which is a lot slower than the C loader (using libyaml). Try to use the C one whenever possible. The avg time to run: $ tools/net/ynl/pyynl/cli.py --family tc --no-schema drops from 300+ ms to 115 ms with this change (40 samples). We could drop the load time further to 85 ms if we "compiled" the specs to JSON. Slightly tricky parts are that we don't currently install the specs at all on make install, so it's unclear where to put the conversion. Also JSON has questionable support for comments and we need an SPDX line. Reviewed-by: Jacob Keller <jacob.e.keller@intel.com> Reviewed-by: Nicolai Buchwitz <nb@tipi-net.de> Reviewed-by: Donald Hunter <donald.hunter@gmail.com> Link: https://patch.msgid.link/20260603210810.2636193-1-kuba@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-rw-r--r--tools/net/ynl/pyynl/lib/nlspec.py9
1 files changed, 7 insertions, 2 deletions
diff --git a/tools/net/ynl/pyynl/lib/nlspec.py b/tools/net/ynl/pyynl/lib/nlspec.py
index fcffeb5b7ba3..0469a0e270d0 100644
--- a/tools/net/ynl/pyynl/lib/nlspec.py
+++ b/tools/net/ynl/pyynl/lib/nlspec.py
@@ -439,6 +439,11 @@ class SpecFamily(SpecElement):
# To be loaded dynamically as needed
jsonschema = None
+ try:
+ _yaml_loader = pyyaml.CSafeLoader
+ except AttributeError:
+ _yaml_loader = pyyaml.SafeLoader
+
def __init__(self, spec_path, schema_path=None, exclude_ops=None):
with open(spec_path, "r", encoding='utf-8') as stream:
prefix = '# SPDX-License-Identifier: '
@@ -448,7 +453,7 @@ class SpecFamily(SpecElement):
self.license = first[len(prefix):]
stream.seek(0)
- spec = pyyaml.safe_load(stream)
+ spec = pyyaml.load(stream, Loader=self._yaml_loader)
self.fixed_header = None
self._resolution_list = []
@@ -464,7 +469,7 @@ class SpecFamily(SpecElement):
schema_path = os.path.dirname(os.path.dirname(spec_path)) + f'/{self.proto}.yaml'
if schema_path:
with open(schema_path, "r", encoding='utf-8') as stream:
- schema = pyyaml.safe_load(stream)
+ schema = pyyaml.load(stream, Loader=self._yaml_loader)
if SpecFamily.jsonschema is None:
SpecFamily.jsonschema = importlib.import_module("jsonschema")