On Mon, May 29, 2023 at 11:18 AM Johan Hovold wrote: > > I took a closer look at some of the modules that failed to load and > noticed a pattern in that they have dependencies that are needed by more > than one device. Ok, this is a "maybe something like this" RFC series of two patches - one trivial one to re-organize things a bit so that we can then do the real one which uses a filter based on the inode pointer to return an "idempotent return value" for module loads that share the same inode. It's entirely untested, and since I'm on the road I'm going to not really be able to test it. It compiles for me, and the code looks fairly straightforward, but it's probably buggy. It's very loosely based on Luis' attempt, but it (a) is internal to module loading (b) uses a reliable cookie (c) doesn't leave the cookie around randomly for later (d) has seen absolutely no testing Put another way: if somebody wants to play with this, please treat it as a starting point, not the final thing. You might need to debug things, and fix silly mistakes. The idea is to just have a simple hash list of currently executing module loads, protected by a trivial spinlock. Every module loader adds itself to the right hash list, and if they were the *first* one (ie no other pending module loads for that inode), will actually do the module load. Everybody who *isn't* the first one will just wait for completion and return the same error code that the first one returned. This is technically bogus. The first one might fail due to arguments. So the cookie shouldn't be just the inode, it should be the inode and a hash of the arguments or something like that. But it is what it is, and apart from possible show-stopper bugs this is no worse than the failed "exclusive write deny" attempt. IOW - maybe worth trying? And if *that* didn't sell people on this patch series, I don't know what will. I should be in marketing! Two drink minimums, here I come! Linus