|
@@ -19,6 +19,7 @@
|
|
|
|
|
|
#include "blk.h"
|
|
#include "blk.h"
|
|
#include "blk-mq.h"
|
|
#include "blk-mq.h"
|
|
|
|
+#include "blk-mq-debugfs.h"
|
|
#include "blk-mq-tag.h"
|
|
#include "blk-mq-tag.h"
|
|
#include "blk-mq-sched.h"
|
|
#include "blk-mq-sched.h"
|
|
|
|
|
|
@@ -517,6 +518,125 @@ static struct elv_fs_entry deadline_attrs[] = {
|
|
__ATTR_NULL
|
|
__ATTR_NULL
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+#ifdef CONFIG_BLK_DEBUG_FS
|
|
|
|
+#define DEADLINE_DEBUGFS_DDIR_ATTRS(ddir, name) \
|
|
|
|
+static void *deadline_##name##_fifo_start(struct seq_file *m, \
|
|
|
|
+ loff_t *pos) \
|
|
|
|
+ __acquires(&dd->lock) \
|
|
|
|
+{ \
|
|
|
|
+ struct request_queue *q = m->private; \
|
|
|
|
+ struct deadline_data *dd = q->elevator->elevator_data; \
|
|
|
|
+ \
|
|
|
|
+ spin_lock(&dd->lock); \
|
|
|
|
+ return seq_list_start(&dd->fifo_list[ddir], *pos); \
|
|
|
|
+} \
|
|
|
|
+ \
|
|
|
|
+static void *deadline_##name##_fifo_next(struct seq_file *m, void *v, \
|
|
|
|
+ loff_t *pos) \
|
|
|
|
+{ \
|
|
|
|
+ struct request_queue *q = m->private; \
|
|
|
|
+ struct deadline_data *dd = q->elevator->elevator_data; \
|
|
|
|
+ \
|
|
|
|
+ return seq_list_next(v, &dd->fifo_list[ddir], pos); \
|
|
|
|
+} \
|
|
|
|
+ \
|
|
|
|
+static void deadline_##name##_fifo_stop(struct seq_file *m, void *v) \
|
|
|
|
+ __releases(&dd->lock) \
|
|
|
|
+{ \
|
|
|
|
+ struct request_queue *q = m->private; \
|
|
|
|
+ struct deadline_data *dd = q->elevator->elevator_data; \
|
|
|
|
+ \
|
|
|
|
+ spin_unlock(&dd->lock); \
|
|
|
|
+} \
|
|
|
|
+ \
|
|
|
|
+static const struct seq_operations deadline_##name##_fifo_seq_ops = { \
|
|
|
|
+ .start = deadline_##name##_fifo_start, \
|
|
|
|
+ .next = deadline_##name##_fifo_next, \
|
|
|
|
+ .stop = deadline_##name##_fifo_stop, \
|
|
|
|
+ .show = blk_mq_debugfs_rq_show, \
|
|
|
|
+}; \
|
|
|
|
+ \
|
|
|
|
+static int deadline_##name##_next_rq_show(void *data, \
|
|
|
|
+ struct seq_file *m) \
|
|
|
|
+{ \
|
|
|
|
+ struct request_queue *q = data; \
|
|
|
|
+ struct deadline_data *dd = q->elevator->elevator_data; \
|
|
|
|
+ struct request *rq = dd->next_rq[ddir]; \
|
|
|
|
+ \
|
|
|
|
+ if (rq) \
|
|
|
|
+ __blk_mq_debugfs_rq_show(m, rq); \
|
|
|
|
+ return 0; \
|
|
|
|
+}
|
|
|
|
+DEADLINE_DEBUGFS_DDIR_ATTRS(READ, read)
|
|
|
|
+DEADLINE_DEBUGFS_DDIR_ATTRS(WRITE, write)
|
|
|
|
+#undef DEADLINE_DEBUGFS_DDIR_ATTRS
|
|
|
|
+
|
|
|
|
+static int deadline_batching_show(void *data, struct seq_file *m)
|
|
|
|
+{
|
|
|
|
+ struct request_queue *q = data;
|
|
|
|
+ struct deadline_data *dd = q->elevator->elevator_data;
|
|
|
|
+
|
|
|
|
+ seq_printf(m, "%u\n", dd->batching);
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int deadline_starved_show(void *data, struct seq_file *m)
|
|
|
|
+{
|
|
|
|
+ struct request_queue *q = data;
|
|
|
|
+ struct deadline_data *dd = q->elevator->elevator_data;
|
|
|
|
+
|
|
|
|
+ seq_printf(m, "%u\n", dd->starved);
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void *deadline_dispatch_start(struct seq_file *m, loff_t *pos)
|
|
|
|
+ __acquires(&dd->lock)
|
|
|
|
+{
|
|
|
|
+ struct request_queue *q = m->private;
|
|
|
|
+ struct deadline_data *dd = q->elevator->elevator_data;
|
|
|
|
+
|
|
|
|
+ spin_lock(&dd->lock);
|
|
|
|
+ return seq_list_start(&dd->dispatch, *pos);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void *deadline_dispatch_next(struct seq_file *m, void *v, loff_t *pos)
|
|
|
|
+{
|
|
|
|
+ struct request_queue *q = m->private;
|
|
|
|
+ struct deadline_data *dd = q->elevator->elevator_data;
|
|
|
|
+
|
|
|
|
+ return seq_list_next(v, &dd->dispatch, pos);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void deadline_dispatch_stop(struct seq_file *m, void *v)
|
|
|
|
+ __releases(&dd->lock)
|
|
|
|
+{
|
|
|
|
+ struct request_queue *q = m->private;
|
|
|
|
+ struct deadline_data *dd = q->elevator->elevator_data;
|
|
|
|
+
|
|
|
|
+ spin_unlock(&dd->lock);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static const struct seq_operations deadline_dispatch_seq_ops = {
|
|
|
|
+ .start = deadline_dispatch_start,
|
|
|
|
+ .next = deadline_dispatch_next,
|
|
|
|
+ .stop = deadline_dispatch_stop,
|
|
|
|
+ .show = blk_mq_debugfs_rq_show,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+#define DEADLINE_QUEUE_DDIR_ATTRS(name) \
|
|
|
|
+ {#name "_fifo_list", 0400, .seq_ops = &deadline_##name##_fifo_seq_ops}, \
|
|
|
|
+ {#name "_next_rq", 0400, deadline_##name##_next_rq_show}
|
|
|
|
+static const struct blk_mq_debugfs_attr deadline_queue_debugfs_attrs[] = {
|
|
|
|
+ DEADLINE_QUEUE_DDIR_ATTRS(read),
|
|
|
|
+ DEADLINE_QUEUE_DDIR_ATTRS(write),
|
|
|
|
+ {"batching", 0400, deadline_batching_show},
|
|
|
|
+ {"starved", 0400, deadline_starved_show},
|
|
|
|
+ {"dispatch", 0400, .seq_ops = &deadline_dispatch_seq_ops},
|
|
|
|
+ {},
|
|
|
|
+};
|
|
|
|
+#undef DEADLINE_QUEUE_DDIR_ATTRS
|
|
|
|
+#endif
|
|
|
|
+
|
|
static struct elevator_type mq_deadline = {
|
|
static struct elevator_type mq_deadline = {
|
|
.ops.mq = {
|
|
.ops.mq = {
|
|
.insert_requests = dd_insert_requests,
|
|
.insert_requests = dd_insert_requests,
|
|
@@ -533,6 +653,9 @@ static struct elevator_type mq_deadline = {
|
|
},
|
|
},
|
|
|
|
|
|
.uses_mq = true,
|
|
.uses_mq = true,
|
|
|
|
+#ifdef CONFIG_BLK_DEBUG_FS
|
|
|
|
+ .queue_debugfs_attrs = deadline_queue_debugfs_attrs,
|
|
|
|
+#endif
|
|
.elevator_attrs = deadline_attrs,
|
|
.elevator_attrs = deadline_attrs,
|
|
.elevator_name = "mq-deadline",
|
|
.elevator_name = "mq-deadline",
|
|
.elevator_owner = THIS_MODULE,
|
|
.elevator_owner = THIS_MODULE,
|