1 #include <linux/kernel.h> 2 #include <linux/module.h> 3 #include <linux/backing-dev.h> 4 #include <linux/bio.h> 5 #include <linux/blkdev.h> 6 #include <linux/mm.h> 7 #include <linux/init.h> 8 #include <linux/slab.h> 9 #include <linux/workqueue.h> 10 #include <linux/smp.h> 11 12 #include <linux/blk-mq.h> 13 #include "blk-mq.h" 14 #include "blk-mq-tag.h" 15 16 static void blk_mq_sysfs_release(struct kobject *kobj) 17 { 18 } 19 20 struct blk_mq_ctx_sysfs_entry { 21 struct attribute attr; 22 ssize_t (*show)(struct blk_mq_ctx *, char *); 23 ssize_t (*store)(struct blk_mq_ctx *, const char *, size_t); 24 }; 25 26 struct blk_mq_hw_ctx_sysfs_entry { 27 struct attribute attr; 28 ssize_t (*show)(struct blk_mq_hw_ctx *, char *); 29 ssize_t (*store)(struct blk_mq_hw_ctx *, const char *, size_t); 30 }; 31 32 static ssize_t blk_mq_sysfs_show(struct kobject *kobj, struct attribute *attr, 33 char *page) 34 { 35 struct blk_mq_ctx_sysfs_entry *entry; 36 struct blk_mq_ctx *ctx; 37 struct request_queue *q; 38 ssize_t res; 39 40 entry = container_of(attr, struct blk_mq_ctx_sysfs_entry, attr); 41 ctx = container_of(kobj, struct blk_mq_ctx, kobj); 42 q = ctx->queue; 43 44 if (!entry->show) 45 return -EIO; 46 47 res = -ENOENT; 48 mutex_lock(&q->sysfs_lock); 49 if (!blk_queue_dying(q)) 50 res = entry->show(ctx, page); 51 mutex_unlock(&q->sysfs_lock); 52 return res; 53 } 54 55 static ssize_t blk_mq_sysfs_store(struct kobject *kobj, struct attribute *attr, 56 const char *page, size_t length) 57 { 58 struct blk_mq_ctx_sysfs_entry *entry; 59 struct blk_mq_ctx *ctx; 60 struct request_queue *q; 61 ssize_t res; 62 63 entry = container_of(attr, struct blk_mq_ctx_sysfs_entry, attr); 64 ctx = container_of(kobj, struct blk_mq_ctx, kobj); 65 q = ctx->queue; 66 67 if (!entry->store) 68 return -EIO; 69 70 res = -ENOENT; 71 mutex_lock(&q->sysfs_lock); 72 if (!blk_queue_dying(q)) 73 res = entry->store(ctx, page, length); 74 mutex_unlock(&q->sysfs_lock); 75 return res; 76 } 77 78 static ssize_t blk_mq_hw_sysfs_show(struct kobject *kobj, 79 struct attribute *attr, char *page) 80 { 81 struct blk_mq_hw_ctx_sysfs_entry *entry; 82 struct blk_mq_hw_ctx *hctx; 83 struct request_queue *q; 84 ssize_t res; 85 86 entry = container_of(attr, struct blk_mq_hw_ctx_sysfs_entry, attr); 87 hctx = container_of(kobj, struct blk_mq_hw_ctx, kobj); 88 q = hctx->queue; 89 90 if (!entry->show) 91 return -EIO; 92 93 res = -ENOENT; 94 mutex_lock(&q->sysfs_lock); 95 if (!blk_queue_dying(q)) 96 res = entry->show(hctx, page); 97 mutex_unlock(&q->sysfs_lock); 98 return res; 99 } 100 101 static ssize_t blk_mq_hw_sysfs_store(struct kobject *kobj, 102 struct attribute *attr, const char *page, 103 size_t length) 104 { 105 struct blk_mq_hw_ctx_sysfs_entry *entry; 106 struct blk_mq_hw_ctx *hctx; 107 struct request_queue *q; 108 ssize_t res; 109 110 entry = container_of(attr, struct blk_mq_hw_ctx_sysfs_entry, attr); 111 hctx = container_of(kobj, struct blk_mq_hw_ctx, kobj); 112 q = hctx->queue; 113 114 if (!entry->store) 115 return -EIO; 116 117 res = -ENOENT; 118 mutex_lock(&q->sysfs_lock); 119 if (!blk_queue_dying(q)) 120 res = entry->store(hctx, page, length); 121 mutex_unlock(&q->sysfs_lock); 122 return res; 123 } 124 125 static ssize_t blk_mq_sysfs_dispatched_show(struct blk_mq_ctx *ctx, char *page) 126 { 127 return sprintf(page, "%lu %lu\n", ctx->rq_dispatched[1], 128 ctx->rq_dispatched[0]); 129 } 130 131 static ssize_t blk_mq_sysfs_merged_show(struct blk_mq_ctx *ctx, char *page) 132 { 133 return sprintf(page, "%lu\n", ctx->rq_merged); 134 } 135 136 static ssize_t blk_mq_sysfs_completed_show(struct blk_mq_ctx *ctx, char *page) 137 { 138 return sprintf(page, "%lu %lu\n", ctx->rq_completed[1], 139 ctx->rq_completed[0]); 140 } 141 142 static ssize_t sysfs_list_show(char *page, struct list_head *list, char *msg) 143 { 144 struct request *rq; 145 int len = snprintf(page, PAGE_SIZE - 1, "%s:\n", msg); 146 147 list_for_each_entry(rq, list, queuelist) { 148 const int rq_len = 2 * sizeof(rq) + 2; 149 150 /* if the output will be truncated */ 151 if (PAGE_SIZE - 1 < len + rq_len) { 152 /* backspacing if it can't hold '\t...\n' */ 153 if (PAGE_SIZE - 1 < len + 5) 154 len -= rq_len; 155 len += snprintf(page + len, PAGE_SIZE - 1 - len, 156 "\t...\n"); 157 break; 158 } 159 len += snprintf(page + len, PAGE_SIZE - 1 - len, 160 "\t%p\n", rq); 161 } 162 163 return len; 164 } 165 166 static ssize_t blk_mq_sysfs_rq_list_show(struct blk_mq_ctx *ctx, char *page) 167 { 168 ssize_t ret; 169 170 spin_lock(&ctx->lock); 171 ret = sysfs_list_show(page, &ctx->rq_list, "CTX pending"); 172 spin_unlock(&ctx->lock); 173 174 return ret; 175 } 176 177 static ssize_t blk_mq_hw_sysfs_poll_show(struct blk_mq_hw_ctx *hctx, char *page) 178 { 179 return sprintf(page, "considered=%lu, invoked=%lu, success=%lu\n", 180 hctx->poll_considered, hctx->poll_invoked, 181 hctx->poll_success); 182 } 183 184 static ssize_t blk_mq_hw_sysfs_poll_store(struct blk_mq_hw_ctx *hctx, 185 const char *page, size_t size) 186 { 187 hctx->poll_considered = hctx->poll_invoked = hctx->poll_success = 0; 188 189 return size; 190 } 191 192 static ssize_t blk_mq_hw_sysfs_queued_show(struct blk_mq_hw_ctx *hctx, 193 char *page) 194 { 195 return sprintf(page, "%lu\n", hctx->queued); 196 } 197 198 static ssize_t blk_mq_hw_sysfs_run_show(struct blk_mq_hw_ctx *hctx, char *page) 199 { 200 return sprintf(page, "%lu\n", hctx->run); 201 } 202 203 static ssize_t blk_mq_hw_sysfs_dispatched_show(struct blk_mq_hw_ctx *hctx, 204 char *page) 205 { 206 char *start_page = page; 207 int i; 208 209 page += sprintf(page, "%8u\t%lu\n", 0U, hctx->dispatched[0]); 210 211 for (i = 1; i < BLK_MQ_MAX_DISPATCH_ORDER - 1; i++) { 212 unsigned int d = 1U << (i - 1); 213 214 page += sprintf(page, "%8u\t%lu\n", d, hctx->dispatched[i]); 215 } 216 217 page += sprintf(page, "%8u+\t%lu\n", 1U << (i - 1), 218 hctx->dispatched[i]); 219 return page - start_page; 220 } 221 222 static ssize_t blk_mq_hw_sysfs_rq_list_show(struct blk_mq_hw_ctx *hctx, 223 char *page) 224 { 225 ssize_t ret; 226 227 spin_lock(&hctx->lock); 228 ret = sysfs_list_show(page, &hctx->dispatch, "HCTX pending"); 229 spin_unlock(&hctx->lock); 230 231 return ret; 232 } 233 234 static ssize_t blk_mq_hw_sysfs_tags_show(struct blk_mq_hw_ctx *hctx, char *page) 235 { 236 return blk_mq_tag_sysfs_show(hctx->tags, page); 237 } 238 239 static ssize_t blk_mq_hw_sysfs_active_show(struct blk_mq_hw_ctx *hctx, char *page) 240 { 241 return sprintf(page, "%u\n", atomic_read(&hctx->nr_active)); 242 } 243 244 static ssize_t blk_mq_hw_sysfs_cpus_show(struct blk_mq_hw_ctx *hctx, char *page) 245 { 246 unsigned int i, first = 1; 247 ssize_t ret = 0; 248 249 for_each_cpu(i, hctx->cpumask) { 250 if (first) 251 ret += sprintf(ret + page, "%u", i); 252 else 253 ret += sprintf(ret + page, ", %u", i); 254 255 first = 0; 256 } 257 258 ret += sprintf(ret + page, "\n"); 259 return ret; 260 } 261 262 static void blk_mq_stat_clear(struct blk_mq_hw_ctx *hctx) 263 { 264 struct blk_mq_ctx *ctx; 265 unsigned int i; 266 267 hctx_for_each_ctx(hctx, ctx, i) { 268 blk_stat_init(&ctx->stat[BLK_STAT_READ]); 269 blk_stat_init(&ctx->stat[BLK_STAT_WRITE]); 270 } 271 } 272 273 static ssize_t blk_mq_hw_sysfs_stat_store(struct blk_mq_hw_ctx *hctx, 274 const char *page, size_t count) 275 { 276 blk_mq_stat_clear(hctx); 277 return count; 278 } 279 280 static ssize_t print_stat(char *page, struct blk_rq_stat *stat, const char *pre) 281 { 282 return sprintf(page, "%s samples=%llu, mean=%lld, min=%lld, max=%lld\n", 283 pre, (long long) stat->nr_samples, 284 (long long) stat->mean, (long long) stat->min, 285 (long long) stat->max); 286 } 287 288 static ssize_t blk_mq_hw_sysfs_stat_show(struct blk_mq_hw_ctx *hctx, char *page) 289 { 290 struct blk_rq_stat stat[2]; 291 ssize_t ret; 292 293 blk_stat_init(&stat[BLK_STAT_READ]); 294 blk_stat_init(&stat[BLK_STAT_WRITE]); 295 296 blk_hctx_stat_get(hctx, stat); 297 298 ret = print_stat(page, &stat[BLK_STAT_READ], "read :"); 299 ret += print_stat(page + ret, &stat[BLK_STAT_WRITE], "write:"); 300 return ret; 301 } 302 303 static struct blk_mq_ctx_sysfs_entry blk_mq_sysfs_dispatched = { 304 .attr = {.name = "dispatched", .mode = S_IRUGO }, 305 .show = blk_mq_sysfs_dispatched_show, 306 }; 307 static struct blk_mq_ctx_sysfs_entry blk_mq_sysfs_merged = { 308 .attr = {.name = "merged", .mode = S_IRUGO }, 309 .show = blk_mq_sysfs_merged_show, 310 }; 311 static struct blk_mq_ctx_sysfs_entry blk_mq_sysfs_completed = { 312 .attr = {.name = "completed", .mode = S_IRUGO }, 313 .show = blk_mq_sysfs_completed_show, 314 }; 315 static struct blk_mq_ctx_sysfs_entry blk_mq_sysfs_rq_list = { 316 .attr = {.name = "rq_list", .mode = S_IRUGO }, 317 .show = blk_mq_sysfs_rq_list_show, 318 }; 319 320 static struct attribute *default_ctx_attrs[] = { 321 &blk_mq_sysfs_dispatched.attr, 322 &blk_mq_sysfs_merged.attr, 323 &blk_mq_sysfs_completed.attr, 324 &blk_mq_sysfs_rq_list.attr, 325 NULL, 326 }; 327 328 static struct blk_mq_hw_ctx_sysfs_entry blk_mq_hw_sysfs_queued = { 329 .attr = {.name = "queued", .mode = S_IRUGO }, 330 .show = blk_mq_hw_sysfs_queued_show, 331 }; 332 static struct blk_mq_hw_ctx_sysfs_entry blk_mq_hw_sysfs_run = { 333 .attr = {.name = "run", .mode = S_IRUGO }, 334 .show = blk_mq_hw_sysfs_run_show, 335 }; 336 static struct blk_mq_hw_ctx_sysfs_entry blk_mq_hw_sysfs_dispatched = { 337 .attr = {.name = "dispatched", .mode = S_IRUGO }, 338 .show = blk_mq_hw_sysfs_dispatched_show, 339 }; 340 static struct blk_mq_hw_ctx_sysfs_entry blk_mq_hw_sysfs_active = { 341 .attr = {.name = "active", .mode = S_IRUGO }, 342 .show = blk_mq_hw_sysfs_active_show, 343 }; 344 static struct blk_mq_hw_ctx_sysfs_entry blk_mq_hw_sysfs_pending = { 345 .attr = {.name = "pending", .mode = S_IRUGO }, 346 .show = blk_mq_hw_sysfs_rq_list_show, 347 }; 348 static struct blk_mq_hw_ctx_sysfs_entry blk_mq_hw_sysfs_tags = { 349 .attr = {.name = "tags", .mode = S_IRUGO }, 350 .show = blk_mq_hw_sysfs_tags_show, 351 }; 352 static struct blk_mq_hw_ctx_sysfs_entry blk_mq_hw_sysfs_cpus = { 353 .attr = {.name = "cpu_list", .mode = S_IRUGO }, 354 .show = blk_mq_hw_sysfs_cpus_show, 355 }; 356 static struct blk_mq_hw_ctx_sysfs_entry blk_mq_hw_sysfs_poll = { 357 .attr = {.name = "io_poll", .mode = S_IWUSR | S_IRUGO }, 358 .show = blk_mq_hw_sysfs_poll_show, 359 .store = blk_mq_hw_sysfs_poll_store, 360 }; 361 static struct blk_mq_hw_ctx_sysfs_entry blk_mq_hw_sysfs_stat = { 362 .attr = {.name = "stats", .mode = S_IRUGO | S_IWUSR }, 363 .show = blk_mq_hw_sysfs_stat_show, 364 .store = blk_mq_hw_sysfs_stat_store, 365 }; 366 367 static struct attribute *default_hw_ctx_attrs[] = { 368 &blk_mq_hw_sysfs_queued.attr, 369 &blk_mq_hw_sysfs_run.attr, 370 &blk_mq_hw_sysfs_dispatched.attr, 371 &blk_mq_hw_sysfs_pending.attr, 372 &blk_mq_hw_sysfs_tags.attr, 373 &blk_mq_hw_sysfs_cpus.attr, 374 &blk_mq_hw_sysfs_active.attr, 375 &blk_mq_hw_sysfs_poll.attr, 376 &blk_mq_hw_sysfs_stat.attr, 377 NULL, 378 }; 379 380 static const struct sysfs_ops blk_mq_sysfs_ops = { 381 .show = blk_mq_sysfs_show, 382 .store = blk_mq_sysfs_store, 383 }; 384 385 static const struct sysfs_ops blk_mq_hw_sysfs_ops = { 386 .show = blk_mq_hw_sysfs_show, 387 .store = blk_mq_hw_sysfs_store, 388 }; 389 390 static struct kobj_type blk_mq_ktype = { 391 .sysfs_ops = &blk_mq_sysfs_ops, 392 .release = blk_mq_sysfs_release, 393 }; 394 395 static struct kobj_type blk_mq_ctx_ktype = { 396 .sysfs_ops = &blk_mq_sysfs_ops, 397 .default_attrs = default_ctx_attrs, 398 .release = blk_mq_sysfs_release, 399 }; 400 401 static struct kobj_type blk_mq_hw_ktype = { 402 .sysfs_ops = &blk_mq_hw_sysfs_ops, 403 .default_attrs = default_hw_ctx_attrs, 404 .release = blk_mq_sysfs_release, 405 }; 406 407 static void blk_mq_unregister_hctx(struct blk_mq_hw_ctx *hctx) 408 { 409 struct blk_mq_ctx *ctx; 410 int i; 411 412 if (!hctx->nr_ctx) 413 return; 414 415 hctx_for_each_ctx(hctx, ctx, i) 416 kobject_del(&ctx->kobj); 417 418 kobject_del(&hctx->kobj); 419 } 420 421 static int blk_mq_register_hctx(struct blk_mq_hw_ctx *hctx) 422 { 423 struct request_queue *q = hctx->queue; 424 struct blk_mq_ctx *ctx; 425 int i, ret; 426 427 if (!hctx->nr_ctx) 428 return 0; 429 430 ret = kobject_add(&hctx->kobj, &q->mq_kobj, "%u", hctx->queue_num); 431 if (ret) 432 return ret; 433 434 hctx_for_each_ctx(hctx, ctx, i) { 435 ret = kobject_add(&ctx->kobj, &hctx->kobj, "cpu%u", ctx->cpu); 436 if (ret) 437 break; 438 } 439 440 return ret; 441 } 442 443 static void __blk_mq_unregister_dev(struct device *dev, struct request_queue *q) 444 { 445 struct blk_mq_hw_ctx *hctx; 446 struct blk_mq_ctx *ctx; 447 int i, j; 448 449 queue_for_each_hw_ctx(q, hctx, i) { 450 blk_mq_unregister_hctx(hctx); 451 452 hctx_for_each_ctx(hctx, ctx, j) 453 kobject_put(&ctx->kobj); 454 455 kobject_put(&hctx->kobj); 456 } 457 458 kobject_uevent(&q->mq_kobj, KOBJ_REMOVE); 459 kobject_del(&q->mq_kobj); 460 kobject_put(&q->mq_kobj); 461 462 kobject_put(&dev->kobj); 463 464 q->mq_sysfs_init_done = false; 465 } 466 467 void blk_mq_unregister_dev(struct device *dev, struct request_queue *q) 468 { 469 blk_mq_disable_hotplug(); 470 __blk_mq_unregister_dev(dev, q); 471 blk_mq_enable_hotplug(); 472 } 473 474 void blk_mq_hctx_kobj_init(struct blk_mq_hw_ctx *hctx) 475 { 476 kobject_init(&hctx->kobj, &blk_mq_hw_ktype); 477 } 478 479 static void blk_mq_sysfs_init(struct request_queue *q) 480 { 481 struct blk_mq_ctx *ctx; 482 int cpu; 483 484 kobject_init(&q->mq_kobj, &blk_mq_ktype); 485 486 for_each_possible_cpu(cpu) { 487 ctx = per_cpu_ptr(q->queue_ctx, cpu); 488 kobject_init(&ctx->kobj, &blk_mq_ctx_ktype); 489 } 490 } 491 492 int blk_mq_register_dev(struct device *dev, struct request_queue *q) 493 { 494 struct blk_mq_hw_ctx *hctx; 495 int ret, i; 496 497 blk_mq_disable_hotplug(); 498 499 blk_mq_sysfs_init(q); 500 501 ret = kobject_add(&q->mq_kobj, kobject_get(&dev->kobj), "%s", "mq"); 502 if (ret < 0) 503 goto out; 504 505 kobject_uevent(&q->mq_kobj, KOBJ_ADD); 506 507 queue_for_each_hw_ctx(q, hctx, i) { 508 ret = blk_mq_register_hctx(hctx); 509 if (ret) 510 break; 511 } 512 513 if (ret) 514 __blk_mq_unregister_dev(dev, q); 515 else 516 q->mq_sysfs_init_done = true; 517 out: 518 blk_mq_enable_hotplug(); 519 520 return ret; 521 } 522 EXPORT_SYMBOL_GPL(blk_mq_register_dev); 523 524 void blk_mq_sysfs_unregister(struct request_queue *q) 525 { 526 struct blk_mq_hw_ctx *hctx; 527 int i; 528 529 if (!q->mq_sysfs_init_done) 530 return; 531 532 queue_for_each_hw_ctx(q, hctx, i) 533 blk_mq_unregister_hctx(hctx); 534 } 535 536 int blk_mq_sysfs_register(struct request_queue *q) 537 { 538 struct blk_mq_hw_ctx *hctx; 539 int i, ret = 0; 540 541 if (!q->mq_sysfs_init_done) 542 return ret; 543 544 queue_for_each_hw_ctx(q, hctx, i) { 545 ret = blk_mq_register_hctx(hctx); 546 if (ret) 547 break; 548 } 549 550 return ret; 551 } 552