linux/block/blk-mq-debugfs.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2017 Facebook
   3 *
   4 * This program is free software; you can redistribute it and/or
   5 * modify it under the terms of the GNU General Public
   6 * License v2 as published by the Free Software Foundation.
   7 *
   8 * This program is distributed in the hope that it will be useful,
   9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11 * General Public License for more details.
  12 *
  13 * You should have received a copy of the GNU General Public License
  14 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  15 */
  16
  17#include <linux/kernel.h>
  18#include <linux/blkdev.h>
  19#include <linux/debugfs.h>
  20
  21#include <linux/blk-mq.h>
  22#include "blk.h"
  23#include "blk-mq.h"
  24#include "blk-mq-debugfs.h"
  25#include "blk-mq-tag.h"
  26
  27static void print_stat(struct seq_file *m, struct blk_rq_stat *stat)
  28{
  29        if (stat->nr_samples) {
  30                seq_printf(m, "samples=%d, mean=%lld, min=%llu, max=%llu",
  31                           stat->nr_samples, stat->mean, stat->min, stat->max);
  32        } else {
  33                seq_puts(m, "samples=0");
  34        }
  35}
  36
  37static int queue_poll_stat_show(void *data, struct seq_file *m)
  38{
  39        struct request_queue *q = data;
  40        int bucket;
  41
  42        for (bucket = 0; bucket < BLK_MQ_POLL_STATS_BKTS/2; bucket++) {
  43                seq_printf(m, "read  (%d Bytes): ", 1 << (9+bucket));
  44                print_stat(m, &q->poll_stat[2*bucket]);
  45                seq_puts(m, "\n");
  46
  47                seq_printf(m, "write (%d Bytes): ",  1 << (9+bucket));
  48                print_stat(m, &q->poll_stat[2*bucket+1]);
  49                seq_puts(m, "\n");
  50        }
  51        return 0;
  52}
  53
  54static void *queue_requeue_list_start(struct seq_file *m, loff_t *pos)
  55        __acquires(&q->requeue_lock)
  56{
  57        struct request_queue *q = m->private;
  58
  59        spin_lock_irq(&q->requeue_lock);
  60        return seq_list_start(&q->requeue_list, *pos);
  61}
  62
  63static void *queue_requeue_list_next(struct seq_file *m, void *v, loff_t *pos)
  64{
  65        struct request_queue *q = m->private;
  66
  67        return seq_list_next(v, &q->requeue_list, pos);
  68}
  69
  70static void queue_requeue_list_stop(struct seq_file *m, void *v)
  71        __releases(&q->requeue_lock)
  72{
  73        struct request_queue *q = m->private;
  74
  75        spin_unlock_irq(&q->requeue_lock);
  76}
  77
  78static const struct seq_operations queue_requeue_list_seq_ops = {
  79        .start  = queue_requeue_list_start,
  80        .next   = queue_requeue_list_next,
  81        .stop   = queue_requeue_list_stop,
  82        .show   = blk_mq_debugfs_rq_show,
  83};
  84
  85static int blk_flags_show(struct seq_file *m, const unsigned long flags,
  86                          const char *const *flag_name, int flag_name_count)
  87{
  88        bool sep = false;
  89        int i;
  90
  91        for (i = 0; i < sizeof(flags) * BITS_PER_BYTE; i++) {
  92                if (!(flags & BIT(i)))
  93                        continue;
  94                if (sep)
  95                        seq_puts(m, "|");
  96                sep = true;
  97                if (i < flag_name_count && flag_name[i])
  98                        seq_puts(m, flag_name[i]);
  99                else
 100                        seq_printf(m, "%d", i);
 101        }
 102        return 0;
 103}
 104
 105#define QUEUE_FLAG_NAME(name) [QUEUE_FLAG_##name] = #name
 106static const char *const blk_queue_flag_name[] = {
 107        QUEUE_FLAG_NAME(QUEUED),
 108        QUEUE_FLAG_NAME(STOPPED),
 109        QUEUE_FLAG_NAME(DYING),
 110        QUEUE_FLAG_NAME(BYPASS),
 111        QUEUE_FLAG_NAME(BIDI),
 112        QUEUE_FLAG_NAME(NOMERGES),
 113        QUEUE_FLAG_NAME(SAME_COMP),
 114        QUEUE_FLAG_NAME(FAIL_IO),
 115        QUEUE_FLAG_NAME(NONROT),
 116        QUEUE_FLAG_NAME(IO_STAT),
 117        QUEUE_FLAG_NAME(DISCARD),
 118        QUEUE_FLAG_NAME(NOXMERGES),
 119        QUEUE_FLAG_NAME(ADD_RANDOM),
 120        QUEUE_FLAG_NAME(SECERASE),
 121        QUEUE_FLAG_NAME(SAME_FORCE),
 122        QUEUE_FLAG_NAME(DEAD),
 123        QUEUE_FLAG_NAME(INIT_DONE),
 124        QUEUE_FLAG_NAME(NO_SG_MERGE),
 125        QUEUE_FLAG_NAME(POLL),
 126        QUEUE_FLAG_NAME(WC),
 127        QUEUE_FLAG_NAME(FUA),
 128        QUEUE_FLAG_NAME(FLUSH_NQ),
 129        QUEUE_FLAG_NAME(DAX),
 130        QUEUE_FLAG_NAME(STATS),
 131        QUEUE_FLAG_NAME(POLL_STATS),
 132        QUEUE_FLAG_NAME(REGISTERED),
 133        QUEUE_FLAG_NAME(SCSI_PASSTHROUGH),
 134        QUEUE_FLAG_NAME(QUIESCED),
 135        QUEUE_FLAG_NAME(PREEMPT_ONLY),
 136};
 137#undef QUEUE_FLAG_NAME
 138
 139static int queue_state_show(void *data, struct seq_file *m)
 140{
 141        struct request_queue *q = data;
 142
 143        blk_flags_show(m, q->queue_flags, blk_queue_flag_name,
 144                       ARRAY_SIZE(blk_queue_flag_name));
 145        seq_puts(m, "\n");
 146        return 0;
 147}
 148
 149static ssize_t queue_state_write(void *data, const char __user *buf,
 150                                 size_t count, loff_t *ppos)
 151{
 152        struct request_queue *q = data;
 153        char opbuf[16] = { }, *op;
 154
 155        /*
 156         * The "state" attribute is removed after blk_cleanup_queue() has called
 157         * blk_mq_free_queue(). Return if QUEUE_FLAG_DEAD has been set to avoid
 158         * triggering a use-after-free.
 159         */
 160        if (blk_queue_dead(q))
 161                return -ENOENT;
 162
 163        if (count >= sizeof(opbuf)) {
 164                pr_err("%s: operation too long\n", __func__);
 165                goto inval;
 166        }
 167
 168        if (copy_from_user(opbuf, buf, count))
 169                return -EFAULT;
 170        op = strstrip(opbuf);
 171        if (strcmp(op, "run") == 0) {
 172                blk_mq_run_hw_queues(q, true);
 173        } else if (strcmp(op, "start") == 0) {
 174                blk_mq_start_stopped_hw_queues(q, true);
 175        } else if (strcmp(op, "kick") == 0) {
 176                blk_mq_kick_requeue_list(q);
 177        } else {
 178                pr_err("%s: unsupported operation '%s'\n", __func__, op);
 179inval:
 180                pr_err("%s: use 'run', 'start' or 'kick'\n", __func__);
 181                return -EINVAL;
 182        }
 183        return count;
 184}
 185
 186static int queue_write_hint_show(void *data, struct seq_file *m)
 187{
 188        struct request_queue *q = data;
 189        int i;
 190
 191        for (i = 0; i < BLK_MAX_WRITE_HINTS; i++)
 192                seq_printf(m, "hint%d: %llu\n", i, q->write_hints[i]);
 193
 194        return 0;
 195}
 196
 197static ssize_t queue_write_hint_store(void *data, const char __user *buf,
 198                                      size_t count, loff_t *ppos)
 199{
 200        struct request_queue *q = data;
 201        int i;
 202
 203        for (i = 0; i < BLK_MAX_WRITE_HINTS; i++)
 204                q->write_hints[i] = 0;
 205
 206        return count;
 207}
 208
 209static const struct blk_mq_debugfs_attr blk_mq_debugfs_queue_attrs[] = {
 210        { "poll_stat", 0400, queue_poll_stat_show },
 211        { "requeue_list", 0400, .seq_ops = &queue_requeue_list_seq_ops },
 212        { "state", 0600, queue_state_show, queue_state_write },
 213        { "write_hints", 0600, queue_write_hint_show, queue_write_hint_store },
 214        { "zone_wlock", 0400, queue_zone_wlock_show, NULL },
 215        { },
 216};
 217
 218#define HCTX_STATE_NAME(name) [BLK_MQ_S_##name] = #name
 219static const char *const hctx_state_name[] = {
 220        HCTX_STATE_NAME(STOPPED),
 221        HCTX_STATE_NAME(TAG_ACTIVE),
 222        HCTX_STATE_NAME(SCHED_RESTART),
 223};
 224#undef HCTX_STATE_NAME
 225
 226static int hctx_state_show(void *data, struct seq_file *m)
 227{
 228        struct blk_mq_hw_ctx *hctx = data;
 229
 230        blk_flags_show(m, hctx->state, hctx_state_name,
 231                       ARRAY_SIZE(hctx_state_name));
 232        seq_puts(m, "\n");
 233        return 0;
 234}
 235
 236#define BLK_TAG_ALLOC_NAME(name) [BLK_TAG_ALLOC_##name] = #name
 237static const char *const alloc_policy_name[] = {
 238        BLK_TAG_ALLOC_NAME(FIFO),
 239        BLK_TAG_ALLOC_NAME(RR),
 240};
 241#undef BLK_TAG_ALLOC_NAME
 242
 243#define HCTX_FLAG_NAME(name) [ilog2(BLK_MQ_F_##name)] = #name
 244static const char *const hctx_flag_name[] = {
 245        HCTX_FLAG_NAME(SHOULD_MERGE),
 246        HCTX_FLAG_NAME(TAG_SHARED),
 247        HCTX_FLAG_NAME(SG_MERGE),
 248        HCTX_FLAG_NAME(BLOCKING),
 249        HCTX_FLAG_NAME(NO_SCHED),
 250};
 251#undef HCTX_FLAG_NAME
 252
 253static int hctx_flags_show(void *data, struct seq_file *m)
 254{
 255        struct blk_mq_hw_ctx *hctx = data;
 256        const int alloc_policy = BLK_MQ_FLAG_TO_ALLOC_POLICY(hctx->flags);
 257
 258        seq_puts(m, "alloc_policy=");
 259        if (alloc_policy < ARRAY_SIZE(alloc_policy_name) &&
 260            alloc_policy_name[alloc_policy])
 261                seq_puts(m, alloc_policy_name[alloc_policy]);
 262        else
 263                seq_printf(m, "%d", alloc_policy);
 264        seq_puts(m, " ");
 265        blk_flags_show(m,
 266                       hctx->flags ^ BLK_ALLOC_POLICY_TO_MQ_FLAG(alloc_policy),
 267                       hctx_flag_name, ARRAY_SIZE(hctx_flag_name));
 268        seq_puts(m, "\n");
 269        return 0;
 270}
 271
 272#define REQ_OP_NAME(name) [REQ_OP_##name] = #name
 273static const char *const op_name[] = {
 274        REQ_OP_NAME(READ),
 275        REQ_OP_NAME(WRITE),
 276        REQ_OP_NAME(FLUSH),
 277        REQ_OP_NAME(DISCARD),
 278        REQ_OP_NAME(ZONE_REPORT),
 279        REQ_OP_NAME(SECURE_ERASE),
 280        REQ_OP_NAME(ZONE_RESET),
 281        REQ_OP_NAME(WRITE_SAME),
 282        REQ_OP_NAME(WRITE_ZEROES),
 283        REQ_OP_NAME(SCSI_IN),
 284        REQ_OP_NAME(SCSI_OUT),
 285        REQ_OP_NAME(DRV_IN),
 286        REQ_OP_NAME(DRV_OUT),
 287};
 288#undef REQ_OP_NAME
 289
 290#define CMD_FLAG_NAME(name) [__REQ_##name] = #name
 291static const char *const cmd_flag_name[] = {
 292        CMD_FLAG_NAME(FAILFAST_DEV),
 293        CMD_FLAG_NAME(FAILFAST_TRANSPORT),
 294        CMD_FLAG_NAME(FAILFAST_DRIVER),
 295        CMD_FLAG_NAME(SYNC),
 296        CMD_FLAG_NAME(META),
 297        CMD_FLAG_NAME(PRIO),
 298        CMD_FLAG_NAME(NOMERGE),
 299        CMD_FLAG_NAME(IDLE),
 300        CMD_FLAG_NAME(INTEGRITY),
 301        CMD_FLAG_NAME(FUA),
 302        CMD_FLAG_NAME(PREFLUSH),
 303        CMD_FLAG_NAME(RAHEAD),
 304        CMD_FLAG_NAME(BACKGROUND),
 305        CMD_FLAG_NAME(NOUNMAP),
 306        CMD_FLAG_NAME(NOWAIT),
 307};
 308#undef CMD_FLAG_NAME
 309
 310#define RQF_NAME(name) [ilog2((__force u32)RQF_##name)] = #name
 311static const char *const rqf_name[] = {
 312        RQF_NAME(SORTED),
 313        RQF_NAME(STARTED),
 314        RQF_NAME(QUEUED),
 315        RQF_NAME(SOFTBARRIER),
 316        RQF_NAME(FLUSH_SEQ),
 317        RQF_NAME(MIXED_MERGE),
 318        RQF_NAME(MQ_INFLIGHT),
 319        RQF_NAME(DONTPREP),
 320        RQF_NAME(PREEMPT),
 321        RQF_NAME(COPY_USER),
 322        RQF_NAME(FAILED),
 323        RQF_NAME(QUIET),
 324        RQF_NAME(ELVPRIV),
 325        RQF_NAME(IO_STAT),
 326        RQF_NAME(ALLOCED),
 327        RQF_NAME(PM),
 328        RQF_NAME(HASHED),
 329        RQF_NAME(STATS),
 330        RQF_NAME(SPECIAL_PAYLOAD),
 331        RQF_NAME(ZONE_WRITE_LOCKED),
 332        RQF_NAME(MQ_POLL_SLEPT),
 333};
 334#undef RQF_NAME
 335
 336static const char *const blk_mq_rq_state_name_array[] = {
 337        [MQ_RQ_IDLE]            = "idle",
 338        [MQ_RQ_IN_FLIGHT]       = "in_flight",
 339        [MQ_RQ_COMPLETE]        = "complete",
 340};
 341
 342static const char *blk_mq_rq_state_name(enum mq_rq_state rq_state)
 343{
 344        if (WARN_ON_ONCE((unsigned int)rq_state >=
 345                         ARRAY_SIZE(blk_mq_rq_state_name_array)))
 346                return "(?)";
 347        return blk_mq_rq_state_name_array[rq_state];
 348}
 349
 350int __blk_mq_debugfs_rq_show(struct seq_file *m, struct request *rq)
 351{
 352        const struct blk_mq_ops *const mq_ops = rq->q->mq_ops;
 353        const unsigned int op = rq->cmd_flags & REQ_OP_MASK;
 354
 355        seq_printf(m, "%p {.op=", rq);
 356        if (op < ARRAY_SIZE(op_name) && op_name[op])
 357                seq_printf(m, "%s", op_name[op]);
 358        else
 359                seq_printf(m, "%d", op);
 360        seq_puts(m, ", .cmd_flags=");
 361        blk_flags_show(m, rq->cmd_flags & ~REQ_OP_MASK, cmd_flag_name,
 362                       ARRAY_SIZE(cmd_flag_name));
 363        seq_puts(m, ", .rq_flags=");
 364        blk_flags_show(m, (__force unsigned int)rq->rq_flags, rqf_name,
 365                       ARRAY_SIZE(rqf_name));
 366        seq_printf(m, ", .state=%s", blk_mq_rq_state_name(blk_mq_rq_state(rq)));
 367        seq_printf(m, ", .tag=%d, .internal_tag=%d", rq->tag,
 368                   rq->internal_tag);
 369        if (mq_ops->show_rq)
 370                mq_ops->show_rq(m, rq);
 371        seq_puts(m, "}\n");
 372        return 0;
 373}
 374EXPORT_SYMBOL_GPL(__blk_mq_debugfs_rq_show);
 375
 376int blk_mq_debugfs_rq_show(struct seq_file *m, void *v)
 377{
 378        return __blk_mq_debugfs_rq_show(m, list_entry_rq(v));
 379}
 380EXPORT_SYMBOL_GPL(blk_mq_debugfs_rq_show);
 381
 382static void *hctx_dispatch_start(struct seq_file *m, loff_t *pos)
 383        __acquires(&hctx->lock)
 384{
 385        struct blk_mq_hw_ctx *hctx = m->private;
 386
 387        spin_lock(&hctx->lock);
 388        return seq_list_start(&hctx->dispatch, *pos);
 389}
 390
 391static void *hctx_dispatch_next(struct seq_file *m, void *v, loff_t *pos)
 392{
 393        struct blk_mq_hw_ctx *hctx = m->private;
 394
 395        return seq_list_next(v, &hctx->dispatch, pos);
 396}
 397
 398static void hctx_dispatch_stop(struct seq_file *m, void *v)
 399        __releases(&hctx->lock)
 400{
 401        struct blk_mq_hw_ctx *hctx = m->private;
 402
 403        spin_unlock(&hctx->lock);
 404}
 405
 406static const struct seq_operations hctx_dispatch_seq_ops = {
 407        .start  = hctx_dispatch_start,
 408        .next   = hctx_dispatch_next,
 409        .stop   = hctx_dispatch_stop,
 410        .show   = blk_mq_debugfs_rq_show,
 411};
 412
 413struct show_busy_params {
 414        struct seq_file         *m;
 415        struct blk_mq_hw_ctx    *hctx;
 416};
 417
 418/*
 419 * Note: the state of a request may change while this function is in progress,
 420 * e.g. due to a concurrent blk_mq_finish_request() call.
 421 */
 422static void hctx_show_busy_rq(struct request *rq, void *data, bool reserved)
 423{
 424        const struct show_busy_params *params = data;
 425
 426        if (blk_mq_map_queue(rq->q, rq->mq_ctx->cpu) == params->hctx &&
 427            blk_mq_rq_state(rq) != MQ_RQ_IDLE)
 428                __blk_mq_debugfs_rq_show(params->m,
 429                                         list_entry_rq(&rq->queuelist));
 430}
 431
 432static int hctx_busy_show(void *data, struct seq_file *m)
 433{
 434        struct blk_mq_hw_ctx *hctx = data;
 435        struct show_busy_params params = { .m = m, .hctx = hctx };
 436
 437        blk_mq_tagset_busy_iter(hctx->queue->tag_set, hctx_show_busy_rq,
 438                                &params);
 439
 440        return 0;
 441}
 442
 443static int hctx_ctx_map_show(void *data, struct seq_file *m)
 444{
 445        struct blk_mq_hw_ctx *hctx = data;
 446
 447        sbitmap_bitmap_show(&hctx->ctx_map, m);
 448        return 0;
 449}
 450
 451static void blk_mq_debugfs_tags_show(struct seq_file *m,
 452                                     struct blk_mq_tags *tags)
 453{
 454        seq_printf(m, "nr_tags=%u\n", tags->nr_tags);
 455        seq_printf(m, "nr_reserved_tags=%u\n", tags->nr_reserved_tags);
 456        seq_printf(m, "active_queues=%d\n",
 457                   atomic_read(&tags->active_queues));
 458
 459        seq_puts(m, "\nbitmap_tags:\n");
 460        sbitmap_queue_show(&tags->bitmap_tags, m);
 461
 462        if (tags->nr_reserved_tags) {
 463                seq_puts(m, "\nbreserved_tags:\n");
 464                sbitmap_queue_show(&tags->breserved_tags, m);
 465        }
 466}
 467
 468static int hctx_tags_show(void *data, struct seq_file *m)
 469{
 470        struct blk_mq_hw_ctx *hctx = data;
 471        struct request_queue *q = hctx->queue;
 472        int res;
 473
 474        res = mutex_lock_interruptible(&q->sysfs_lock);
 475        if (res)
 476                goto out;
 477        if (hctx->tags)
 478                blk_mq_debugfs_tags_show(m, hctx->tags);
 479        mutex_unlock(&q->sysfs_lock);
 480
 481out:
 482        return res;
 483}
 484
 485static int hctx_tags_bitmap_show(void *data, struct seq_file *m)
 486{
 487        struct blk_mq_hw_ctx *hctx = data;
 488        struct request_queue *q = hctx->queue;
 489        int res;
 490
 491        res = mutex_lock_interruptible(&q->sysfs_lock);
 492        if (res)
 493                goto out;
 494        if (hctx->tags)
 495                sbitmap_bitmap_show(&hctx->tags->bitmap_tags.sb, m);
 496        mutex_unlock(&q->sysfs_lock);
 497
 498out:
 499        return res;
 500}
 501
 502static int hctx_sched_tags_show(void *data, struct seq_file *m)
 503{
 504        struct blk_mq_hw_ctx *hctx = data;
 505        struct request_queue *q = hctx->queue;
 506        int res;
 507
 508        res = mutex_lock_interruptible(&q->sysfs_lock);
 509        if (res)
 510                goto out;
 511        if (hctx->sched_tags)
 512                blk_mq_debugfs_tags_show(m, hctx->sched_tags);
 513        mutex_unlock(&q->sysfs_lock);
 514
 515out:
 516        return res;
 517}
 518
 519static int hctx_sched_tags_bitmap_show(void *data, struct seq_file *m)
 520{
 521        struct blk_mq_hw_ctx *hctx = data;
 522        struct request_queue *q = hctx->queue;
 523        int res;
 524
 525        res = mutex_lock_interruptible(&q->sysfs_lock);
 526        if (res)
 527                goto out;
 528        if (hctx->sched_tags)
 529                sbitmap_bitmap_show(&hctx->sched_tags->bitmap_tags.sb, m);
 530        mutex_unlock(&q->sysfs_lock);
 531
 532out:
 533        return res;
 534}
 535
 536static int hctx_io_poll_show(void *data, struct seq_file *m)
 537{
 538        struct blk_mq_hw_ctx *hctx = data;
 539
 540        seq_printf(m, "considered=%lu\n", hctx->poll_considered);
 541        seq_printf(m, "invoked=%lu\n", hctx->poll_invoked);
 542        seq_printf(m, "success=%lu\n", hctx->poll_success);
 543        return 0;
 544}
 545
 546static ssize_t hctx_io_poll_write(void *data, const char __user *buf,
 547                                  size_t count, loff_t *ppos)
 548{
 549        struct blk_mq_hw_ctx *hctx = data;
 550
 551        hctx->poll_considered = hctx->poll_invoked = hctx->poll_success = 0;
 552        return count;
 553}
 554
 555static int hctx_dispatched_show(void *data, struct seq_file *m)
 556{
 557        struct blk_mq_hw_ctx *hctx = data;
 558        int i;
 559
 560        seq_printf(m, "%8u\t%lu\n", 0U, hctx->dispatched[0]);
 561
 562        for (i = 1; i < BLK_MQ_MAX_DISPATCH_ORDER - 1; i++) {
 563                unsigned int d = 1U << (i - 1);
 564
 565                seq_printf(m, "%8u\t%lu\n", d, hctx->dispatched[i]);
 566        }
 567
 568        seq_printf(m, "%8u+\t%lu\n", 1U << (i - 1), hctx->dispatched[i]);
 569        return 0;
 570}
 571
 572static ssize_t hctx_dispatched_write(void *data, const char __user *buf,
 573                                     size_t count, loff_t *ppos)
 574{
 575        struct blk_mq_hw_ctx *hctx = data;
 576        int i;
 577
 578        for (i = 0; i < BLK_MQ_MAX_DISPATCH_ORDER; i++)
 579                hctx->dispatched[i] = 0;
 580        return count;
 581}
 582
 583static int hctx_queued_show(void *data, struct seq_file *m)
 584{
 585        struct blk_mq_hw_ctx *hctx = data;
 586
 587        seq_printf(m, "%lu\n", hctx->queued);
 588        return 0;
 589}
 590
 591static ssize_t hctx_queued_write(void *data, const char __user *buf,
 592                                 size_t count, loff_t *ppos)
 593{
 594        struct blk_mq_hw_ctx *hctx = data;
 595
 596        hctx->queued = 0;
 597        return count;
 598}
 599
 600static int hctx_run_show(void *data, struct seq_file *m)
 601{
 602        struct blk_mq_hw_ctx *hctx = data;
 603
 604        seq_printf(m, "%lu\n", hctx->run);
 605        return 0;
 606}
 607
 608static ssize_t hctx_run_write(void *data, const char __user *buf, size_t count,
 609                              loff_t *ppos)
 610{
 611        struct blk_mq_hw_ctx *hctx = data;
 612
 613        hctx->run = 0;
 614        return count;
 615}
 616
 617static int hctx_active_show(void *data, struct seq_file *m)
 618{
 619        struct blk_mq_hw_ctx *hctx = data;
 620
 621        seq_printf(m, "%d\n", atomic_read(&hctx->nr_active));
 622        return 0;
 623}
 624
 625static int hctx_dispatch_busy_show(void *data, struct seq_file *m)
 626{
 627        struct blk_mq_hw_ctx *hctx = data;
 628
 629        seq_printf(m, "%u\n", hctx->dispatch_busy);
 630        return 0;
 631}
 632
 633static void *ctx_rq_list_start(struct seq_file *m, loff_t *pos)
 634        __acquires(&ctx->lock)
 635{
 636        struct blk_mq_ctx *ctx = m->private;
 637
 638        spin_lock(&ctx->lock);
 639        return seq_list_start(&ctx->rq_list, *pos);
 640}
 641
 642static void *ctx_rq_list_next(struct seq_file *m, void *v, loff_t *pos)
 643{
 644        struct blk_mq_ctx *ctx = m->private;
 645
 646        return seq_list_next(v, &ctx->rq_list, pos);
 647}
 648
 649static void ctx_rq_list_stop(struct seq_file *m, void *v)
 650        __releases(&ctx->lock)
 651{
 652        struct blk_mq_ctx *ctx = m->private;
 653
 654        spin_unlock(&ctx->lock);
 655}
 656
 657static const struct seq_operations ctx_rq_list_seq_ops = {
 658        .start  = ctx_rq_list_start,
 659        .next   = ctx_rq_list_next,
 660        .stop   = ctx_rq_list_stop,
 661        .show   = blk_mq_debugfs_rq_show,
 662};
 663static int ctx_dispatched_show(void *data, struct seq_file *m)
 664{
 665        struct blk_mq_ctx *ctx = data;
 666
 667        seq_printf(m, "%lu %lu\n", ctx->rq_dispatched[1], ctx->rq_dispatched[0]);
 668        return 0;
 669}
 670
 671static ssize_t ctx_dispatched_write(void *data, const char __user *buf,
 672                                    size_t count, loff_t *ppos)
 673{
 674        struct blk_mq_ctx *ctx = data;
 675
 676        ctx->rq_dispatched[0] = ctx->rq_dispatched[1] = 0;
 677        return count;
 678}
 679
 680static int ctx_merged_show(void *data, struct seq_file *m)
 681{
 682        struct blk_mq_ctx *ctx = data;
 683
 684        seq_printf(m, "%lu\n", ctx->rq_merged);
 685        return 0;
 686}
 687
 688static ssize_t ctx_merged_write(void *data, const char __user *buf,
 689                                size_t count, loff_t *ppos)
 690{
 691        struct blk_mq_ctx *ctx = data;
 692
 693        ctx->rq_merged = 0;
 694        return count;
 695}
 696
 697static int ctx_completed_show(void *data, struct seq_file *m)
 698{
 699        struct blk_mq_ctx *ctx = data;
 700
 701        seq_printf(m, "%lu %lu\n", ctx->rq_completed[1], ctx->rq_completed[0]);
 702        return 0;
 703}
 704
 705static ssize_t ctx_completed_write(void *data, const char __user *buf,
 706                                   size_t count, loff_t *ppos)
 707{
 708        struct blk_mq_ctx *ctx = data;
 709
 710        ctx->rq_completed[0] = ctx->rq_completed[1] = 0;
 711        return count;
 712}
 713
 714static int blk_mq_debugfs_show(struct seq_file *m, void *v)
 715{
 716        const struct blk_mq_debugfs_attr *attr = m->private;
 717        void *data = d_inode(m->file->f_path.dentry->d_parent)->i_private;
 718
 719        return attr->show(data, m);
 720}
 721
 722static ssize_t blk_mq_debugfs_write(struct file *file, const char __user *buf,
 723                                    size_t count, loff_t *ppos)
 724{
 725        struct seq_file *m = file->private_data;
 726        const struct blk_mq_debugfs_attr *attr = m->private;
 727        void *data = d_inode(file->f_path.dentry->d_parent)->i_private;
 728
 729        /*
 730         * Attributes that only implement .seq_ops are read-only and 'attr' is
 731         * the same with 'data' in this case.
 732         */
 733        if (attr == data || !attr->write)
 734                return -EPERM;
 735
 736        return attr->write(data, buf, count, ppos);
 737}
 738
 739static int blk_mq_debugfs_open(struct inode *inode, struct file *file)
 740{
 741        const struct blk_mq_debugfs_attr *attr = inode->i_private;
 742        void *data = d_inode(file->f_path.dentry->d_parent)->i_private;
 743        struct seq_file *m;
 744        int ret;
 745
 746        if (attr->seq_ops) {
 747                ret = seq_open(file, attr->seq_ops);
 748                if (!ret) {
 749                        m = file->private_data;
 750                        m->private = data;
 751                }
 752                return ret;
 753        }
 754
 755        if (WARN_ON_ONCE(!attr->show))
 756                return -EPERM;
 757
 758        return single_open(file, blk_mq_debugfs_show, inode->i_private);
 759}
 760
 761static int blk_mq_debugfs_release(struct inode *inode, struct file *file)
 762{
 763        const struct blk_mq_debugfs_attr *attr = inode->i_private;
 764
 765        if (attr->show)
 766                return single_release(inode, file);
 767        else
 768                return seq_release(inode, file);
 769}
 770
 771static const struct file_operations blk_mq_debugfs_fops = {
 772        .open           = blk_mq_debugfs_open,
 773        .read           = seq_read,
 774        .write          = blk_mq_debugfs_write,
 775        .llseek         = seq_lseek,
 776        .release        = blk_mq_debugfs_release,
 777};
 778
 779static const struct blk_mq_debugfs_attr blk_mq_debugfs_hctx_attrs[] = {
 780        {"state", 0400, hctx_state_show},
 781        {"flags", 0400, hctx_flags_show},
 782        {"dispatch", 0400, .seq_ops = &hctx_dispatch_seq_ops},
 783        {"busy", 0400, hctx_busy_show},
 784        {"ctx_map", 0400, hctx_ctx_map_show},
 785        {"tags", 0400, hctx_tags_show},
 786        {"tags_bitmap", 0400, hctx_tags_bitmap_show},
 787        {"sched_tags", 0400, hctx_sched_tags_show},
 788        {"sched_tags_bitmap", 0400, hctx_sched_tags_bitmap_show},
 789        {"io_poll", 0600, hctx_io_poll_show, hctx_io_poll_write},
 790        {"dispatched", 0600, hctx_dispatched_show, hctx_dispatched_write},
 791        {"queued", 0600, hctx_queued_show, hctx_queued_write},
 792        {"run", 0600, hctx_run_show, hctx_run_write},
 793        {"active", 0400, hctx_active_show},
 794        {"dispatch_busy", 0400, hctx_dispatch_busy_show},
 795        {},
 796};
 797
 798static const struct blk_mq_debugfs_attr blk_mq_debugfs_ctx_attrs[] = {
 799        {"rq_list", 0400, .seq_ops = &ctx_rq_list_seq_ops},
 800        {"dispatched", 0600, ctx_dispatched_show, ctx_dispatched_write},
 801        {"merged", 0600, ctx_merged_show, ctx_merged_write},
 802        {"completed", 0600, ctx_completed_show, ctx_completed_write},
 803        {},
 804};
 805
 806static bool debugfs_create_files(struct dentry *parent, void *data,
 807                                 const struct blk_mq_debugfs_attr *attr)
 808{
 809        d_inode(parent)->i_private = data;
 810
 811        for (; attr->name; attr++) {
 812                if (!debugfs_create_file(attr->name, attr->mode, parent,
 813                                         (void *)attr, &blk_mq_debugfs_fops))
 814                        return false;
 815        }
 816        return true;
 817}
 818
 819int blk_mq_debugfs_register(struct request_queue *q)
 820{
 821        struct blk_mq_hw_ctx *hctx;
 822        int i;
 823
 824        if (!blk_debugfs_root)
 825                return -ENOENT;
 826
 827        q->debugfs_dir = debugfs_create_dir(kobject_name(q->kobj.parent),
 828                                            blk_debugfs_root);
 829        if (!q->debugfs_dir)
 830                return -ENOMEM;
 831
 832        if (!debugfs_create_files(q->debugfs_dir, q,
 833                                  blk_mq_debugfs_queue_attrs))
 834                goto err;
 835
 836        /*
 837         * blk_mq_init_sched() attempted to do this already, but q->debugfs_dir
 838         * didn't exist yet (because we don't know what to name the directory
 839         * until the queue is registered to a gendisk).
 840         */
 841        if (q->elevator && !q->sched_debugfs_dir)
 842                blk_mq_debugfs_register_sched(q);
 843
 844        /* Similarly, blk_mq_init_hctx() couldn't do this previously. */
 845        queue_for_each_hw_ctx(q, hctx, i) {
 846                if (!hctx->debugfs_dir && blk_mq_debugfs_register_hctx(q, hctx))
 847                        goto err;
 848                if (q->elevator && !hctx->sched_debugfs_dir &&
 849                    blk_mq_debugfs_register_sched_hctx(q, hctx))
 850                        goto err;
 851        }
 852
 853        return 0;
 854
 855err:
 856        blk_mq_debugfs_unregister(q);
 857        return -ENOMEM;
 858}
 859
 860void blk_mq_debugfs_unregister(struct request_queue *q)
 861{
 862        debugfs_remove_recursive(q->debugfs_dir);
 863        q->sched_debugfs_dir = NULL;
 864        q->debugfs_dir = NULL;
 865}
 866
 867static int blk_mq_debugfs_register_ctx(struct blk_mq_hw_ctx *hctx,
 868                                       struct blk_mq_ctx *ctx)
 869{
 870        struct dentry *ctx_dir;
 871        char name[20];
 872
 873        snprintf(name, sizeof(name), "cpu%u", ctx->cpu);
 874        ctx_dir = debugfs_create_dir(name, hctx->debugfs_dir);
 875        if (!ctx_dir)
 876                return -ENOMEM;
 877
 878        if (!debugfs_create_files(ctx_dir, ctx, blk_mq_debugfs_ctx_attrs))
 879                return -ENOMEM;
 880
 881        return 0;
 882}
 883
 884int blk_mq_debugfs_register_hctx(struct request_queue *q,
 885                                 struct blk_mq_hw_ctx *hctx)
 886{
 887        struct blk_mq_ctx *ctx;
 888        char name[20];
 889        int i;
 890
 891        if (!q->debugfs_dir)
 892                return -ENOENT;
 893
 894        snprintf(name, sizeof(name), "hctx%u", hctx->queue_num);
 895        hctx->debugfs_dir = debugfs_create_dir(name, q->debugfs_dir);
 896        if (!hctx->debugfs_dir)
 897                return -ENOMEM;
 898
 899        if (!debugfs_create_files(hctx->debugfs_dir, hctx,
 900                                  blk_mq_debugfs_hctx_attrs))
 901                goto err;
 902
 903        hctx_for_each_ctx(hctx, ctx, i) {
 904                if (blk_mq_debugfs_register_ctx(hctx, ctx))
 905                        goto err;
 906        }
 907
 908        return 0;
 909
 910err:
 911        blk_mq_debugfs_unregister_hctx(hctx);
 912        return -ENOMEM;
 913}
 914
 915void blk_mq_debugfs_unregister_hctx(struct blk_mq_hw_ctx *hctx)
 916{
 917        debugfs_remove_recursive(hctx->debugfs_dir);
 918        hctx->sched_debugfs_dir = NULL;
 919        hctx->debugfs_dir = NULL;
 920}
 921
 922int blk_mq_debugfs_register_hctxs(struct request_queue *q)
 923{
 924        struct blk_mq_hw_ctx *hctx;
 925        int i;
 926
 927        queue_for_each_hw_ctx(q, hctx, i) {
 928                if (blk_mq_debugfs_register_hctx(q, hctx))
 929                        return -ENOMEM;
 930        }
 931
 932        return 0;
 933}
 934
 935void blk_mq_debugfs_unregister_hctxs(struct request_queue *q)
 936{
 937        struct blk_mq_hw_ctx *hctx;
 938        int i;
 939
 940        queue_for_each_hw_ctx(q, hctx, i)
 941                blk_mq_debugfs_unregister_hctx(hctx);
 942}
 943
 944int blk_mq_debugfs_register_sched(struct request_queue *q)
 945{
 946        struct elevator_type *e = q->elevator->type;
 947
 948        if (!q->debugfs_dir)
 949                return -ENOENT;
 950
 951        if (!e->queue_debugfs_attrs)
 952                return 0;
 953
 954        q->sched_debugfs_dir = debugfs_create_dir("sched", q->debugfs_dir);
 955        if (!q->sched_debugfs_dir)
 956                return -ENOMEM;
 957
 958        if (!debugfs_create_files(q->sched_debugfs_dir, q,
 959                                  e->queue_debugfs_attrs))
 960                goto err;
 961
 962        return 0;
 963
 964err:
 965        blk_mq_debugfs_unregister_sched(q);
 966        return -ENOMEM;
 967}
 968
 969void blk_mq_debugfs_unregister_sched(struct request_queue *q)
 970{
 971        debugfs_remove_recursive(q->sched_debugfs_dir);
 972        q->sched_debugfs_dir = NULL;
 973}
 974
 975int blk_mq_debugfs_register_sched_hctx(struct request_queue *q,
 976                                       struct blk_mq_hw_ctx *hctx)
 977{
 978        struct elevator_type *e = q->elevator->type;
 979
 980        if (!hctx->debugfs_dir)
 981                return -ENOENT;
 982
 983        if (!e->hctx_debugfs_attrs)
 984                return 0;
 985
 986        hctx->sched_debugfs_dir = debugfs_create_dir("sched",
 987                                                     hctx->debugfs_dir);
 988        if (!hctx->sched_debugfs_dir)
 989                return -ENOMEM;
 990
 991        if (!debugfs_create_files(hctx->sched_debugfs_dir, hctx,
 992                                  e->hctx_debugfs_attrs))
 993                return -ENOMEM;
 994
 995        return 0;
 996}
 997
 998void blk_mq_debugfs_unregister_sched_hctx(struct blk_mq_hw_ctx *hctx)
 999{
1000        debugfs_remove_recursive(hctx->sched_debugfs_dir);
1001        hctx->sched_debugfs_dir = NULL;
1002}
1003