Re: [PATCH v3 4/4] io_uring: add support for zone-append
From: Kanchan Joshi <hidden>
Date: 2020-07-09 18:37:31
Also in:
io-uring, linux-fsdevel, lkml
On Thu, Jul 9, 2020 at 7:36 PM Jens Axboe [off-list ref] wrote:
On 7/9/20 8:00 AM, Christoph Hellwig wrote:quoted
On Thu, Jul 09, 2020 at 07:58:04AM -0600, Jens Axboe wrote:quoted
quoted
We don't actually need any new field at all. By the time the write returned ki_pos contains the offset after the write, and the res argument to ->ki_complete contains the amount of bytes written, which allow us to trivially derive the starting position.
Deriving starting position was not the purpose at all. But yes, append-offset is not needed, for a different reason. It was kept for uring specific handling. Completion-result from lower layer was always coming to uring in ret2 via ki_complete(....,ret2). And ret2 goes to CQE (and user-space) without any conversion in between. For polled-completion, there is a short window when we get ret2 but cannot write into CQE immediately, so thought of storing that in append_offset (but should not have done, solving was possible without it). FWIW, if we move to indirect-offset approach, append_offset gets eliminated automatically, because there is no need to write to CQE itself.
quoted
quoted
Then let's just do that instead of jumping through hoops either justifying growing io_rw/io_kiocb or turning kiocb into a global completion thing.Unfortunately that is a totally separate issue - the in-kernel offset can be trivially calculated. But we still need to figure out a way to pass it on to userspace. The current patchset does that by abusing the flags, which doesn't really work as the flags are way too small. So we somewhere need to have an address to do the put_user to.Right, we're just trading the 'append_offset' for a 'copy_offset_here' pointer, which are stored in the same spot...
The address needs to be stored somewhere. And there does not seem other option but to use io_kiocb? The bigger problem with address/indirect-offset is to be able to write to it during completion as process-context is different. Will that require entering into task_work_add() world, and may make it costly affair? Using flags have not been liked here, but given the upheaval involved so far I have begun to feel - it was keeping things simple. Should it be reconsidered? -- Joshi