On Thu, Sep 06, 2018 at 05:18:16PM -0400, jeffm@xxxxxxxx wrote: > From: Jeff Mahoney <jeffm@xxxxxxxx> > > Commit 499f377f49f08 (btrfs: iterate over unused chunk space in FITRIM) > fixed free space trimming, but introduced latency when it was running. > This is due to it pinning the transaction using both a incremented > refcount and holding the commit root sem for the duration of a single > trim operation. > > This was to ensure safety but it's unnecessary. We already hold the the > chunk mutex so we know that the chunk we're using can't be allocated > while we're trimming it. > > In order to check against chunks allocated already in this transaction, > we need to check the pending chunks list. To to that safely without > joining the transaction (or attaching than then having to commit it) we > need to ensure that the dev root's commit root doesn't change underneath > us and the pending chunk lists stays around until we're done with it. > > We can ensure the former by holding the commit root sem and the latter > by pinning the transaction. We do this now, but the critical section > covers the trim operation itself and we don't need to do that. > > This patch moves the pinning and unpinning logic into helpers and > unpins the transaction after performing the search and check for > pending chunks. > > Limiting the critical section of the transaction pinning improves > the latency substantially on slower storage (e.g. image files over NFS). > > Fixes: 499f377f49f08 (btrfs: iterate over unused chunk space in FITRIM > Signed-off-by: Jeff Mahoney <jeffm@xxxxxxxx> Reviewed-by: David Sterba <dsterba@xxxxxxxx>
