On Wed, Jun 13, 2012 at 06:19:08PM +0800, Liu Bo wrote: > We used to issue a checksum to an extent state of 4K range for read endio, > but now we want to use larger range for performance optimization, so instead > we > create a radix tree for checksum, where an item stands for checksum of 4K > data. > > Signed-off-by: Liu Bo <liubo2...@cn.fujitsu.com> > --- > diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h > index 25900af..c896962 100644 > --- a/fs/btrfs/extent_io.h > +++ b/fs/btrfs/extent_io.h > @@ -96,11 +96,13 @@ struct extent_io_ops { > struct extent_io_tree { > struct rb_root state; > struct radix_tree_root buffer; > + struct radix_tree_root csum; > struct address_space *mapping; > u64 dirty_bytes; > int track_uptodate; > spinlock_t lock; > spinlock_t buffer_lock; > + spinlock_t csum_lock;
I'm afraid 3 spinlocks sharing the same cacheline will bite and hurt performance. struct extent_io_tree { struct rb_root state; /* 0 8 */ struct radix_tree_root buffer; /* 8 16 */ struct radix_tree_root csum; /* 24 16 */ struct address_space * mapping; /* 40 8 */ u64 dirty_bytes; /* 48 8 */ int track_uptodate; /* 56 4 */ /* XXX 4 bytes hole, try to pack */ /* --- cacheline 1 boundary (64 bytes) --- */ rwlock_t lock; /* 64 8 */ spinlock_t buffer_lock; /* 72 4 */ spinlock_t csum_lock; /* 76 4 */ struct extent_io_ops * ops; /* 80 8 */ /* size: 88, cachelines: 2, members: 10 */ /* sum members: 84, holes: 1, sum holes: 4 */ /* last cacheline: 24 bytes */ }; so we have to live with 2 cachenlines, maybe it'll be enough to split the structure to 2 sections depending on the access paterns. Definetely for later, but I think it should be noted as the patchset tries to improve performance. > struct extent_io_ops *ops; > }; david -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html