| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- Why we want a copy of kernel headers in tools?
- ==============================================
- There used to be no copies, with tools/ code using kernel headers
- directly. From time to time tools/perf/ broke due to legitimate kernel
- hacking. At some point Linus complained about such direct usage. Then we
- adopted the current model.
- The way these headers are used in perf are not restricted to just
- including them to compile something.
- There are sometimes used in scripts that convert defines into string
- tables, etc, so some change may break one of these scripts, or new MSRs
- may use some different #define pattern, etc.
- E.g.:
- $ ls -1 tools/perf/trace/beauty/*.sh | head -5
- tools/perf/trace/beauty/arch_errno_names.sh
- tools/perf/trace/beauty/drm_ioctl.sh
- tools/perf/trace/beauty/fadvise.sh
- tools/perf/trace/beauty/fsconfig.sh
- tools/perf/trace/beauty/fsmount.sh
- $
- $ tools/perf/trace/beauty/fadvise.sh
- static const char *fadvise_advices[] = {
- [0] = "NORMAL",
- [1] = "RANDOM",
- [2] = "SEQUENTIAL",
- [3] = "WILLNEED",
- [4] = "DONTNEED",
- [5] = "NOREUSE",
- };
- $
- The tools/perf/check-headers.sh script, part of the tools/ build
- process, points out changes in the original files.
- So its important not to touch the copies in tools/ when doing changes in
- the original kernel headers, that will be done later, when
- check-headers.sh inform about the change to the perf tools hackers.
- Another explanation from Ingo Molnar:
- It's better than all the alternatives we tried so far:
- - Symbolic links and direct #includes: this was the original approach but
- was pushed back on from the kernel side, when tooling modified the
- headers and broke them accidentally for kernel builds.
- - Duplicate self-defined ABI headers like glibc: double the maintenance
- burden, double the chance for mistakes, plus there's no tech-driven
- notification mechanism to look at new kernel side changes.
- What we are doing now is a third option:
- - A software-enforced copy-on-write mechanism of kernel headers to
- tooling, driven by non-fatal warnings on the tooling side build when
- kernel headers get modified:
- Warning: Kernel ABI header differences:
- diff -u tools/include/uapi/drm/i915_drm.h include/uapi/drm/i915_drm.h
- diff -u tools/include/uapi/linux/fs.h include/uapi/linux/fs.h
- diff -u tools/include/uapi/linux/kvm.h include/uapi/linux/kvm.h
- ...
- The tooling policy is to always pick up the kernel side headers as-is,
- and integate them into the tooling build. The warnings above serve as a
- notification to tooling maintainers that there's changes on the kernel
- side.
- We've been using this for many years now, and it might seem hacky, but
- works surprisingly well.
|