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>
This commit is contained in:
parent
9a7f38c42c
commit
d2d481d04f
|
@ -4690,6 +4690,21 @@ SHOW_FUNCTION(cfq_low_latency_show, cfqd->cfq_latency, 0);
|
|||
SHOW_FUNCTION(cfq_target_latency_show, cfqd->cfq_target_latency, 1);
|
||||
#undef SHOW_FUNCTION
|
||||
|
||||
#define USEC_SHOW_FUNCTION(__FUNC, __VAR) \
|
||||
static ssize_t __FUNC(struct elevator_queue *e, char *page) \
|
||||
{ \
|
||||
struct cfq_data *cfqd = e->elevator_data; \
|
||||
u64 __data = __VAR; \
|
||||
__data = div_u64(__data, NSEC_PER_USEC); \
|
||||
return cfq_var_show(__data, (page)); \
|
||||
}
|
||||
USEC_SHOW_FUNCTION(cfq_slice_idle_us_show, cfqd->cfq_slice_idle);
|
||||
USEC_SHOW_FUNCTION(cfq_group_idle_us_show, cfqd->cfq_group_idle);
|
||||
USEC_SHOW_FUNCTION(cfq_slice_sync_us_show, cfqd->cfq_slice[1]);
|
||||
USEC_SHOW_FUNCTION(cfq_slice_async_us_show, cfqd->cfq_slice[0]);
|
||||
USEC_SHOW_FUNCTION(cfq_target_latency_us_show, cfqd->cfq_target_latency);
|
||||
#undef USEC_SHOW_FUNCTION
|
||||
|
||||
#define STORE_FUNCTION(__FUNC, __PTR, MIN, MAX, __CONV) \
|
||||
static ssize_t __FUNC(struct elevator_queue *e, const char *page, size_t count) \
|
||||
{ \
|
||||
|
@ -4724,6 +4739,26 @@ STORE_FUNCTION(cfq_low_latency_store, &cfqd->cfq_latency, 0, 1, 0);
|
|||
STORE_FUNCTION(cfq_target_latency_store, &cfqd->cfq_target_latency, 1, UINT_MAX, 1);
|
||||
#undef STORE_FUNCTION
|
||||
|
||||
#define USEC_STORE_FUNCTION(__FUNC, __PTR, MIN, MAX) \
|
||||
static ssize_t __FUNC(struct elevator_queue *e, const char *page, size_t count) \
|
||||
{ \
|
||||
struct cfq_data *cfqd = e->elevator_data; \
|
||||
unsigned int __data; \
|
||||
int ret = cfq_var_store(&__data, (page), count); \
|
||||
if (__data < (MIN)) \
|
||||
__data = (MIN); \
|
||||
else if (__data > (MAX)) \
|
||||
__data = (MAX); \
|
||||
*(__PTR) = (u64)__data * NSEC_PER_USEC; \
|
||||
return ret; \
|
||||
}
|
||||
USEC_STORE_FUNCTION(cfq_slice_idle_us_store, &cfqd->cfq_slice_idle, 0, UINT_MAX);
|
||||
USEC_STORE_FUNCTION(cfq_group_idle_us_store, &cfqd->cfq_group_idle, 0, UINT_MAX);
|
||||
USEC_STORE_FUNCTION(cfq_slice_sync_us_store, &cfqd->cfq_slice[1], 1, UINT_MAX);
|
||||
USEC_STORE_FUNCTION(cfq_slice_async_us_store, &cfqd->cfq_slice[0], 1, UINT_MAX);
|
||||
USEC_STORE_FUNCTION(cfq_target_latency_us_store, &cfqd->cfq_target_latency, 1, UINT_MAX);
|
||||
#undef USEC_STORE_FUNCTION
|
||||
|
||||
#define CFQ_ATTR(name) \
|
||||
__ATTR(name, S_IRUGO|S_IWUSR, cfq_##name##_show, cfq_##name##_store)
|
||||
|
||||
|
@ -4734,12 +4769,17 @@ static struct elv_fs_entry cfq_attrs[] = {
|
|||
CFQ_ATTR(back_seek_max),
|
||||
CFQ_ATTR(back_seek_penalty),
|
||||
CFQ_ATTR(slice_sync),
|
||||
CFQ_ATTR(slice_sync_us),
|
||||
CFQ_ATTR(slice_async),
|
||||
CFQ_ATTR(slice_async_us),
|
||||
CFQ_ATTR(slice_async_rq),
|
||||
CFQ_ATTR(slice_idle),
|
||||
CFQ_ATTR(slice_idle_us),
|
||||
CFQ_ATTR(group_idle),
|
||||
CFQ_ATTR(group_idle_us),
|
||||
CFQ_ATTR(low_latency),
|
||||
CFQ_ATTR(target_latency),
|
||||
CFQ_ATTR(target_latency_us),
|
||||
__ATTR_NULL
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue