diff options
Diffstat (limited to 'block/deadline-iosched.c')
| -rw-r--r-- | block/deadline-iosched.c | 116 |
1 files changed, 27 insertions, 89 deletions
diff --git a/block/deadline-iosched.c b/block/deadline-iosched.c index 27e494b1bf97..399fa1e60e1f 100644 --- a/block/deadline-iosched.c +++ b/block/deadline-iosched.c | |||
| @@ -694,11 +694,6 @@ deadline_set_request(request_queue_t *q, struct request *rq, struct bio *bio, | |||
| 694 | /* | 694 | /* |
| 695 | * sysfs parts below | 695 | * sysfs parts below |
| 696 | */ | 696 | */ |
| 697 | struct deadline_fs_entry { | ||
| 698 | struct attribute attr; | ||
| 699 | ssize_t (*show)(struct deadline_data *, char *); | ||
| 700 | ssize_t (*store)(struct deadline_data *, const char *, size_t); | ||
| 701 | }; | ||
| 702 | 697 | ||
| 703 | static ssize_t | 698 | static ssize_t |
| 704 | deadline_var_show(int var, char *page) | 699 | deadline_var_show(int var, char *page) |
| @@ -716,23 +711,25 @@ deadline_var_store(int *var, const char *page, size_t count) | |||
| 716 | } | 711 | } |
| 717 | 712 | ||
| 718 | #define SHOW_FUNCTION(__FUNC, __VAR, __CONV) \ | 713 | #define SHOW_FUNCTION(__FUNC, __VAR, __CONV) \ |
| 719 | static ssize_t __FUNC(struct deadline_data *dd, char *page) \ | 714 | static ssize_t __FUNC(elevator_t *e, char *page) \ |
| 720 | { \ | 715 | { \ |
| 721 | int __data = __VAR; \ | 716 | struct deadline_data *dd = e->elevator_data; \ |
| 717 | int __data = __VAR; \ | ||
| 722 | if (__CONV) \ | 718 | if (__CONV) \ |
| 723 | __data = jiffies_to_msecs(__data); \ | 719 | __data = jiffies_to_msecs(__data); \ |
| 724 | return deadline_var_show(__data, (page)); \ | 720 | return deadline_var_show(__data, (page)); \ |
| 725 | } | 721 | } |
| 726 | SHOW_FUNCTION(deadline_readexpire_show, dd->fifo_expire[READ], 1); | 722 | SHOW_FUNCTION(deadline_read_expire_show, dd->fifo_expire[READ], 1); |
| 727 | SHOW_FUNCTION(deadline_writeexpire_show, dd->fifo_expire[WRITE], 1); | 723 | SHOW_FUNCTION(deadline_write_expire_show, dd->fifo_expire[WRITE], 1); |
| 728 | SHOW_FUNCTION(deadline_writesstarved_show, dd->writes_starved, 0); | 724 | SHOW_FUNCTION(deadline_writes_starved_show, dd->writes_starved, 0); |
| 729 | SHOW_FUNCTION(deadline_frontmerges_show, dd->front_merges, 0); | 725 | SHOW_FUNCTION(deadline_front_merges_show, dd->front_merges, 0); |
| 730 | SHOW_FUNCTION(deadline_fifobatch_show, dd->fifo_batch, 0); | 726 | SHOW_FUNCTION(deadline_fifo_batch_show, dd->fifo_batch, 0); |
| 731 | #undef SHOW_FUNCTION | 727 | #undef SHOW_FUNCTION |
| 732 | 728 | ||
| 733 | #define STORE_FUNCTION(__FUNC, __PTR, MIN, MAX, __CONV) \ | 729 | #define STORE_FUNCTION(__FUNC, __PTR, MIN, MAX, __CONV) \ |
| 734 | static ssize_t __FUNC(struct deadline_data *dd, const char *page, size_t count) \ | 730 | static ssize_t __FUNC(elevator_t *e, const char *page, size_t count) \ |
| 735 | { \ | 731 | { \ |
| 732 | struct deadline_data *dd = e->elevator_data; \ | ||
| 736 | int __data; \ | 733 | int __data; \ |
| 737 | int ret = deadline_var_store(&__data, (page), count); \ | 734 | int ret = deadline_var_store(&__data, (page), count); \ |
| 738 | if (__data < (MIN)) \ | 735 | if (__data < (MIN)) \ |
| @@ -745,83 +742,24 @@ static ssize_t __FUNC(struct deadline_data *dd, const char *page, size_t count) | |||
| 745 | *(__PTR) = __data; \ | 742 | *(__PTR) = __data; \ |
| 746 | return ret; \ | 743 | return ret; \ |
| 747 | } | 744 | } |
| 748 | STORE_FUNCTION(deadline_readexpire_store, &dd->fifo_expire[READ], 0, INT_MAX, 1); | 745 | STORE_FUNCTION(deadline_read_expire_store, &dd->fifo_expire[READ], 0, INT_MAX, 1); |
| 749 | STORE_FUNCTION(deadline_writeexpire_store, &dd->fifo_expire[WRITE], 0, INT_MAX, 1); | 746 | STORE_FUNCTION(deadline_write_expire_store, &dd->fifo_expire[WRITE], 0, INT_MAX, 1); |
| 750 | STORE_FUNCTION(deadline_writesstarved_store, &dd->writes_starved, INT_MIN, INT_MAX, 0); | 747 | STORE_FUNCTION(deadline_writes_starved_store, &dd->writes_starved, INT_MIN, INT_MAX, 0); |
| 751 | STORE_FUNCTION(deadline_frontmerges_store, &dd->front_merges, 0, 1, 0); | 748 | STORE_FUNCTION(deadline_front_merges_store, &dd->front_merges, 0, 1, 0); |
| 752 | STORE_FUNCTION(deadline_fifobatch_store, &dd->fifo_batch, 0, INT_MAX, 0); | 749 | STORE_FUNCTION(deadline_fifo_batch_store, &dd->fifo_batch, 0, INT_MAX, 0); |
| 753 | #undef STORE_FUNCTION | 750 | #undef STORE_FUNCTION |
| 754 | 751 | ||
| 755 | static struct deadline_fs_entry deadline_readexpire_entry = { | 752 | #define DD_ATTR(name) \ |
| 756 | .attr = {.name = "read_expire", .mode = S_IRUGO | S_IWUSR }, | 753 | __ATTR(name, S_IRUGO|S_IWUSR, deadline_##name##_show, \ |
| 757 | .show = deadline_readexpire_show, | 754 | deadline_##name##_store) |
| 758 | .store = deadline_readexpire_store, | 755 | |
| 759 | }; | 756 | static struct elv_fs_entry deadline_attrs[] = { |
| 760 | static struct deadline_fs_entry deadline_writeexpire_entry = { | 757 | DD_ATTR(read_expire), |
| 761 | .attr = {.name = "write_expire", .mode = S_IRUGO | S_IWUSR }, | 758 | DD_ATTR(write_expire), |
| 762 | .show = deadline_writeexpire_show, | 759 | DD_ATTR(writes_starved), |
| 763 | .store = deadline_writeexpire_store, | 760 | DD_ATTR(front_merges), |
| 764 | }; | 761 | DD_ATTR(fifo_batch), |
| 765 | static struct deadline_fs_entry deadline_writesstarved_entry = { | 762 | __ATTR_NULL |
| 766 | .attr = {.name = "writes_starved", .mode = S_IRUGO | S_IWUSR }, | ||
| 767 | .show = deadline_writesstarved_show, | ||
| 768 | .store = deadline_writesstarved_store, | ||
| 769 | }; | ||
| 770 | static struct deadline_fs_entry deadline_frontmerges_entry = { | ||
| 771 | .attr = {.name = "front_merges", .mode = S_IRUGO | S_IWUSR }, | ||
| 772 | .show = deadline_frontmerges_show, | ||
| 773 | .store = deadline_frontmerges_store, | ||
| 774 | }; | ||
| 775 | static struct deadline_fs_entry deadline_fifobatch_entry = { | ||
| 776 | .attr = {.name = "fifo_batch", .mode = S_IRUGO | S_IWUSR }, | ||
| 777 | .show = deadline_fifobatch_show, | ||
| 778 | .store = deadline_fifobatch_store, | ||
| 779 | }; | ||
| 780 | |||
| 781 | static struct attribute *default_attrs[] = { | ||
| 782 | &deadline_readexpire_entry.attr, | ||
| 783 | &deadline_writeexpire_entry.attr, | ||
| 784 | &deadline_writesstarved_entry.attr, | ||
| 785 | &deadline_frontmerges_entry.attr, | ||
| 786 | &deadline_fifobatch_entry.attr, | ||
| 787 | NULL, | ||
| 788 | }; | ||
| 789 | |||
| 790 | #define to_deadline(atr) container_of((atr), struct deadline_fs_entry, attr) | ||
| 791 | |||
| 792 | static ssize_t | ||
| 793 | deadline_attr_show(struct kobject *kobj, struct attribute *attr, char *page) | ||
| 794 | { | ||
| 795 | elevator_t *e = container_of(kobj, elevator_t, kobj); | ||
| 796 | struct deadline_fs_entry *entry = to_deadline(attr); | ||
| 797 | |||
| 798 | if (!entry->show) | ||
| 799 | return -EIO; | ||
| 800 | |||
| 801 | return entry->show(e->elevator_data, page); | ||
| 802 | } | ||
| 803 | |||
| 804 | static ssize_t | ||
| 805 | deadline_attr_store(struct kobject *kobj, struct attribute *attr, | ||
| 806 | const char *page, size_t length) | ||
| 807 | { | ||
| 808 | elevator_t *e = container_of(kobj, elevator_t, kobj); | ||
| 809 | struct deadline_fs_entry *entry = to_deadline(attr); | ||
| 810 | |||
| 811 | if (!entry->store) | ||
| 812 | return -EIO; | ||
| 813 | |||
| 814 | return entry->store(e->elevator_data, page, length); | ||
| 815 | } | ||
| 816 | |||
| 817 | static struct sysfs_ops deadline_sysfs_ops = { | ||
| 818 | .show = deadline_attr_show, | ||
| 819 | .store = deadline_attr_store, | ||
| 820 | }; | ||
| 821 | |||
| 822 | static struct kobj_type deadline_ktype = { | ||
| 823 | .sysfs_ops = &deadline_sysfs_ops, | ||
| 824 | .default_attrs = default_attrs, | ||
| 825 | }; | 763 | }; |
| 826 | 764 | ||
| 827 | static struct elevator_type iosched_deadline = { | 765 | static struct elevator_type iosched_deadline = { |
| @@ -840,7 +778,7 @@ static struct elevator_type iosched_deadline = { | |||
| 840 | .elevator_exit_fn = deadline_exit_queue, | 778 | .elevator_exit_fn = deadline_exit_queue, |
| 841 | }, | 779 | }, |
| 842 | 780 | ||
| 843 | .elevator_ktype = &deadline_ktype, | 781 | .elevator_attrs = deadline_attrs, |
| 844 | .elevator_name = "deadline", | 782 | .elevator_name = "deadline", |
| 845 | .elevator_owner = THIS_MODULE, | 783 | .elevator_owner = THIS_MODULE, |
| 846 | }; | 784 | }; |
