linux/block/blk-sysfs.c
<<
>>
Prefs
   1/*
   2 * Functions related to sysfs handling
   3 */
   4#include <linux/kernel.h>
   5#include <linux/slab.h>
   6#include <linux/module.h>
   7#include <linux/bio.h>
   8#include <linux/blkdev.h>
   9#include <linux/blktrace_api.h>
  10
  11#include "blk.h"
  12#include "blk-cgroup.h"
  13
  14struct queue_sysfs_entry {
  15        struct attribute attr;
  16        ssize_t (*show)(struct request_queue *, char *);
  17        ssize_t (*store)(struct request_queue *, const char *, size_t);
  18};
  19
  20static ssize_t
  21queue_var_show(unsigned long var, char *page)
  22{
  23        return sprintf(page, "%lu\n", var);
  24}
  25
  26static ssize_t
  27queue_var_store(unsigned long *var, const char *page, size_t count)
  28{
  29        int err;
  30        unsigned long v;
  31
  32        err = strict_strtoul(page, 10, &v);
  33        if (err || v > UINT_MAX)
  34                return -EINVAL;
  35
  36        *var = v;
  37
  38        return count;
  39}
  40
  41static ssize_t queue_requests_show(struct request_queue *q, char *page)
  42{
  43        return queue_var_show(q->nr_requests, (page));
  44}
  45
  46static ssize_t
  47queue_requests_store(struct request_queue *q, const char *page, size_t count)
  48{
  49        struct request_list *rl;
  50        unsigned long nr;
  51        int ret;
  52
  53        if (!q->request_fn)
  54                return -EINVAL;
  55
  56        ret = queue_var_store(&nr, page, count);
  57        if (ret < 0)
  58                return ret;
  59
  60        if (nr < BLKDEV_MIN_RQ)
  61                nr = BLKDEV_MIN_RQ;
  62
  63        spin_lock_irq(q->queue_lock);
  64        q->nr_requests = nr;
  65        blk_queue_congestion_threshold(q);
  66
  67        /* congestion isn't cgroup aware and follows root blkcg for now */
  68        rl = &q->root_rl;
  69
  70        if (rl->count[BLK_RW_SYNC] >= queue_congestion_on_threshold(q))
  71                blk_set_queue_congested(q, BLK_RW_SYNC);
  72        else if (rl->count[BLK_RW_SYNC] < queue_congestion_off_threshold(q))
  73                blk_clear_queue_congested(q, BLK_RW_SYNC);
  74
  75        if (rl->count[BLK_RW_ASYNC] >= queue_congestion_on_threshold(q))
  76                blk_set_queue_congested(q, BLK_RW_ASYNC);
  77        else if (rl->count[BLK_RW_ASYNC] < queue_congestion_off_threshold(q))
  78                blk_clear_queue_congested(q, BLK_RW_ASYNC);
  79
  80        blk_queue_for_each_rl(rl, q) {
  81                if (rl->count[BLK_RW_SYNC] >= q->nr_requests) {
  82                        blk_set_rl_full(rl, BLK_RW_SYNC);
  83                } else {
  84                        blk_clear_rl_full(rl, BLK_RW_SYNC);
  85                        wake_up(&rl->wait[BLK_RW_SYNC]);
  86                }
  87
  88                if (rl->count[BLK_RW_ASYNC] >= q->nr_requests) {
  89                        blk_set_rl_full(rl, BLK_RW_ASYNC);
  90                } else {
  91                        blk_clear_rl_full(rl, BLK_RW_ASYNC);
  92                        wake_up(&rl->wait[BLK_RW_ASYNC]);
  93                }
  94        }
  95
  96        spin_unlock_irq(q->queue_lock);
  97        return ret;
  98}
  99
 100static ssize_t queue_ra_show(struct request_queue *q, char *page)
 101{
 102        unsigned long ra_kb = q->backing_dev_info.ra_pages <<
 103                                        (PAGE_CACHE_SHIFT - 10);
 104
 105        return queue_var_show(ra_kb, (page));
 106}
 107
 108static ssize_t
 109queue_ra_store(struct request_queue *q, const char *page, size_t count)
 110{
 111        unsigned long ra_kb;
 112        ssize_t ret = queue_var_store(&ra_kb, page, count);
 113
 114        if (ret < 0)
 115                return ret;
 116
 117        q->backing_dev_info.ra_pages = ra_kb >> (PAGE_CACHE_SHIFT - 10);
 118
 119        return ret;
 120}
 121
 122static ssize_t queue_max_sectors_show(struct request_queue *q, char *page)
 123{
 124        int max_sectors_kb = queue_max_sectors(q) >> 1;
 125
 126        return queue_var_show(max_sectors_kb, (page));
 127}
 128
 129static ssize_t queue_max_segments_show(struct request_queue *q, char *page)
 130{
 131        return queue_var_show(queue_max_segments(q), (page));
 132}
 133
 134static ssize_t queue_max_integrity_segments_show(struct request_queue *q, char *page)
 135{
 136        return queue_var_show(q->limits.max_integrity_segments, (page));
 137}
 138
 139static ssize_t queue_max_segment_size_show(struct request_queue *q, char *page)
 140{
 141        if (blk_queue_cluster(q))
 142                return queue_var_show(queue_max_segment_size(q), (page));
 143
 144        return queue_var_show(PAGE_CACHE_SIZE, (page));
 145}
 146
 147static ssize_t queue_logical_block_size_show(struct request_queue *q, char *page)
 148{
 149        return queue_var_show(queue_logical_block_size(q), page);
 150}
 151
 152static ssize_t queue_physical_block_size_show(struct request_queue *q, char *page)
 153{
 154        return queue_var_show(queue_physical_block_size(q), page);
 155}
 156
 157static ssize_t queue_io_min_show(struct request_queue *q, char *page)
 158{
 159        return queue_var_show(queue_io_min(q), page);
 160}
 161
 162static ssize_t queue_io_opt_show(struct request_queue *q, char *page)
 163{
 164        return queue_var_show(queue_io_opt(q), page);
 165}
 166
 167static ssize_t queue_discard_granularity_show(struct request_queue *q, char *page)
 168{
 169        return queue_var_show(q->limits.discard_granularity, page);
 170}
 171
 172static ssize_t queue_discard_max_show(struct request_queue *q, char *page)
 173{
 174        return sprintf(page, "%llu\n",
 175                       (unsigned long long)q->limits.max_discard_sectors << 9);
 176}
 177
 178static ssize_t queue_discard_zeroes_data_show(struct request_queue *q, char *page)
 179{
 180        return queue_var_show(queue_discard_zeroes_data(q), page);
 181}
 182
 183static ssize_t queue_write_same_max_show(struct request_queue *q, char *page)
 184{
 185        return sprintf(page, "%llu\n",
 186                (unsigned long long)q->limits.max_write_same_sectors << 9);
 187}
 188
 189
 190static ssize_t
 191queue_max_sectors_store(struct request_queue *q, const char *page, size_t count)
 192{
 193        unsigned long max_sectors_kb,
 194                max_hw_sectors_kb = queue_max_hw_sectors(q) >> 1,
 195                        page_kb = 1 << (PAGE_CACHE_SHIFT - 10);
 196        ssize_t ret = queue_var_store(&max_sectors_kb, page, count);
 197
 198        if (ret < 0)
 199                return ret;
 200
 201        if (max_sectors_kb > max_hw_sectors_kb || max_sectors_kb < page_kb)
 202                return -EINVAL;
 203
 204        spin_lock_irq(q->queue_lock);
 205        q->limits.max_sectors = max_sectors_kb << 1;
 206        spin_unlock_irq(q->queue_lock);
 207
 208        return ret;
 209}
 210
 211static ssize_t queue_max_hw_sectors_show(struct request_queue *q, char *page)
 212{
 213        int max_hw_sectors_kb = queue_max_hw_sectors(q) >> 1;
 214
 215        return queue_var_show(max_hw_sectors_kb, (page));
 216}
 217
 218#define QUEUE_SYSFS_BIT_FNS(name, flag, neg)                            \
 219static ssize_t                                                          \
 220queue_show_##name(struct request_queue *q, char *page)                  \
 221{                                                                       \
 222        int bit;                                                        \
 223        bit = test_bit(QUEUE_FLAG_##flag, &q->queue_flags);             \
 224        return queue_var_show(neg ? !bit : bit, page);                  \
 225}                                                                       \
 226static ssize_t                                                          \
 227queue_store_##name(struct request_queue *q, const char *page, size_t count) \
 228{                                                                       \
 229        unsigned long val;                                              \
 230        ssize_t ret;                                                    \
 231        ret = queue_var_store(&val, page, count);                       \
 232        if (neg)                                                        \
 233                val = !val;                                             \
 234                                                                        \
 235        spin_lock_irq(q->queue_lock);                                   \
 236        if (val)                                                        \
 237                queue_flag_set(QUEUE_FLAG_##flag, q);                   \
 238        else                                                            \
 239                queue_flag_clear(QUEUE_FLAG_##flag, q);                 \
 240        spin_unlock_irq(q->queue_lock);                                 \
 241        return ret;                                                     \
 242}
 243
 244QUEUE_SYSFS_BIT_FNS(nonrot, NONROT, 1);
 245QUEUE_SYSFS_BIT_FNS(random, ADD_RANDOM, 0);
 246QUEUE_SYSFS_BIT_FNS(iostats, IO_STAT, 0);
 247#undef QUEUE_SYSFS_BIT_FNS
 248
 249static ssize_t queue_nomerges_show(struct request_queue *q, char *page)
 250{
 251        return queue_var_show((blk_queue_nomerges(q) << 1) |
 252                               blk_queue_noxmerges(q), page);
 253}
 254
 255static ssize_t queue_nomerges_store(struct request_queue *q, const char *page,
 256                                    size_t count)
 257{
 258        unsigned long nm;
 259        ssize_t ret = queue_var_store(&nm, page, count);
 260
 261        if (ret < 0)
 262                return ret;
 263
 264        spin_lock_irq(q->queue_lock);
 265        queue_flag_clear(QUEUE_FLAG_NOMERGES, q);
 266        queue_flag_clear(QUEUE_FLAG_NOXMERGES, q);
 267        if (nm == 2)
 268                queue_flag_set(QUEUE_FLAG_NOMERGES, q);
 269        else if (nm)
 270                queue_flag_set(QUEUE_FLAG_NOXMERGES, q);
 271        spin_unlock_irq(q->queue_lock);
 272
 273        return ret;
 274}
 275
 276static ssize_t queue_rq_affinity_show(struct request_queue *q, char *page)
 277{
 278        bool set = test_bit(QUEUE_FLAG_SAME_COMP, &q->queue_flags);
 279        bool force = test_bit(QUEUE_FLAG_SAME_FORCE, &q->queue_flags);
 280
 281        return queue_var_show(set << force, page);
 282}
 283
 284static ssize_t
 285queue_rq_affinity_store(struct request_queue *q, const char *page, size_t count)
 286{
 287        ssize_t ret = -EINVAL;
 288#if defined(CONFIG_USE_GENERIC_SMP_HELPERS)
 289        unsigned long val;
 290
 291        ret = queue_var_store(&val, page, count);
 292        if (ret < 0)
 293                return ret;
 294
 295        spin_lock_irq(q->queue_lock);
 296        if (val == 2) {
 297                queue_flag_set(QUEUE_FLAG_SAME_COMP, q);
 298                queue_flag_set(QUEUE_FLAG_SAME_FORCE, q);
 299        } else if (val == 1) {
 300                queue_flag_set(QUEUE_FLAG_SAME_COMP, q);
 301                queue_flag_clear(QUEUE_FLAG_SAME_FORCE, q);
 302        } else if (val == 0) {
 303                queue_flag_clear(QUEUE_FLAG_SAME_COMP, q);
 304                queue_flag_clear(QUEUE_FLAG_SAME_FORCE, q);
 305        }
 306        spin_unlock_irq(q->queue_lock);
 307#endif
 308        return ret;
 309}
 310
 311static struct queue_sysfs_entry queue_requests_entry = {
 312        .attr = {.name = "nr_requests", .mode = S_IRUGO | S_IWUSR },
 313        .show = queue_requests_show,
 314        .store = queue_requests_store,
 315};
 316
 317static struct queue_sysfs_entry queue_ra_entry = {
 318        .attr = {.name = "read_ahead_kb", .mode = S_IRUGO | S_IWUSR },
 319        .show = queue_ra_show,
 320        .store = queue_ra_store,
 321};
 322
 323static struct queue_sysfs_entry queue_max_sectors_entry = {
 324        .attr = {.name = "max_sectors_kb", .mode = S_IRUGO | S_IWUSR },
 325        .show = queue_max_sectors_show,
 326        .store = queue_max_sectors_store,
 327};
 328
 329static struct queue_sysfs_entry queue_max_hw_sectors_entry = {
 330        .attr = {.name = "max_hw_sectors_kb", .mode = S_IRUGO },
 331        .show = queue_max_hw_sectors_show,
 332};
 333
 334static struct queue_sysfs_entry queue_max_segments_entry = {
 335        .attr = {.name = "max_segments", .mode = S_IRUGO },
 336        .show = queue_max_segments_show,
 337};
 338
 339static struct queue_sysfs_entry queue_max_integrity_segments_entry = {
 340        .attr = {.name = "max_integrity_segments", .mode = S_IRUGO },
 341        .show = queue_max_integrity_segments_show,
 342};
 343
 344static struct queue_sysfs_entry queue_max_segment_size_entry = {
 345        .attr = {.name = "max_segment_size", .mode = S_IRUGO },
 346        .show = queue_max_segment_size_show,
 347};
 348
 349static struct queue_sysfs_entry queue_iosched_entry = {
 350        .attr = {.name = "scheduler", .mode = S_IRUGO | S_IWUSR },
 351        .show = elv_iosched_show,
 352        .store = elv_iosched_store,
 353};
 354
 355static struct queue_sysfs_entry queue_hw_sector_size_entry = {
 356        .attr = {.name = "hw_sector_size", .mode = S_IRUGO },
 357        .show = queue_logical_block_size_show,
 358};
 359
 360static struct queue_sysfs_entry queue_logical_block_size_entry = {
 361        .attr = {.name = "logical_block_size", .mode = S_IRUGO },
 362        .show = queue_logical_block_size_show,
 363};
 364
 365static struct queue_sysfs_entry queue_physical_block_size_entry = {
 366        .attr = {.name = "physical_block_size", .mode = S_IRUGO },
 367        .show = queue_physical_block_size_show,
 368};
 369
 370static struct queue_sysfs_entry queue_io_min_entry = {
 371        .attr = {.name = "minimum_io_size", .mode = S_IRUGO },
 372        .show = queue_io_min_show,
 373};
 374
 375static struct queue_sysfs_entry queue_io_opt_entry = {
 376        .attr = {.name = "optimal_io_size", .mode = S_IRUGO },
 377        .show = queue_io_opt_show,
 378};
 379
 380static struct queue_sysfs_entry queue_discard_granularity_entry = {
 381        .attr = {.name = "discard_granularity", .mode = S_IRUGO },
 382        .show = queue_discard_granularity_show,
 383};
 384
 385static struct queue_sysfs_entry queue_discard_max_entry = {
 386        .attr = {.name = "discard_max_bytes", .mode = S_IRUGO },
 387        .show = queue_discard_max_show,
 388};
 389
 390static struct queue_sysfs_entry queue_discard_zeroes_data_entry = {
 391        .attr = {.name = "discard_zeroes_data", .mode = S_IRUGO },
 392        .show = queue_discard_zeroes_data_show,
 393};
 394
 395static struct queue_sysfs_entry queue_write_same_max_entry = {
 396        .attr = {.name = "write_same_max_bytes", .mode = S_IRUGO },
 397        .show = queue_write_same_max_show,
 398};
 399
 400static struct queue_sysfs_entry queue_nonrot_entry = {
 401        .attr = {.name = "rotational", .mode = S_IRUGO | S_IWUSR },
 402        .show = queue_show_nonrot,
 403        .store = queue_store_nonrot,
 404};
 405
 406static struct queue_sysfs_entry queue_nomerges_entry = {
 407        .attr = {.name = "nomerges", .mode = S_IRUGO | S_IWUSR },
 408        .show = queue_nomerges_show,
 409        .store = queue_nomerges_store,
 410};
 411
 412static struct queue_sysfs_entry queue_rq_affinity_entry = {
 413        .attr = {.name = "rq_affinity", .mode = S_IRUGO | S_IWUSR },
 414        .show = queue_rq_affinity_show,
 415        .store = queue_rq_affinity_store,
 416};
 417
 418static struct queue_sysfs_entry queue_iostats_entry = {
 419        .attr = {.name = "iostats", .mode = S_IRUGO | S_IWUSR },
 420        .show = queue_show_iostats,
 421        .store = queue_store_iostats,
 422};
 423
 424static struct queue_sysfs_entry queue_random_entry = {
 425        .attr = {.name = "add_random", .mode = S_IRUGO | S_IWUSR },
 426        .show = queue_show_random,
 427        .store = queue_store_random,
 428};
 429
 430static struct attribute *default_attrs[] = {
 431        &queue_requests_entry.attr,
 432        &queue_ra_entry.attr,
 433        &queue_max_hw_sectors_entry.attr,
 434        &queue_max_sectors_entry.attr,
 435        &queue_max_segments_entry.attr,
 436        &queue_max_integrity_segments_entry.attr,
 437        &queue_max_segment_size_entry.attr,
 438        &queue_iosched_entry.attr,
 439        &queue_hw_sector_size_entry.attr,
 440        &queue_logical_block_size_entry.attr,
 441        &queue_physical_block_size_entry.attr,
 442        &queue_io_min_entry.attr,
 443        &queue_io_opt_entry.attr,
 444        &queue_discard_granularity_entry.attr,
 445        &queue_discard_max_entry.attr,
 446        &queue_discard_zeroes_data_entry.attr,
 447        &queue_write_same_max_entry.attr,
 448        &queue_nonrot_entry.attr,
 449        &queue_nomerges_entry.attr,
 450        &queue_rq_affinity_entry.attr,
 451        &queue_iostats_entry.attr,
 452        &queue_random_entry.attr,
 453        NULL,
 454};
 455
 456#define to_queue(atr) container_of((atr), struct queue_sysfs_entry, attr)
 457
 458static ssize_t
 459queue_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
 460{
 461        struct queue_sysfs_entry *entry = to_queue(attr);
 462        struct request_queue *q =
 463                container_of(kobj, struct request_queue, kobj);
 464        ssize_t res;
 465
 466        if (!entry->show)
 467                return -EIO;
 468        mutex_lock(&q->sysfs_lock);
 469        if (blk_queue_dead(q)) {
 470                mutex_unlock(&q->sysfs_lock);
 471                return -ENOENT;
 472        }
 473        res = entry->show(q, page);
 474        mutex_unlock(&q->sysfs_lock);
 475        return res;
 476}
 477
 478static ssize_t
 479queue_attr_store(struct kobject *kobj, struct attribute *attr,
 480                    const char *page, size_t length)
 481{
 482        struct queue_sysfs_entry *entry = to_queue(attr);
 483        struct request_queue *q;
 484        ssize_t res;
 485
 486        if (!entry->store)
 487                return -EIO;
 488
 489        q = container_of(kobj, struct request_queue, kobj);
 490        mutex_lock(&q->sysfs_lock);
 491        if (blk_queue_dead(q)) {
 492                mutex_unlock(&q->sysfs_lock);
 493                return -ENOENT;
 494        }
 495        res = entry->store(q, page, length);
 496        mutex_unlock(&q->sysfs_lock);
 497        return res;
 498}
 499
 500/**
 501 * blk_release_queue: - release a &struct request_queue when it is no longer needed
 502 * @kobj:    the kobj belonging to the request queue to be released
 503 *
 504 * Description:
 505 *     blk_release_queue is the pair to blk_init_queue() or
 506 *     blk_queue_make_request().  It should be called when a request queue is
 507 *     being released; typically when a block device is being de-registered.
 508 *     Currently, its primary task it to free all the &struct request
 509 *     structures that were allocated to the queue and the queue itself.
 510 *
 511 * Caveat:
 512 *     Hopefully the low level driver will have finished any
 513 *     outstanding requests first...
 514 **/
 515static void blk_release_queue(struct kobject *kobj)
 516{
 517        struct request_queue *q =
 518                container_of(kobj, struct request_queue, kobj);
 519
 520        blk_sync_queue(q);
 521
 522        blkcg_exit_queue(q);
 523
 524        if (q->elevator) {
 525                spin_lock_irq(q->queue_lock);
 526                ioc_clear_queue(q);
 527                spin_unlock_irq(q->queue_lock);
 528                elevator_exit(q->elevator);
 529        }
 530
 531        blk_exit_rl(&q->root_rl);
 532
 533        if (q->queue_tags)
 534                __blk_queue_free_tags(q);
 535
 536        blk_trace_shutdown(q);
 537
 538        bdi_destroy(&q->backing_dev_info);
 539
 540        ida_simple_remove(&blk_queue_ida, q->id);
 541        kmem_cache_free(blk_requestq_cachep, q);
 542}
 543
 544static const struct sysfs_ops queue_sysfs_ops = {
 545        .show   = queue_attr_show,
 546        .store  = queue_attr_store,
 547};
 548
 549struct kobj_type blk_queue_ktype = {
 550        .sysfs_ops      = &queue_sysfs_ops,
 551        .default_attrs  = default_attrs,
 552        .release        = blk_release_queue,
 553};
 554
 555int blk_register_queue(struct gendisk *disk)
 556{
 557        int ret;
 558        struct device *dev = disk_to_dev(disk);
 559        struct request_queue *q = disk->queue;
 560
 561        if (WARN_ON(!q))
 562                return -ENXIO;
 563
 564        /*
 565         * Initialization must be complete by now.  Finish the initial
 566         * bypass from queue allocation.
 567         */
 568        blk_queue_bypass_end(q);
 569
 570        ret = blk_trace_init_sysfs(dev);
 571        if (ret)
 572                return ret;
 573
 574        ret = kobject_add(&q->kobj, kobject_get(&dev->kobj), "%s", "queue");
 575        if (ret < 0) {
 576                blk_trace_remove_sysfs(dev);
 577                return ret;
 578        }
 579
 580        kobject_uevent(&q->kobj, KOBJ_ADD);
 581
 582        if (!q->request_fn)
 583                return 0;
 584
 585        ret = elv_register_queue(q);
 586        if (ret) {
 587                kobject_uevent(&q->kobj, KOBJ_REMOVE);
 588                kobject_del(&q->kobj);
 589                blk_trace_remove_sysfs(dev);
 590                kobject_put(&dev->kobj);
 591                return ret;
 592        }
 593
 594        return 0;
 595}
 596
 597void blk_unregister_queue(struct gendisk *disk)
 598{
 599        struct request_queue *q = disk->queue;
 600
 601        if (WARN_ON(!q))
 602                return;
 603
 604        if (q->request_fn)
 605                elv_unregister_queue(q);
 606
 607        kobject_uevent(&q->kobj, KOBJ_REMOVE);
 608        kobject_del(&q->kobj);
 609        blk_trace_remove_sysfs(disk_to_dev(disk));
 610        kobject_put(&disk_to_dev(disk)->kobj);
 611}
 612
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.