summaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
authorJeff Moyer <jmoyer@redhat.com>2016-06-08 09:11:38 -0400
committerJens Axboe <axboe@fb.com>2016-06-08 10:56:03 -0400
commitd2d481d04f70325e7ed45cbd6e72c15e745f6ede (patch)
tree188de764cb26b3c934814b5ada9857791d11417d /block
parent9a7f38c42c2b92391d9dabaf9f51df7cfe5608e4 (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.c40
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);
4690SHOW_FUNCTION(cfq_target_latency_show, cfqd->cfq_target_latency, 1); 4690SHOW_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) \
4694static 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}
4701USEC_SHOW_FUNCTION(cfq_slice_idle_us_show, cfqd->cfq_slice_idle);
4702USEC_SHOW_FUNCTION(cfq_group_idle_us_show, cfqd->cfq_group_idle);
4703USEC_SHOW_FUNCTION(cfq_slice_sync_us_show, cfqd->cfq_slice[1]);
4704USEC_SHOW_FUNCTION(cfq_slice_async_us_show, cfqd->cfq_slice[0]);
4705USEC_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) \
4694static ssize_t __FUNC(struct elevator_queue *e, const char *page, size_t count) \ 4709static 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);
4724STORE_FUNCTION(cfq_target_latency_store, &cfqd->cfq_target_latency, 1, UINT_MAX, 1); 4739STORE_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) \
4743static 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}
4755USEC_STORE_FUNCTION(cfq_slice_idle_us_store, &cfqd->cfq_slice_idle, 0, UINT_MAX);
4756USEC_STORE_FUNCTION(cfq_group_idle_us_store, &cfqd->cfq_group_idle, 0, UINT_MAX);
4757USEC_STORE_FUNCTION(cfq_slice_sync_us_store, &cfqd->cfq_slice[1], 1, UINT_MAX);
4758USEC_STORE_FUNCTION(cfq_slice_async_us_store, &cfqd->cfq_slice[0], 1, UINT_MAX);
4759USEC_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