Re: [PATCH v7 3/5] iomap: use BIO_COMPLETE_IN_TASK for dropbehind writeback
Tal Zussman <[email protected]> Thu, 30 Jul 2026 16:39:03 -0400
| Newsgroups | org.ozlabs.lists.linux-erofs,org.kernel.vger.linux-block,org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel,org.kernel.vger.linux-xfs,org.kvack.linux-mm |
|---|---|
| Message-ID | <[email protected]> |
On 7/30/26 4:13 AM, Christoph Hellwig wrote: > On Thu, Jul 30, 2026 at 02:57:53AM -0400, Tal Zussman wrote: >> Set BIO_COMPLETE_IN_TASK on iomap writeback bios when a dropbehind folio >> is added. This ensures that bi_end_io runs in task context, where >> folio_end_dropbehind() can safely invalidate folios. >> >> With the bio layer now handling task-context deferral generically, >> IOMAP_IOEND_DONTCACHE is no longer needed, as XFS no longer needs to >> route DONTCACHE ioends through its completion workqueue. Remove the flag >> and its NOMERGE entry. >> >> Without the NOMERGE, regular I/Os that get merged with a dropbehind >> folio will also have their completion deferred to task context. >> >> Reviewed-by: Christoph Hellwig <[email protected]> >> Signed-off-by: Tal Zussman <[email protected]> > > This seems to be missing the bug fix you identified for the double > deferral? Sorry, I misunderstood and assumed you'd take care of it in a follow-up. I'll adjust it as below and send v8. > I although thought a bit how that could be done cleaner, see below: > >> ioend_flags |= IOMAP_IOEND_SHARED; >> - if (folio_test_dropbehind(folio)) >> - ioend_flags |= IOMAP_IOEND_DONTCACHE; > > I'd keep this flag. > >> if (pos == wpc->iomap.offset && (wpc->iomap.flags & IOMAP_F_BOUNDARY)) >> ioend_flags |= IOMAP_IOEND_BOUNDARY; >> >> @@ -256,6 +254,9 @@ ssize_t iomap_add_to_ioend(struct iomap_writepage_ctx *wpc, struct folio *folio, >> if (!bio_add_folio(&ioend->io_bio, folio, map_len, poff)) >> goto new_ioend; >> >> + if (folio_test_dropbehind(folio)) >> + bio_set_flag(&ioend->io_bio, BIO_COMPLETE_IN_TASK); > > And move setting the flag to iomap_ioend_writeback_submit, and only > for the case where no io_bio.bi_end_io is already assigned. > To confirm, this would only work because XFS provides its own task context and is the only consumer of iomap that sets its own io_bio.bi_end_io. If another filesystem set it and didn't provide task context, this would break, right? I can add a comment about this requirement, but I want to confirm the intent, as it feels a little fragile as-is.