On Tue, Jan 11, 2022 at 10:37:46AM +1100, Dave Chinner wrote: > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index c8c15c3c3147..82515d1ad4e0 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -136,7 +136,20 @@ xfs_end_ioend( > memalloc_nofs_restore(nofs_flag); > } > > -/* Finish all pending io completions. */ > +/* > + * Finish all pending IO completions that require transactional modifications. > + * > + * We try to merge physical and logically contiguous ioends before completion to > + * minimise the number of transactions we need to perform during IO completion. > + * Both unwritten extent conversion and COW remapping need to iterate and modify > + * one physical extent at a time, so we gain nothing by merging physically > + * discontiguous extents here. > + * > + * The ioend chain length that we can be processing here is largely unbound in > + * length and we may have to perform significant amounts of work on each ioend > + * to complete it. Hence we have to be careful about holding the CPU for too > + * long in this loop. > + */ > void > xfs_end_io( > struct work_struct *work) > @@ -147,6 +160,7 @@ xfs_end_io( > struct list_head tmp; > unsigned long flags; > > + msleep(5000); > spin_lock_irqsave(&ip->i_ioend_lock, flags); > list_replace_init(&ip->i_ioend_list, &tmp); > spin_unlock_irqrestore(&ip->i_ioend_lock, flags); You might want to comment that 5s completion delay out before you run the patch, Trond... Cheers, Dave. -- Dave Chinner david@xxxxxxxxxxxxx