diff options
author | Jeff Moyer <jmoyer@redhat.com> | 2016-06-08 09:11:38 -0400 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2016-06-08 10:56:03 -0400 |
commit | d2d481d04f70325e7ed45cbd6e72c15e745f6ede (patch) | |
tree | 188de764cb26b3c934814b5ada9857791d11417d /block | |
parent | 9a7f38c42c2b92391d9dabaf9f51df7cfe5608e4 (diff) |
cfq-iosched: Expose microsecond interfaces
Expose interfaces to tune time slices of CFQ IO scheduler in
microseconds.
Signed-off-by: Jeff Moyer <jmoyer@redhat.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'block')
-rw-r--r-- | block/cfq-iosched.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 9c2e82c1ea88..2db7b1450dd9 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c | |||
@@ -4690,6 +4690,21 @@ SHOW_FUNCTION(cfq_low_latency_show, cfqd->cfq_latency, 0); | |||
4690 | SHOW_FUNCTION(cfq_target_latency_show, cfqd->cfq_target_latency, 1); | 4690 | SHOW_FUNCTION(cfq_target_latency_show, cfqd->cfq_target_latency, 1); |
4691 | #undef SHOW_FUNCTION | 4691 | #undef SHOW_FUNCTION |
4692 | 4692 | ||
4693 | #define USEC_SHOW_FUNCTION(__FUNC, __VAR) \ | ||
4694 | static ssize_t __FUNC(struct elevator_queue *e, char *page) \ | ||
4695 | { \ | ||
4696 | struct cfq_data *cfqd = e->elevator_data; \ | ||
4697 | u64 __data = __VAR; \ | ||
4698 | __data = div_u64(__data, NSEC_PER_USEC); \ | ||
4699 | return cfq_var_show(__data, (page)); \ | ||
4700 | } | ||
4701 | USEC_SHOW_FUNCTION(cfq_slice_idle_us_show, cfqd->cfq_slice_idle); | ||
4702 | USEC_SHOW_FUNCTION(cfq_group_idle_us_show, cfqd->cfq_group_idle); | ||
4703 | USEC_SHOW_FUNCTION(cfq_slice_sync_us_show, cfqd->cfq_slice[1]); | ||
4704 | USEC_SHOW_FUNCTION(cfq_slice_async_us_show, cfqd->cfq_slice[0]); | ||
4705 | USEC_SHOW_FUNCTION(cfq_target_latency_us_show, cfqd->cfq_target_latency); | ||
4706 | #undef USEC_SHOW_FUNCTION | ||
4707 | |||
4693 | #define STORE_FUNCTION(__FUNC, __PTR, MIN, MAX, __CONV) \ | 4708 | #define STORE_FUNCTION(__FUNC, __PTR, MIN, MAX, __CONV) \ |
4694 | static ssize_t __FUNC(struct elevator_queue *e, const char *page, size_t count) \ | 4709 | static ssize_t __FUNC(struct elevator_queue *e, const char *page, size_t count) \ |
4695 | { \ | 4710 | { \ |
@@ -4724,6 +4739,26 @@ STORE_FUNCTION(cfq_low_latency_store, &cfqd->cfq_latency, 0, 1, 0); | |||
4724 | STORE_FUNCTION(cfq_target_latency_store, &cfqd->cfq_target_latency, 1, UINT_MAX, 1); | 4739 | STORE_FUNCTION(cfq_target_latency_store, &cfqd->cfq_target_latency, 1, UINT_MAX, 1); |
4725 | #undef STORE_FUNCTION | 4740 | #undef STORE_FUNCTION |
4726 | 4741 | ||
4742 | #define USEC_STORE_FUNCTION(__FUNC, __PTR, MIN, MAX) \ | ||
4743 | static ssize_t __FUNC(struct elevator_queue *e, const char *page, size_t count) \ | ||
4744 | { \ | ||
4745 | struct cfq_data *cfqd = e->elevator_data; \ | ||
4746 | unsigned int __data; \ | ||
4747 | int ret = cfq_var_store(&__data, (page), count); \ | ||
4748 | if (__data < (MIN)) \ | ||
4749 | __data = (MIN); \ | ||
4750 | else if (__data > (MAX)) \ | ||
4751 | __data = (MAX); \ | ||
4752 | *(__PTR) = (u64)__data * NSEC_PER_USEC; \ | ||
4753 | return ret; \ | ||
4754 | } | ||
4755 | USEC_STORE_FUNCTION(cfq_slice_idle_us_store, &cfqd->cfq_slice_idle, 0, UINT_MAX); | ||
4756 | USEC_STORE_FUNCTION(cfq_group_idle_us_store, &cfqd->cfq_group_idle, 0, UINT_MAX); | ||
4757 | USEC_STORE_FUNCTION(cfq_slice_sync_us_store, &cfqd->cfq_slice[1], 1, UINT_MAX); | ||
4758 | USEC_STORE_FUNCTION(cfq_slice_async_us_store, &cfqd->cfq_slice[0], 1, UINT_MAX); | ||
4759 | USEC_STORE_FUNCTION(cfq_target_latency_us_store, &cfqd->cfq_target_latency, 1, UINT_MAX); | ||
4760 | #undef USEC_STORE_FUNCTION | ||
4761 | |||
4727 | #define CFQ_ATTR(name) \ | 4762 | #define CFQ_ATTR(name) \ |
4728 | __ATTR(name, S_IRUGO|S_IWUSR, cfq_##name##_show, cfq_##name##_store) | 4763 | __ATTR(name, S_IRUGO|S_IWUSR, cfq_##name##_show, cfq_##name##_store) |
4729 | 4764 | ||
@@ -4734,12 +4769,17 @@ static struct elv_fs_entry cfq_attrs[] = { | |||
4734 | CFQ_ATTR(back_seek_max), | 4769 | CFQ_ATTR(back_seek_max), |
4735 | CFQ_ATTR(back_seek_penalty), | 4770 | CFQ_ATTR(back_seek_penalty), |
4736 | CFQ_ATTR(slice_sync), | 4771 | CFQ_ATTR(slice_sync), |
4772 | CFQ_ATTR(slice_sync_us), | ||
4737 | CFQ_ATTR(slice_async), | 4773 | CFQ_ATTR(slice_async), |
4774 | CFQ_ATTR(slice_async_us), | ||
4738 | CFQ_ATTR(slice_async_rq), | 4775 | CFQ_ATTR(slice_async_rq), |
4739 | CFQ_ATTR(slice_idle), | 4776 | CFQ_ATTR(slice_idle), |
4777 | CFQ_ATTR(slice_idle_us), | ||
4740 | CFQ_ATTR(group_idle), | 4778 | CFQ_ATTR(group_idle), |
4779 | CFQ_ATTR(group_idle_us), | ||
4741 | CFQ_ATTR(low_latency), | 4780 | CFQ_ATTR(low_latency), |
4742 | CFQ_ATTR(target_latency), | 4781 | CFQ_ATTR(target_latency), |
4782 | CFQ_ATTR(target_latency_us), | ||
4743 | __ATTR_NULL | 4783 | __ATTR_NULL |
4744 | }; | 4784 | }; |
4745 | 4785 | ||