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 | |
| 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>
| -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 | ||
