nvme: repack struct nvme_ns_head
authorDaniel Wagner <dwagner@suse.de>
Mon, 18 Dec 2023 16:59:54 +0000 (17:59 +0100)
committerKeith Busch <kbusch@kernel.org>
Tue, 19 Dec 2023 17:10:13 +0000 (09:10 -0800)
ns_id, lba_shift and ms are always accessed for every read/write I/O in
nvme_setup_rw. By grouping these variables into one cacheline we can
safe some cycles.

4k sequential reads:

           baseline   patched
Bandwidth: 1620       1634
IOPs       66345579   66910939

Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Daniel Wagner <dwagner@suse.de>
Signed-off-by: Keith Busch <kbusch@kernel.org>
drivers/nvme/host/nvme.h

index 6211f18c53c725520e9ab63c91008fb74bfc9d2c..3dbd187896d8d8706cbefd006459b351872e0f11 100644 (file)
@@ -440,21 +440,21 @@ struct nvme_ns_head {
        struct list_head        list;
        struct srcu_struct      srcu;
        struct nvme_subsystem   *subsys;
-       unsigned                ns_id;
        struct nvme_ns_ids      ids;
        struct list_head        entry;
        struct kref             ref;
        bool                    shared;
        int                     instance;
        struct nvme_effects_log *effects;
+       u64                     nuse;
+       unsigned                ns_id;
        int                     lba_shift;
        u16                     ms;
        u16                     pi_size;
-       u16                     sgs;
-       u32                     sws;
-       u64                     nuse;
        u8                      pi_type;
        u8                      guard_type;
+       u16                     sgs;
+       u32                     sws;
 #ifdef CONFIG_BLK_DEV_ZONED
        u64                     zsze;
 #endif