On 2/7/19 9:30 AM, Al Viro wrote: > On Thu, Feb 07, 2019 at 09:14:41AM -0700, Jens Axboe wrote: > >> 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. > >> int main(int argc, char *argv[]) >> { >> int sp[2], pid, ring_fd, ret; >> >> if (socketpair(AF_UNIX, SOCK_DGRAM, 0, sp) != 0) { >> perror("Failed to create Unix-domain socket pair\n"); >> return 1; >> } >> >> ring_fd = get_ring_fd(); >> if (ring_fd < 0) >> return 1; >> >> ret = io_uring_register_files(ring_fd, sp[0], sp[1]); >> if (ret < 0) { >> perror("register files"); >> return 1; >> } >> >> pid = fork(); >> if (pid) { >> printf("Sending fd %d\n", ring_fd); >> >> send_fd(sp[0], ring_fd); >> } else { >> int fd; >> >> fd = recv_fd(sp[1]); > > Well, yes - once you receive it, you obviously have no references > sitting in SCM_RIGHTS anymore. > > Get rid of recv_fd() there (along with fork(), while we are at it - what's > it for?) and just do send_fd + these 3 close (or just exit, for that matter). Ah got it, yes you are right, that does leak. Thanks for the other (very) detailed note, I'll add a socket backing for the registered files. I'll respond to the other details in there a bit later. -- Jens Axboe