Re: [PATCH v7 3/5] iomap: use BIO_COMPLETE_IN_TASK for dropbehind writeback
Christoph Hellwig <[email protected]> Thu, 30 Jul 2026 01:13:33 -0700
| 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 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? 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.