On 26/05/2020 17:59, Xiaoguang Wang wrote: > hi, > >> On 26/05/2020 09:43, Xiaoguang Wang wrote: >>> In io_init_req(), if uers requires a new credentials, currently we'll >>> save it in req->work.creds, but indeed io_wq_work is designed to describe >>> needed running environment for requests that will go to io-wq, if one >>> request is going to be submitted inline, we'd better not touch io_wq_work. >>> Here add a new 'const struct cred *creds' in io_kiocb, if uers requires a >>> new credentials, inline requests can use it. >>> >>> This patch is also a preparation for later patch. >> >> What's the difference from keeping only one creds field in io_kiocb (i.e. >> req->work.creds), but handling it specially (i.e. always initialising)? It will >> be a lot easier than tossing it around. >> >> Also, the patch doubles {get,put}_creds() for sqe->personality case, and that's >> extra atomics without a good reason. > You're right, thanks. > The original motivation for this patch is that it's just a preparation later patch > "io_uring: avoid whole io_wq_work copy for inline requests", I can use > io_wq_work.func > to determine whether to drop io_wq_work in io_req_work_drop_env(), so if > io_wq_work.func > is NULL, I don't want io_wq_work has a valid creds. > I'll look into whether we can just assign req->creds's pointer to > io_wq_work.creds to > reduce the atomic operations. See a comment for the [2/3], can spark some ideas. It's a bit messy and makes it more difficult to keep in mind -- all that extra state (i.e. initialised or not) + caring whether func was already set. IMHO, the nop-test do not really justifies extra complexity, unless the whole stuff is pretty and clear. Can you benchmark something more realistic? at least reads/writes to null_blk (completion_nsec=0). -- Pavel Begunkov