block: Make struct request_queue smaller for CONFIG_BLK_DEV_ZONED=n
authorBart Van Assche <bart.vanassche@wdc.com>
Fri, 15 Jun 2018 21:55:21 +0000 (14:55 -0700)
committerJens Axboe <axboe@kernel.dk>
Mon, 9 Jul 2018 15:07:52 +0000 (09:07 -0600)
Exclude zoned block device members from struct request_queue for
CONFIG_BLK_DEV_ZONED == n. Avoid breaking the build by only building
the code that uses these struct request_queue members if
CONFIG_BLK_DEV_ZONED != n.

Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com>
Cc: Matias Bjorling <mb@lightnvm.io>
Cc: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/Kconfig
block/Makefile
block/blk-mq-debugfs-zoned.c [new file with mode: 0644]
block/blk-mq-debugfs.c
block/blk-mq-debugfs.h
include/linux/blkdev.h

index eb50fd4..dfe7bc7 100644 (file)
@@ -177,6 +177,10 @@ config BLK_DEBUG_FS
        Unless you are building a kernel for a tiny system, you should
        say Y here.
 
+config BLK_DEBUG_FS_ZONED
+       bool
+       default BLK_DEBUG_FS && BLK_DEV_ZONED
+
 config BLK_SED_OPAL
        bool "Logic for interfacing with Opal enabled SEDs"
        ---help---
index 6a56303..a8f94cd 100644 (file)
@@ -34,4 +34,5 @@ obj-$(CONFIG_BLK_MQ_RDMA)     += blk-mq-rdma.o
 obj-$(CONFIG_BLK_DEV_ZONED)    += blk-zoned.o
 obj-$(CONFIG_BLK_WBT)          += blk-wbt.o
 obj-$(CONFIG_BLK_DEBUG_FS)     += blk-mq-debugfs.o
+obj-$(CONFIG_BLK_DEBUG_FS_ZONED)+= blk-mq-debugfs-zoned.o
 obj-$(CONFIG_BLK_SED_OPAL)     += sed-opal.o
diff --git a/block/blk-mq-debugfs-zoned.c b/block/blk-mq-debugfs-zoned.c
new file mode 100644 (file)
index 0000000..fb2c82c
--- /dev/null
@@ -0,0 +1,24 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2017 Western Digital Corporation or its affiliates.
+ *
+ * This file is released under the GPL.
+ */
+
+#include <linux/blkdev.h>
+#include "blk-mq-debugfs.h"
+
+int queue_zone_wlock_show(void *data, struct seq_file *m)
+{
+       struct request_queue *q = data;
+       unsigned int i;
+
+       if (!q->seq_zones_wlock)
+               return 0;
+
+       for (i = 0; i < q->nr_zones; i++)
+               if (test_bit(i, q->seq_zones_wlock))
+                       seq_printf(m, "%u\n", i);
+
+       return 0;
+}
index 26e1f8e..7efe268 100644 (file)
@@ -206,21 +206,6 @@ static ssize_t queue_write_hint_store(void *data, const char __user *buf,
        return count;
 }
 
-static int queue_zone_wlock_show(void *data, struct seq_file *m)
-{
-       struct request_queue *q = data;
-       unsigned int i;
-
-       if (!q->seq_zones_wlock)
-               return 0;
-
-       for (i = 0; i < q->nr_zones; i++)
-               if (test_bit(i, q->seq_zones_wlock))
-                       seq_printf(m, "%u\n", i);
-
-       return 0;
-}
-
 static const struct blk_mq_debugfs_attr blk_mq_debugfs_queue_attrs[] = {
        { "poll_stat", 0400, queue_poll_stat_show },
        { "requeue_list", 0400, .seq_ops = &queue_requeue_list_seq_ops },
index b9d366e..a9160be 100644 (file)
@@ -80,4 +80,13 @@ static inline void blk_mq_debugfs_unregister_sched_hctx(struct blk_mq_hw_ctx *hc
 }
 #endif
 
+#ifdef CONFIG_BLK_DEBUG_FS_ZONED
+int queue_zone_wlock_show(void *data, struct seq_file *m);
+#else
+static inline int queue_zone_wlock_show(void *data, struct seq_file *m)
+{
+       return 0;
+}
+#endif
+
 #endif
index 905daa7..ca5a8b0 100644 (file)
@@ -592,6 +592,7 @@ struct request_queue {
 
        struct queue_limits     limits;
 
+#ifdef CONFIG_BLK_DEV_ZONED
        /*
         * Zoned block device information for request dispatch control.
         * nr_zones is the total number of zones of the device. This is always
@@ -612,6 +613,7 @@ struct request_queue {
        unsigned int            nr_zones;
        unsigned long           *seq_zones_bitmap;
        unsigned long           *seq_zones_wlock;
+#endif /* CONFIG_BLK_DEV_ZONED */
 
        /*
         * sg stuff
@@ -800,6 +802,7 @@ static inline unsigned int blk_queue_zone_sectors(struct request_queue *q)
        return blk_queue_is_zoned(q) ? q->limits.chunk_sectors : 0;
 }
 
+#ifdef CONFIG_BLK_DEV_ZONED
 static inline unsigned int blk_queue_zone_no(struct request_queue *q,
                                             sector_t sector)
 {
@@ -815,6 +818,7 @@ static inline bool blk_queue_zone_is_seq(struct request_queue *q,
                return false;
        return test_bit(blk_queue_zone_no(q, sector), q->seq_zones_bitmap);
 }
+#endif /* CONFIG_BLK_DEV_ZONED */
 
 static inline bool rq_is_sync(struct request *rq)
 {
@@ -1065,6 +1069,7 @@ static inline unsigned int blk_rq_cur_sectors(const struct request *rq)
        return blk_rq_cur_bytes(rq) >> SECTOR_SHIFT;
 }
 
+#ifdef CONFIG_BLK_DEV_ZONED
 static inline unsigned int blk_rq_zone_no(struct request *rq)
 {
        return blk_queue_zone_no(rq->q, blk_rq_pos(rq));
@@ -1074,6 +1079,7 @@ static inline unsigned int blk_rq_zone_is_seq(struct request *rq)
 {
        return blk_queue_zone_is_seq(rq->q, blk_rq_pos(rq));
 }
+#endif /* CONFIG_BLK_DEV_ZONED */
 
 /*
  * Some commands like WRITE SAME have a payload or data transfer size which