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_queued_show(struct blk_mq_hw_ctx *hctx, 178 char *page) 179 { 180 return sprintf(page, "%lu\n", hctx->queued); 181 } 182 183 static ssize_t blk_mq_hw_sysfs_run_show(struct blk_mq_hw_ctx *hctx, char *page) 184 { 185 return sprintf(page, "%lu\n", hctx->run); 186 } 187 188 static ssize_t blk_mq_hw_sysfs_dispatched_show(struct blk_mq_hw_ctx *hctx, 189 char *page) 190 { 191 char *start_page = page; 192 int i; 193 194 page += sprintf(page, "%8u\t%lu\n", 0U, hctx->dispatched[0]); 195 196 for (i = 1; i < BLK_MQ_MAX_DISPATCH_ORDER; i++) { 197 unsigned long d = 1U << (i - 1); 198 199 page += sprintf(page, "%8lu\t%lu\n", d, hctx->dispatched[i]); 200 } 201 202 return page - start_page; 203 } 204 205 static ssize_t blk_mq_hw_sysfs_rq_list_show(struct blk_mq_hw_ctx *hctx, 206 char *page) 207 { 208 ssize_t ret; 209 210 spin_lock(&hctx->lock); 211 ret = sysfs_list_show(page, &hctx->dispatch, "HCTX pending"); 212 spin_unlock(&hctx->lock); 213 214 return ret; 215 } 216 217 static ssize_t blk_mq_hw_sysfs_tags_show(struct blk_mq_hw_ctx *hctx, char *page) 218 { 219 return blk_mq_tag_sysfs_show(hctx->tags, page); 220 } 221 222 static ssize_t blk_mq_hw_sysfs_active_show(struct blk_mq_hw_ctx *hctx, char *page) 223 { 224 return sprintf(page, "%u\n", atomic_read(&hctx->nr_active)); 225 } 226 227 static ssize_t blk_mq_hw_sysfs_cpus_show(struct blk_mq_hw_ctx *hctx, char *page) 228 { 229 unsigned int i, first = 1; 230 ssize_t ret = 0; 231 232 for_each_cpu(i, hctx->cpumask) { 233 if (first) 234 ret += sprintf(ret + page, "%u", i); 235 else 236 ret += sprintf(ret + page, ", %u", i); 237 238 first = 0; 239 } 240 241 ret += sprintf(ret + page, "\n"); 242 return ret; 243 } 244 245 static struct blk_mq_ctx_sysfs_entry blk_mq_sysfs_dispatched = { 246 .attr = {.name = "dispatched", .mode = S_IRUGO }, 247 .show = blk_mq_sysfs_dispatched_show, 248 }; 249 static struct blk_mq_ctx_sysfs_entry blk_mq_sysfs_merged = { 250 .attr = {.name = "merged", .mode = S_IRUGO }, 251 .show = blk_mq_sysfs_merged_show, 252 }; 253 static struct blk_mq_ctx_sysfs_entry blk_mq_sysfs_completed = { 254 .attr = {.name = "completed", .mode = S_IRUGO }, 255 .show = blk_mq_sysfs_completed_show, 256 }; 257 static struct blk_mq_ctx_sysfs_entry blk_mq_sysfs_rq_list = { 258 .attr = {.name = "rq_list", .mode = S_IRUGO }, 259 .show = blk_mq_sysfs_rq_list_show, 260 }; 261 262 static struct attribute *default_ctx_attrs[] = { 263 &blk_mq_sysfs_dispatched.attr, 264 &blk_mq_sysfs_merged.attr, 265 &blk_mq_sysfs_completed.attr, 266 &blk_mq_sysfs_rq_list.attr, 267 NULL, 268 }; 269 270 static struct blk_mq_hw_ctx_sysfs_entry blk_mq_hw_sysfs_queued = { 271 .attr = {.name = "queued", .mode = S_IRUGO }, 272 .show = blk_mq_hw_sysfs_queued_show, 273 }; 274 static struct blk_mq_hw_ctx_sysfs_entry blk_mq_hw_sysfs_run = { 275 .attr = {.name = "run", .mode = S_IRUGO }, 276 .show = blk_mq_hw_sysfs_run_show, 277 }; 278 static struct blk_mq_hw_ctx_sysfs_entry blk_mq_hw_sysfs_dispatched = { 279 .attr = {.name = "dispatched", .mode = S_IRUGO }, 280 .show = blk_mq_hw_sysfs_dispatched_show, 281 }; 282 static struct blk_mq_hw_ctx_sysfs_entry blk_mq_hw_sysfs_active = { 283 .attr = {.name = "active", .mode = S_IRUGO }, 284 .show = blk_mq_hw_sysfs_active_show, 285 }; 286 static struct blk_mq_hw_ctx_sysfs_entry blk_mq_hw_sysfs_pending = { 287 .attr = {.name = "pending", .mode = S_IRUGO }, 288 .show = blk_mq_hw_sysfs_rq_list_show, 289 }; 290 static struct blk_mq_hw_ctx_sysfs_entry blk_mq_hw_sysfs_tags = { 291 .attr = {.name = "tags", .mode = S_IRUGO }, 292 .show = blk_mq_hw_sysfs_tags_show, 293 }; 294 static struct blk_mq_hw_ctx_sysfs_entry blk_mq_hw_sysfs_cpus = { 295 .attr = {.name = "cpu_list", .mode = S_IRUGO }, 296 .show = blk_mq_hw_sysfs_cpus_show, 297 }; 298 299 static struct attribute *default_hw_ctx_attrs[] = { 300 &blk_mq_hw_sysfs_queued.attr, 301 &blk_mq_hw_sysfs_run.attr, 302 &blk_mq_hw_sysfs_dispatched.attr, 303 &blk_mq_hw_sysfs_pending.attr, 304 &blk_mq_hw_sysfs_tags.attr, 305 &blk_mq_hw_sysfs_cpus.attr, 306 &blk_mq_hw_sysfs_active.attr, 307 NULL, 308 }; 309 310 static const struct sysfs_ops blk_mq_sysfs_ops = { 311 .show = blk_mq_sysfs_show, 312 .store = blk_mq_sysfs_store, 313 }; 314 315 static const struct sysfs_ops blk_mq_hw_sysfs_ops = { 316 .show = blk_mq_hw_sysfs_show, 317 .store = blk_mq_hw_sysfs_store, 318 }; 319 320 static struct kobj_type blk_mq_ktype = { 321 .sysfs_ops = &blk_mq_sysfs_ops, 322 .release = blk_mq_sysfs_release, 323 }; 324 325 static struct kobj_type blk_mq_ctx_ktype = { 326 .sysfs_ops = &blk_mq_sysfs_ops, 327 .default_attrs = default_ctx_attrs, 328 .release = blk_mq_sysfs_release, 329 }; 330 331 static struct kobj_type blk_mq_hw_ktype = { 332 .sysfs_ops = &blk_mq_hw_sysfs_ops, 333 .default_attrs = default_hw_ctx_attrs, 334 .release = blk_mq_sysfs_release, 335 }; 336 337 static void blk_mq_unregister_hctx(struct blk_mq_hw_ctx *hctx) 338 { 339 struct blk_mq_ctx *ctx; 340 int i; 341 342 if (!hctx->nr_ctx) 343 return; 344 345 hctx_for_each_ctx(hctx, ctx, i) 346 kobject_del(&ctx->kobj); 347 348 kobject_del(&hctx->kobj); 349 } 350 351 static int blk_mq_register_hctx(struct blk_mq_hw_ctx *hctx) 352 { 353 struct request_queue *q = hctx->queue; 354 struct blk_mq_ctx *ctx; 355 int i, ret; 356 357 if (!hctx->nr_ctx) 358 return 0; 359 360 ret = kobject_add(&hctx->kobj, &q->mq_kobj, "%u", hctx->queue_num); 361 if (ret) 362 return ret; 363 364 hctx_for_each_ctx(hctx, ctx, i) { 365 ret = kobject_add(&ctx->kobj, &hctx->kobj, "cpu%u", ctx->cpu); 366 if (ret) 367 break; 368 } 369 370 return ret; 371 } 372 373 void blk_mq_unregister_disk(struct gendisk *disk) 374 { 375 struct request_queue *q = disk->queue; 376 struct blk_mq_hw_ctx *hctx; 377 struct blk_mq_ctx *ctx; 378 int i, j; 379 380 blk_mq_disable_hotplug(); 381 382 queue_for_each_hw_ctx(q, hctx, i) { 383 blk_mq_unregister_hctx(hctx); 384 385 hctx_for_each_ctx(hctx, ctx, j) 386 kobject_put(&ctx->kobj); 387 388 kobject_put(&hctx->kobj); 389 } 390 391 kobject_uevent(&q->mq_kobj, KOBJ_REMOVE); 392 kobject_del(&q->mq_kobj); 393 kobject_put(&q->mq_kobj); 394 395 kobject_put(&disk_to_dev(disk)->kobj); 396 397 q->mq_sysfs_init_done = false; 398 blk_mq_enable_hotplug(); 399 } 400 401 static void blk_mq_sysfs_init(struct request_queue *q) 402 { 403 struct blk_mq_hw_ctx *hctx; 404 struct blk_mq_ctx *ctx; 405 int i; 406 407 kobject_init(&q->mq_kobj, &blk_mq_ktype); 408 409 queue_for_each_hw_ctx(q, hctx, i) 410 kobject_init(&hctx->kobj, &blk_mq_hw_ktype); 411 412 queue_for_each_ctx(q, ctx, i) 413 kobject_init(&ctx->kobj, &blk_mq_ctx_ktype); 414 } 415 416 /* see blk_register_queue() */ 417 void blk_mq_finish_init(struct request_queue *q) 418 { 419 percpu_ref_switch_to_percpu(&q->mq_usage_counter); 420 } 421 422 int blk_mq_register_disk(struct gendisk *disk) 423 { 424 struct device *dev = disk_to_dev(disk); 425 struct request_queue *q = disk->queue; 426 struct blk_mq_hw_ctx *hctx; 427 int ret, i; 428 429 blk_mq_disable_hotplug(); 430 431 blk_mq_sysfs_init(q); 432 433 ret = kobject_add(&q->mq_kobj, kobject_get(&dev->kobj), "%s", "mq"); 434 if (ret < 0) 435 goto out; 436 437 kobject_uevent(&q->mq_kobj, KOBJ_ADD); 438 439 queue_for_each_hw_ctx(q, hctx, i) { 440 ret = blk_mq_register_hctx(hctx); 441 if (ret) 442 break; 443 } 444 445 if (ret) 446 blk_mq_unregister_disk(disk); 447 else 448 q->mq_sysfs_init_done = true; 449 out: 450 blk_mq_enable_hotplug(); 451 452 return ret; 453 } 454 EXPORT_SYMBOL_GPL(blk_mq_register_disk); 455 456 void blk_mq_sysfs_unregister(struct request_queue *q) 457 { 458 struct blk_mq_hw_ctx *hctx; 459 int i; 460 461 if (!q->mq_sysfs_init_done) 462 return; 463 464 queue_for_each_hw_ctx(q, hctx, i) 465 blk_mq_unregister_hctx(hctx); 466 } 467 468 int blk_mq_sysfs_register(struct request_queue *q) 469 { 470 struct blk_mq_hw_ctx *hctx; 471 int i, ret = 0; 472 473 if (!q->mq_sysfs_init_done) 474 return ret; 475 476 queue_for_each_hw_ctx(q, hctx, i) { 477 ret = blk_mq_register_hctx(hctx); 478 if (ret) 479 break; 480 } 481 482 return ret; 483 } 484