On 9/1/24 7:37 AM, Bernd Schubert wrote: > This is to allow copying into the buffer from the application > without the need to copy in ring context (and with that, > the need that the ring task is active in kernel space). > > Also absolutely needed for now to avoid this teardown issue I'm fine using these helpers, but they are absolutely not needed to avoid that teardown issue - well they may help because it's already mapped, but it's really the fault of your handler from attempting to map in user pages from when it's teardown/fallback task_work. If invoked and the ring is dying or not in the right task (as per the patch from Pavel), then just cleanup and return -ECANCELED. > +/* > + * Copy from memmap.c, should be exported > + */ > +static void io_pages_free(struct page ***pages, int npages) > +{ > + struct page **page_array = *pages; > + > + if (!page_array) > + return; > + > + unpin_user_pages(page_array, npages); > + kvfree(page_array); > + *pages = NULL; > +} I noticed this and the mapping helper being copied before seeing the comments - just export them from memmap.c and use those rather than copying in the code. Add that as a prep patch. > @@ -417,6 +437,7 @@ static int fuse_uring_out_header_has_err(struct fuse_out_header *oh, > goto seterr; > } > > + /* FIXME copied from dev.c, check what 512 means */ > if (oh->error <= -512 || oh->error > 0) { > err = -EINVAL; > goto seterr; -512 is -ERESTARTSYS -- Jens Axboe