On Tue, May 30, 2023 at 3:41 PM Luis Chamberlain <mcgrof@xxxxxxxxxx> wrote:
OK thanks! So just to confirm, it seems fine to return the same error
code if duplicates wait, or do you prefer for some reason for there to
be an exception and return -EEXIST if the module did succeed in the
duplicate case?
I think either should be fine, since either was possible before.
By definition, these are module loads being done in parallel, and so
any of them "could" have been the first, and returned success before.
And by extension, any of them could have been not first, and returned
-EEXIST if somebody else loaded the same module first.
So that "somebody else did a load" code:
if (idempotent(&idem, file_inode(f))) {
wait_for_completion(&idem.complete);
return idem.ret;
}
could certainly have made the return value be something like
return idem.ret ? : -EEXIST;
instead of that "return idem.ret".
But it does seem simpler - and more in line with the conceptual
"loading the same module is an idempotent operation" of the patch -
to just always return the success value to all of them.
After all, they all did in some sense succeed to get that module
loaded, even if it was a communal effort, and some threads did more
than others...
As mentioned, I don't think it can matter either way, since any of the
callers might as well have been the successful one, and they would
basically have to act the same way regardless (ie "somebody else
succeeded" and "you succeeded" are basically equivalent return
values). If the module was a prerequisite for another module being
loaded, either -EEXIST or 0 _is_ a success case.
Linus