Lines Matching +full:page +full:- +full:based
1 // SPDX-License-Identifier: GPL-2.0
10 #include <linux/backing-dev.h>
15 #include "blk-mq.h"
16 #include "blk-mq-debugfs.h"
17 #include "blk-mq-sched.h"
18 #include "blk-rq-qos.h"
19 #include "blk-wbt.h"
20 #include "blk-cgroup.h"
21 #include "blk-throttle.h"
25 ssize_t (*show)(struct gendisk *disk, char *page);
26 ssize_t (*store)(struct gendisk *disk, const char *page, size_t count);
27 int (*store_limit)(struct gendisk *disk, const char *page,
29 void (*load_module)(struct gendisk *disk, const char *page, size_t count);
33 queue_var_show(unsigned long var, char *page) in queue_var_show() argument
35 return sysfs_emit(page, "%lu\n", var); in queue_var_show()
39 queue_var_store(unsigned long *var, const char *page, size_t count) in queue_var_store() argument
44 err = kstrtoul(page, 10, &v); in queue_var_store()
46 return -EINVAL; in queue_var_store()
53 static ssize_t queue_requests_show(struct gendisk *disk, char *page) in queue_requests_show() argument
55 return queue_var_show(disk->queue->nr_requests, page); in queue_requests_show()
59 queue_requests_store(struct gendisk *disk, const char *page, size_t count) in queue_requests_store() argument
64 if (!queue_is_mq(disk->queue)) in queue_requests_store()
65 return -EINVAL; in queue_requests_store()
67 ret = queue_var_store(&nr, page, count); in queue_requests_store()
74 err = blk_mq_update_nr_requests(disk->queue, nr); in queue_requests_store()
81 static ssize_t queue_ra_show(struct gendisk *disk, char *page) in queue_ra_show() argument
83 return queue_var_show(disk->bdi->ra_pages << (PAGE_SHIFT - 10), page); in queue_ra_show()
87 queue_ra_store(struct gendisk *disk, const char *page, size_t count) in queue_ra_store() argument
92 ret = queue_var_store(&ra_kb, page, count); in queue_ra_store()
95 disk->bdi->ra_pages = ra_kb >> (PAGE_SHIFT - 10); in queue_ra_store()
100 static ssize_t queue_##_field##_show(struct gendisk *disk, char *page) \
102 return queue_var_show(disk->queue->limits._field, page); \
124 static ssize_t queue_##_field##_show(struct gendisk *disk, char *page) \ in QUEUE_SYSFS_LIMIT_SHOW()
126 return sysfs_emit(page, "%llu\n", \ in QUEUE_SYSFS_LIMIT_SHOW()
127 (unsigned long long)disk->queue->limits._field << \ in QUEUE_SYSFS_LIMIT_SHOW()
139 static ssize_t queue_##_field##_show(struct gendisk *disk, char *page) \
141 return queue_var_show(disk->queue->limits._field >> 1, page); \
148 static ssize_t queue_##_name##_show(struct gendisk *disk, char *page) \
150 return sysfs_emit(page, "%d\n", _val); \
156 QUEUE_SYSFS_SHOW_CONST(poll_delay, -1)
159 const char *page, size_t count, struct queue_limits *lim)
164 ret = queue_var_store(&max_discard_bytes, page, count);
168 if (max_discard_bytes & (disk->queue->limits.discard_granularity - 1))
169 return -EINVAL;
172 return -EINVAL;
174 lim->max_user_discard_sectors = max_discard_bytes >> SECTOR_SHIFT;
179 queue_max_sectors_store(struct gendisk *disk, const char *page, size_t count, in queue_max_sectors_store() argument
185 ret = queue_var_store(&max_sectors_kb, page, count); in queue_max_sectors_store()
189 lim->max_user_sectors = max_sectors_kb << 1; in queue_max_sectors_store()
193 static ssize_t queue_feature_store(struct gendisk *disk, const char *page, in queue_feature_store() argument
199 ret = queue_var_store(&val, page, count); in queue_feature_store()
204 lim->features |= feature; in queue_feature_store()
206 lim->features &= ~feature; in queue_feature_store()
211 static ssize_t queue_##_name##_show(struct gendisk *disk, char *page) \
213 return sysfs_emit(page, "%u\n", \
214 !!(disk->queue->limits.features & _feature)); \
217 const char *page, size_t count, struct queue_limits *lim) \
219 return queue_feature_store(disk, page, count, lim, _feature); \
228 static ssize_t queue_##_name##_show(struct gendisk *disk, char *page) \
230 return sysfs_emit(page, "%u\n", \
231 !!(disk->queue->limits.features & _feature)); \
237 static ssize_t queue_poll_show(struct gendisk *disk, char *page) in queue_poll_show() argument
239 if (queue_is_mq(disk->queue)) in queue_poll_show()
240 return sysfs_emit(page, "%u\n", blk_mq_can_poll(disk->queue)); in queue_poll_show()
241 return sysfs_emit(page, "%u\n", in queue_poll_show()
242 !!(disk->queue->limits.features & BLK_FEAT_POLL)); in queue_poll_show()
245 static ssize_t queue_zoned_show(struct gendisk *disk, char *page) in queue_zoned_show() argument
247 if (blk_queue_is_zoned(disk->queue)) in queue_zoned_show()
248 return sysfs_emit(page, "host-managed\n"); in queue_zoned_show()
249 return sysfs_emit(page, "none\n"); in queue_zoned_show()
252 static ssize_t queue_nr_zones_show(struct gendisk *disk, char *page) in queue_nr_zones_show() argument
254 return queue_var_show(disk_nr_zones(disk), page); in queue_nr_zones_show()
257 static ssize_t queue_iostats_passthrough_show(struct gendisk *disk, char *page) in queue_iostats_passthrough_show() argument
259 return queue_var_show(!!blk_queue_passthrough_stat(disk->queue), page); in queue_iostats_passthrough_show()
263 const char *page, size_t count, struct queue_limits *lim) in queue_iostats_passthrough_store() argument
268 ret = queue_var_store(&ios, page, count); in queue_iostats_passthrough_store()
273 lim->flags |= BLK_FLAG_IOSTATS_PASSTHROUGH; in queue_iostats_passthrough_store()
275 lim->flags &= ~BLK_FLAG_IOSTATS_PASSTHROUGH; in queue_iostats_passthrough_store()
279 static ssize_t queue_nomerges_show(struct gendisk *disk, char *page) in queue_nomerges_show() argument
281 return queue_var_show((blk_queue_nomerges(disk->queue) << 1) | in queue_nomerges_show()
282 blk_queue_noxmerges(disk->queue), page); in queue_nomerges_show()
285 static ssize_t queue_nomerges_store(struct gendisk *disk, const char *page, in queue_nomerges_store() argument
289 ssize_t ret = queue_var_store(&nm, page, count); in queue_nomerges_store()
294 blk_queue_flag_clear(QUEUE_FLAG_NOMERGES, disk->queue); in queue_nomerges_store()
295 blk_queue_flag_clear(QUEUE_FLAG_NOXMERGES, disk->queue); in queue_nomerges_store()
297 blk_queue_flag_set(QUEUE_FLAG_NOMERGES, disk->queue); in queue_nomerges_store()
299 blk_queue_flag_set(QUEUE_FLAG_NOXMERGES, disk->queue); in queue_nomerges_store()
304 static ssize_t queue_rq_affinity_show(struct gendisk *disk, char *page) in queue_rq_affinity_show() argument
306 bool set = test_bit(QUEUE_FLAG_SAME_COMP, &disk->queue->queue_flags); in queue_rq_affinity_show()
307 bool force = test_bit(QUEUE_FLAG_SAME_FORCE, &disk->queue->queue_flags); in queue_rq_affinity_show()
309 return queue_var_show(set << force, page); in queue_rq_affinity_show()
313 queue_rq_affinity_store(struct gendisk *disk, const char *page, size_t count) in queue_rq_affinity_store() argument
315 ssize_t ret = -EINVAL; in queue_rq_affinity_store()
317 struct request_queue *q = disk->queue; in queue_rq_affinity_store()
320 ret = queue_var_store(&val, page, count); in queue_rq_affinity_store()
338 static ssize_t queue_poll_delay_store(struct gendisk *disk, const char *page, in queue_poll_delay_store() argument
344 static ssize_t queue_poll_store(struct gendisk *disk, const char *page, in queue_poll_store() argument
347 if (!(disk->queue->limits.features & BLK_FEAT_POLL)) in queue_poll_store()
348 return -EINVAL; in queue_poll_store()
354 static ssize_t queue_io_timeout_show(struct gendisk *disk, char *page) in queue_io_timeout_show() argument
356 return sysfs_emit(page, "%u\n", jiffies_to_msecs(disk->queue->rq_timeout)); in queue_io_timeout_show()
359 static ssize_t queue_io_timeout_store(struct gendisk *disk, const char *page, in queue_io_timeout_store() argument
365 err = kstrtou32(page, 10, &val); in queue_io_timeout_store()
367 return -EINVAL; in queue_io_timeout_store()
369 blk_queue_rq_timeout(disk->queue, msecs_to_jiffies(val)); in queue_io_timeout_store()
374 static ssize_t queue_wc_show(struct gendisk *disk, char *page) in queue_wc_show() argument
376 if (blk_queue_write_cache(disk->queue)) in queue_wc_show()
377 return sysfs_emit(page, "write back\n"); in queue_wc_show()
378 return sysfs_emit(page, "write through\n"); in queue_wc_show()
381 static int queue_wc_store(struct gendisk *disk, const char *page, in queue_wc_store() argument
386 if (!strncmp(page, "write back", 10)) { in queue_wc_store()
388 } else if (!strncmp(page, "write through", 13) || in queue_wc_store()
389 !strncmp(page, "none", 4)) { in queue_wc_store()
392 return -EINVAL; in queue_wc_store()
396 lim->flags |= BLK_FLAG_WRITE_CACHE_DISABLED; in queue_wc_store()
398 lim->flags &= ~BLK_FLAG_WRITE_CACHE_DISABLED; in queue_wc_store()
491 static ssize_t queue_var_store64(s64 *var, const char *page) in queue_var_store64() argument
496 err = kstrtos64(page, 10, &v); in queue_var_store64()
504 static ssize_t queue_wb_lat_show(struct gendisk *disk, char *page) in queue_wb_lat_show() argument
506 if (!wbt_rq_qos(disk->queue)) in queue_wb_lat_show()
507 return -EINVAL; in queue_wb_lat_show()
509 if (wbt_disabled(disk->queue)) in queue_wb_lat_show()
510 return sysfs_emit(page, "0\n"); in queue_wb_lat_show()
512 return sysfs_emit(page, "%llu\n", in queue_wb_lat_show()
513 div_u64(wbt_get_min_lat(disk->queue), 1000)); in queue_wb_lat_show()
516 static ssize_t queue_wb_lat_store(struct gendisk *disk, const char *page, in queue_wb_lat_store() argument
519 struct request_queue *q = disk->queue; in queue_wb_lat_store()
524 ret = queue_var_store64(&val, page); in queue_wb_lat_store()
527 if (val < -1) in queue_wb_lat_store()
528 return -EINVAL; in queue_wb_lat_store()
537 if (val == -1) in queue_wb_lat_store()
562 /* Common attributes for bio-based and request-based queues. */
609 /* Request-based queue attributes that are not relevant for bio-based queues. */
625 struct request_queue *q = disk->queue; in queue_attr_visible()
632 return attr->mode; in queue_attr_visible()
639 struct request_queue *q = disk->queue; in blk_mq_queue_attr_visible()
644 if (attr == &queue_io_timeout_entry.attr && !q->mq_ops->timeout) in blk_mq_queue_attr_visible()
647 return attr->mode; in blk_mq_queue_attr_visible()
663 queue_attr_show(struct kobject *kobj, struct attribute *attr, char *page) in queue_attr_show() argument
669 if (!entry->show) in queue_attr_show()
670 return -EIO; in queue_attr_show()
671 mutex_lock(&disk->queue->sysfs_lock); in queue_attr_show()
672 res = entry->show(disk, page); in queue_attr_show()
673 mutex_unlock(&disk->queue->sysfs_lock); in queue_attr_show()
679 const char *page, size_t length) in queue_attr_store() argument
683 struct request_queue *q = disk->queue; in queue_attr_store()
687 if (!entry->store_limit && !entry->store) in queue_attr_store()
688 return -EIO; in queue_attr_store()
695 if (entry->load_module) in queue_attr_store()
696 entry->load_module(disk, page, length); in queue_attr_store()
698 if (entry->store_limit) { in queue_attr_store()
701 res = entry->store_limit(disk, page, length, &lim); in queue_attr_store()
713 mutex_lock(&q->sysfs_lock); in queue_attr_store()
715 res = entry->store(disk, page, length); in queue_attr_store()
717 mutex_unlock(&q->sysfs_lock); in queue_attr_store()
745 struct request_queue *q = disk->queue; in blk_debugfs_remove()
747 mutex_lock(&q->debugfs_mutex); in blk_debugfs_remove()
749 debugfs_remove_recursive(q->debugfs_dir); in blk_debugfs_remove()
750 q->debugfs_dir = NULL; in blk_debugfs_remove()
751 q->sched_debugfs_dir = NULL; in blk_debugfs_remove()
752 q->rqos_debugfs_dir = NULL; in blk_debugfs_remove()
753 mutex_unlock(&q->debugfs_mutex); in blk_debugfs_remove()
757 * blk_register_queue - register a block layer queue with sysfs
762 struct request_queue *q = disk->queue; in blk_register_queue()
765 kobject_init(&disk->queue_kobj, &blk_queue_ktype); in blk_register_queue()
766 ret = kobject_add(&disk->queue_kobj, &disk_to_dev(disk)->kobj, "queue"); in blk_register_queue()
775 mutex_lock(&q->sysfs_lock); in blk_register_queue()
777 mutex_lock(&q->debugfs_mutex); in blk_register_queue()
778 q->debugfs_dir = debugfs_create_dir(disk->disk_name, blk_debugfs_root); in blk_register_queue()
781 mutex_unlock(&q->debugfs_mutex); in blk_register_queue()
787 if (q->elevator) { in blk_register_queue()
801 kobject_uevent(&disk->queue_kobj, KOBJ_ADD); in blk_register_queue()
802 if (q->elevator) in blk_register_queue()
803 kobject_uevent(&q->elevator->kobj, KOBJ_ADD); in blk_register_queue()
804 mutex_unlock(&q->sysfs_lock); in blk_register_queue()
808 * request_queues for non-existent devices. Shutting down a fully in blk_register_queue()
813 * request_queues for non-existent devices never get registered. in blk_register_queue()
816 percpu_ref_switch_to_percpu(&q->q_usage_counter); in blk_register_queue()
826 mutex_unlock(&q->sysfs_lock); in blk_register_queue()
830 kobject_put(&disk->queue_kobj); in blk_register_queue()
835 * blk_unregister_queue - counterpart of blk_register_queue()
843 struct request_queue *q = disk->queue; in blk_unregister_queue()
848 /* Return early if disk->queue was never registered. */ in blk_unregister_queue()
857 mutex_lock(&q->sysfs_lock); in blk_unregister_queue()
859 mutex_unlock(&q->sysfs_lock); in blk_unregister_queue()
869 mutex_lock(&q->sysfs_lock); in blk_unregister_queue()
872 mutex_unlock(&q->sysfs_lock); in blk_unregister_queue()
875 kobject_uevent(&disk->queue_kobj, KOBJ_REMOVE); in blk_unregister_queue()
876 kobject_del(&disk->queue_kobj); in blk_unregister_queue()