btrfs: use smaller type for btrfs_path locks
authorDavid Sterba <dsterba@suse.com>
Fri, 27 Nov 2015 15:31:45 +0000 (16:31 +0100)
committerDavid Sterba <dsterba@suse.com>
Thu, 7 Jan 2016 14:01:17 +0000 (15:01 +0100)
The values of btrfs_path::locks are 0 to 4, fit into a u8. Let's see:

* overall size of btrfs_path drops down from 136 to 112 (-24 bytes),
* better packing in a slab page +6 objects
* the whole structure now fits to 2 cachelines
* slight decrease in code size:

   text    data     bss     dec     hex filename
 938731   43670   23144 1005545   f57e9 fs/btrfs/btrfs.ko.before
 938203   43670   23144 1005017   f55d9 fs/btrfs/btrfs.ko.after

(and the generated assembly does not change much)

The main purpose is to decrease the size of the structure without
affecting performance. The byte access is usually well behaving accross
arches, the locks are not accessed frequently and sometimes just
compared to zero.

Note for further size reduction attempts: the slots could be made u16
but this might generate worse code on some arches (non-byte and non-int
access). Also the range of operations on slots is wider compared to
locks and the potential performance drop should be evaluated first.

Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/ctree.h

index 09ee92d9670c2c5b2ee402084fec61f18aadb8c5..5e0fe0914d547ace46441663014f053d50e893d9 100644 (file)
@@ -595,7 +595,7 @@ struct btrfs_path {
        struct extent_buffer *nodes[BTRFS_MAX_LEVEL];
        int slots[BTRFS_MAX_LEVEL];
        /* if there is real range locking, this locks field will change */
-       int locks[BTRFS_MAX_LEVEL];
+       u8 locks[BTRFS_MAX_LEVEL];
        u8 reada;
        /* keep some upper locks as we walk down */
        u8 lowest_level;