On 2/6/19 9:05 PM, Al Viro wrote: > On Wed, Feb 06, 2019 at 10:56:41AM -0700, Jens Axboe wrote: >> On 2/5/19 6:01 PM, Al Viro wrote: >>> On Tue, Feb 05, 2019 at 05:27:29PM -0700, Jens Axboe wrote: >>> >>>> This should be better, passes some basic testing, too: >>>> >>>> http://git.kernel.dk/cgit/linux-block/commit/?h=io_uring&id=01a93aa784319a02ccfa6523371b93401c9e0073 >>>> >>>> Verified that we're grabbing the right refs, and don't hold any >>>> ourselves. For the file registration, forbid registration of the >>>> io_uring fd, as that is pointless and will introduce a loop regardless >>>> of fd passing. >>> >>> *shrug* >>> >>> So pass it to AF_UNIX socket and register _that_ - does't change the >>> underlying problem. >> >> Maybe I'm being dense here, but it's an f_op match. Should catch a >> passed fd as well, correct? > > f_op match on _what_? > >> With that, how can there be a loop? > > io_uring_fd = .... > socketpair(PF_UNIX, SOCK_STREAM, 0, sock_fds); > register sock_fds[0] and sock_fds[1] to io_uring_fd > send SCM_RIGHTS datagram with io_uring_fd to sock_fds[0] > close sock_fds[0], sock_fds[1] and io_uring_fd > > And there's your unreachable loop. I created a small app to do just that, and ran it and verified that ->release() is called and the io_uring is released as expected. This is run on the current -git branch, which has a socket backing for the io_uring fd itself, but not for the registered files. What am I missing here? Attaching the program as a reference. -- Jens Axboe