On 3/23/20 5:50 AM, Xiaoguang Wang wrote: > While diving into iouring fileset resigster/unregister/update codes, > we found one bug in fileset update codes. Iouring fileset update codes > use a percpu_ref variable to check whether can put previous registered > file, only when the refcnt of the perfcpu_ref variable reachs zero, can > we safely put these files, but this do not work well. If applications > always issue requests continually, this perfcpu_ref will never have an > chance to reach zero, and it'll always be in atomic mode, also will > defeat the gains introduced by fileset register/unresiger/update feature, > which are used to reduce the atomic operation overhead of fput/fget. > > To fix this issue, we remove the percpu_ref related codes, and add two new > counter: sq_seq and cq_seq to struct io_ring_ctx: > sq_seq: the most recent issued requset sequence number, which is > protected uring_lock. > cq_seq: the most recent completed request sequence number, which is > protected completion_lock. > > When we update fileset(under uring_lock), we record the current sq_seq, > and when cq_seq is greater or equal to recorded sq_seq, we know we can > put previous registered file safely. Maybe I'm misunderstanding the idea here, but what if you have the following: - sq_seq 200, cq_seq 100 We have 100 inflight, and an unregister request comes in. I then issue 100 nops, which complete. cq_seq is now 200, but none of the original requests that used the file have completed. What am I missing? -- Jens Axboe