paulgazz/kmax

Error running kextract: kextract file couldn't be generated

Yujie-Liu opened this issue · 3 comments

$ git clone https://github.com/intel/linux-intel-lts.git --branch 5.15/rpl/dev/linux --single-branch
$ cd linux-intel-lts
$ git checkout a140193717ce0fcf25eaa5a3d1b9ea874b9e5114
$ kismet -a powerpc
INFO: Computing the build system id for the Linux source..
INFO: Build system id: 0d5649df2bde
INFO: Kismet will analyze the select constructs of the architecture "powerpc" for unmet direct dependency.
INFO: All times reported are measured using Python's time.perf_counter() utility.
INFO: Prefetching the architecture kclause formulas.
ERROR:Arch(powerpc): Error running kextract: kextract file couldn't be generated.
Traceback (most recent call last):
  File "/env_kmax/bin/kismet", line 4, in <module>
    __import__('pkg_resources').run_script('kmax==4.5.2', 'kismet')
  File "/env_kmax/lib/python3.11/site-packages/pkg_resources/__init__.py", line 651, in run_script
    self.require(requires)[0].run_script(script_name, ns)
  File "/env_kmax/lib/python3.11/site-packages/pkg_resources/__init__.py", line 1448, in run_script
    exec(code, namespace, namespace)
  File "/env_kmax/lib/python3.11/site-packages/kmax-4.5.2-py3.11-linux-x86_64.egg/EGG-INFO/scripts/kismet", line 1086, in <module>
    main()
  File "/env_kmax/lib/python3.11/site-packages/kmax-4.5.2-py3.11-linux-x86_64.egg/EGG-INFO/scripts/kismet", line 426, in main
    if sample_models: arch.get_kextract() # for sampling
                      ^^^^^^^^^^^^^^^^^^^
  File "/env_kmax/lib/python3.11/site-packages/kmax-4.5.2-py3.11-linux-x86_64.egg/kmax/arch.py", line 582, in get_kextract
    self.__ensure_formulas(self.__kextract, self.__kextract_file_delayed_load, self.load_kextract, self.generate_kextract)
  File "/env_kmax/lib/python3.11/site-packages/kmax-4.5.2-py3.11-linux-x86_64.egg/kmax/arch.py", line 497, in __ensure_formulas
    formula_generation_method()
  File "/env_kmax/lib/python3.11/site-packages/kmax-4.5.2-py3.11-linux-x86_64.egg/kmax/arch.py", line 816, in generate_kextract
    raise Arch.KextractFormulaGenerationError()
kmax.arch.Arch.KextractFormulaGenerationError: kextract formulas couldn't be generated.

Hi @Yujie-Liu, thanks for reporting!

I believe this is not a bug in kismet itself, but an invalid Kconfig file that prevents it from being parsed. It seems that a powerpc Kconfig file at arch/powerpc/platforms/embedded6xx/Kconfig has a recursive dependency, which is prohibited by Kconfig. This prevents even configuring the kernel, e.g.,

git checkout a140193717ce0fcf25eaa5a3d1b9ea874b9e5114
make ARCH=powerpc defconfig

gives the following error:

*** Default configuration is based on 'ppc64_defconfig'
arch/powerpc/platforms/embedded6xx/Kconfig:2:error: recursive dependency detected!
arch/powerpc/platforms/embedded6xx/Kconfig:2:	symbol EMBEDDED6xx depends on BROKEN_ON_SMP
init/Kconfig:122:	symbol BROKEN_ON_SMP depends on BROKEN
init/Kconfig:119:	symbol BROKEN is selected by DRM_I915_DEBUG
drivers/gpu/drm/i915/Kconfig.debug:19:	symbol DRM_I915_DEBUG depends on DRM_I915
drivers/gpu/drm/i915/Kconfig:2:	symbol DRM_I915 depends on DRM
drivers/gpu/drm/Kconfig:8:	symbol DRM depends on AGP
drivers/char/agp/Kconfig:2:	symbol AGP depends on PCI
drivers/pci/Kconfig:16:	symbol PCI depends on HAVE_PCI
drivers/pci/Kconfig:7:	symbol HAVE_PCI is selected by FORCE_PCI
drivers/pci/Kconfig:11:	symbol FORCE_PCI is selected by MVME5100
arch/powerpc/platforms/embedded6xx/Kconfig:51:	symbol MVME5100 depends on EMBEDDED6xx
For a resolution refer to Documentation/kbuild/kconfig-language.rst
subsection "Kconfig recursive dependency limitations"

make[1]: *** [scripts/kconfig/Makefile:87: defconfig] Error 1
make: *** [Makefile:627: defconfig] Error 2

Note the "recursive dependency detected!" at the beginning. In contrast, running make ARCH=x86_64 defconfig seems to work fine.

Interestingly, this commit (a140193717ce0fcf25eaa5a3d1b9ea874b9e5114) reverts a previous commit (cea35f5ad5ffac06ea29e0d7a7f748683e1f1b7d) that fixed the recursive dependency error by removing the "select BROKEN" which caused the error.

There's nothing much kismet can do, since it uses Linux's own Kconfig parser, which won't process Kconfig files with recursive dependencies. Detecting it is pretty straightforward, since Linux's Kconfig tools will detect it whenever creating a configuration file, as in make ARCH=powerpc defconfig above.

Would it helpful for kismet to passthrough the Kconfig error?

@paulgazz Thanks for the detailed analysis!
Sometimes we get this "kextract file couldn't be generated" error in our CI but we are not sure about the root cause. It would be nice and helpful to passthrough the Kconfig error, so that we can detect such error in kismet output and make the kernel test robot skip the problematic commit which has an invalid Kconfig file.

Hi @Yujie-Liu. Got it! I'll improve this error reporting.