Message ID | 20241008183823.36676-21-samitolvanen@google.com (mailing list archive) |
---|---|
Headers | show |
Series | Implement DWARF modversions | expand |
On Tue, Oct 08, 2024 at 06:38:24PM +0000, Sami Tolvanen wrote: > Hi, > > Here's v4 of the DWARF modversions series. The main motivation is > modversions support for Rust, which is important for distributions > like Android that are about to ship Rust kernel modules. Per Luis' > request [1], v2 dropped the Rust specific bits from the series and > instead added the feature as an option for the entire kernel. I think its important to mention *rationale* why I recommended it, it let's you more broadly test coverage / support with tooling so that its not just Rust modules which tooling will have to support. It gives the option to have *one* unified way to do things. Not "rust is special", oh no, do this instead. This also allows us to empirically evaluate if this new solution also has benefits. If so what should we look out for, metrics, etc. If there are proven benefits, then by all means why not make the the default. > Matt is > addressing Rust modversion_info compatibility issues in a separate > series [2], and we'll follow up with a patch to actually allow > CONFIG_MODVERSIONS with Rust once everything else has been sorted > out. So this depends on that work? What's the ordering of things? That work seems to be aimed at addressing long symbols, and that is also generically useful, and there were odd old hacks for that for LTO. Bring the patch reviewer with you, as they may not have all the background. > Short background: Unlike C, Rust source code doesn't have sufficient > information about the final ABI, as the compiler has considerable > freedom in adjusting structure layout, for example, which makes > using a source code parser like genksyms a non-starter. Based on > earlier feedback, this series uses DWARF debugging information for > computing versions. DWARF is an established and a relatively stable > format, which includes all the necessary ABI details, and adding a > CONFIG_DEBUG_INFO dependency for Rust symbol versioning seems like a > reasonable trade-off. I think its important to state that most distributions enable CONFIG_DEBUG_INFO already, so this means Rust modules won't be asking much more from distributions. > The first patch moves the genksyms CRC32 implementation to a shared > header file and the next 15 patches add gendwarfksyms, a tool for > computing symbol versions from DWARF. In case I find issues with this patch series, let's split up the patches in the next iteration by two sets, one which is the cleanups, moves, and non functional changes, and then a seprate set with the actual changes needed. This let's us carry on faster so I can apply the first set. > When passed a list of exported > symbols and object files, the tool generates an expanded type string > for each symbol and computes symbol CRCs similarly to genksyms. > gendwarfksyms is written in C and uses libdw to process DWARF. OK so a new lib dependency at build time. What if that's not present? > Patch > 17 ensures that debugging information is present where we need it, > patch 18 adds gendwarfksyms as an alternative to genksyms, and the > last patch adds documentation. > > v4 is based on v6.12-rc2 and for your convenience the series is also > available here: > > https://github.com/samitolvanen/linux/commits/gendwarfksyms-v4 Thanks! OK so I'd like to see next test coverage. The below is more modules maintainer homework we have to do, if you're not a modules maintainer or not interested in CI stuff you can stop reading now: We don't have much but for testing of modules, we have lib/test_kmod and tools/testing/selftests/kmod/kmod.sh. kdevops now has 'make kdevops-seltests-kmod', a respective cli defconfig is available to allow github actions to run kdevops on a self-hosted runner too. We already have modules tree integration with kernel-patch-daemon (KPD) [0] [1], there's two parts to this integration to patchwork. The first is the stuff you need to run a github self-hosted runner to test modules with kdevops [2], one can just take that into a random Linux kernel git tree and merge push it into github to trigger your own self hosted runner. That's what KPD does, and in effect its visible [3]. I'm currently working on the security policies on the linux-kdevops org to ensure I can trust the pushes to the linux-modules-kpd tree, but you should be able to now. Once I block random people from sending PR or pushes to the tree we can run CI on that tree by you just having to push. But the current coverage sucks. Luca noted we can run the kmod git tree meson test but the preload stuff needs to be fixed so we can actually run all the test on that tree on a VM [4]. Given all the work you are doing, the next thing is to add tests. We should also add the kmod git tree to kdevops and just run the meson test once we can get the module tests to actually run on the VM. [0] https://github.com/facebookincubator/kernel-patches-daemon [1] https://patchwork.kernel.org/project/linux-modules/list/ [2] https://github.com/linux-kdevops/kdevops-ci-modules [3] https://github.com/linux-kdevops/linux-modules-kpd [4] https://github.com/kmod-project/kmod/blob/master/.github/workflows/main.yml#L92-L98 Luis
Hi Luis, On Fri, Oct 11, 2024 at 4:42 PM Luis Chamberlain <mcgrof@kernel.org> wrote: > > On Tue, Oct 08, 2024 at 06:38:24PM +0000, Sami Tolvanen wrote: > > Hi, > > > > Here's v4 of the DWARF modversions series. The main motivation is > > modversions support for Rust, which is important for distributions > > like Android that are about to ship Rust kernel modules. Per Luis' > > request [1], v2 dropped the Rust specific bits from the series and > > instead added the feature as an option for the entire kernel. > > I think its important to mention *rationale* why I recommended it, it > let's you more broadly test coverage / support with tooling so that its > not just Rust modules which tooling will have to support. It gives the > option to have *one* unified way to do things. Not "rust is special", > oh no, do this instead. This also allows us to empirically evaluate > if this new solution also has benefits. If so what should we look out > for, metrics, etc. If there are proven benefits, then by all means > why not make the the default. Sure, I can expand the cover letter in the next version to include this. I linked to your original request, which gives the reader some more background, but you're right, it doesn't hurt to mention it here as well. > > Matt is > > addressing Rust modversion_info compatibility issues in a separate > > series [2], and we'll follow up with a patch to actually allow > > CONFIG_MODVERSIONS with Rust once everything else has been sorted > > out. > > So this depends on that work? What's the ordering of things? That work > seems to be aimed at addressing long symbols, and that is also > generically useful, and there were odd old hacks for that for LTO. > Bring the patch reviewer with you, as they may not have all the > background. These patch sets are fully independent, but they are both needed before we can support Rust. I'll clarify this too. > > Short background: Unlike C, Rust source code doesn't have sufficient > > information about the final ABI, as the compiler has considerable > > freedom in adjusting structure layout, for example, which makes > > using a source code parser like genksyms a non-starter. Based on > > earlier feedback, this series uses DWARF debugging information for > > computing versions. DWARF is an established and a relatively stable > > format, which includes all the necessary ABI details, and adding a > > CONFIG_DEBUG_INFO dependency for Rust symbol versioning seems like a > > reasonable trade-off. > > I think its important to state that most distributions enable CONFIG_DEBUG_INFO > already, so this means Rust modules won't be asking much more from > distributions. Ack. > > The first patch moves the genksyms CRC32 implementation to a shared > > header file and the next 15 patches add gendwarfksyms, a tool for > > computing symbol versions from DWARF. > > In case I find issues with this patch series, let's split up the patches > in the next iteration by two sets, one which is the cleanups, moves, > and non functional changes, and then a seprate set with the actual > changes needed. This let's us carry on faster so I can apply the first > set. I think the first patch is the only one that matches your description, but it's only needed for the gendwarfksyms tool we're adding, so I'm not sure it makes sense to merge it separately. I did have a couple of other patches in previous versions that would qualify, but they've been merged to -rc2 already. > > When passed a list of exported > > symbols and object files, the tool generates an expanded type string > > for each symbol and computes symbol CRCs similarly to genksyms. > > gendwarfksyms is written in C and uses libdw to process DWARF. > > OK so a new lib dependency at build time. What if that's not present? Then the build fails. We used to check for libelf (part of elfutils like libdw) in Makefile before, but Masahiro explained in commit 0d989ac2c90b ("kbuild: remove libelf checks from top Makefile") why it's not necessary to have separate checks for the library dependencies: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=0d989ac2c90b5f51fe12102d3cddf54b959f2014 > > Patch > > 17 ensures that debugging information is present where we need it, > > patch 18 adds gendwarfksyms as an alternative to genksyms, and the > > last patch adds documentation. > > > > v4 is based on v6.12-rc2 and for your convenience the series is also > > available here: > > > > https://github.com/samitolvanen/linux/commits/gendwarfksyms-v4 > > Thanks! OK so I'd like to see next test coverage. Thanks for the links, I'll take a look and see what tests it makes sense to add. Sami